264 lines
9.8 KiB
TeX
264 lines
9.8 KiB
TeX
\documentclass[10pt, a4paper]{report}
|
|
\usepackage[utf8]{inputenc}
|
|
\usepackage[ngerman]{babel}
|
|
\usepackage{datetime}
|
|
\usepackage[]{amsmath}
|
|
\usepackage[]{amsthm}
|
|
\usepackage[]{amssymb}
|
|
\usepackage{listings}
|
|
\usepackage{xcolor}
|
|
\usepackage{fancyhdr}
|
|
|
|
\pagestyle{fancy}
|
|
\fancyhf{}
|
|
\lhead{Rechnerarchitekturen 1 - Praktikum A1 - WS 20/21}
|
|
\rfoot{Page \thepage}
|
|
|
|
\definecolor{codegreen}{rgb}{0,0.6,0}
|
|
\definecolor{codegray}{rgb}{0.5,0.5,0.5}
|
|
\definecolor{codepurple}{rgb}{0.58,0,0.82}
|
|
\definecolor{backcolour}{rgb}{0.95,0.95,0.92}
|
|
|
|
%Code listing style named "mystyle"
|
|
\lstdefinestyle{mystyle}{
|
|
backgroundcolor=\color{backcolour},
|
|
commentstyle=\color{codegreen},
|
|
keywordstyle=\color{magenta},
|
|
numberstyle=\tiny\color{codegray},
|
|
stringstyle=\color{codepurple},
|
|
basicstyle=\ttfamily\footnotesize,
|
|
breakatwhitespace=false,
|
|
breaklines=true,
|
|
captionpos=b,
|
|
keepspaces=true,
|
|
numbers=left,
|
|
numbersep=5pt,
|
|
showspaces=false,
|
|
showstringspaces=false,
|
|
showtabs=false,
|
|
tabsize=2
|
|
}
|
|
|
|
%"mystyle" code listing set
|
|
\lstset{style=mystyle}
|
|
|
|
\newdateformat{myformat}{\THEDAY{ten }\monthname[\THEMONTH], \THEYEAR}
|
|
|
|
\title{Rechnerarchitekturen 1 - Praktikum A1}
|
|
\date\today
|
|
\begin{document}
|
|
|
|
\section*{ Grundaufgabe a: Funktionen ermitteln}
|
|
\begin{lstlisting}[language=Assembler]
|
|
; Programmbereich:
|
|
anf: MOV EDX,400000H ;Groessee der Verzoegerung
|
|
MOV [verzoe],EDX ;Verzoegerung speichern
|
|
|
|
m1: MOV EDI,10 ;EDI=10
|
|
MOV ESI,OFFSET ziff ;Adresse von ziff in ESI
|
|
|
|
m2: MOV AL,[ESI+EDI-1] ;AL=ziff+9
|
|
OUT 0B0H,AL ;SiebenSegment schreibt AL
|
|
CALL zeit ;warten
|
|
DEC EDI ;EDI=EDI-1
|
|
JNZ m2 ;if(EDI!=0) goto m2
|
|
|
|
MOV AL,0FFH ;AL=255 (dec)
|
|
m3: OUT 5CH,AL ;LED Reihe links schreiben
|
|
NOT AL ;AL negieren
|
|
OUT 5DH,AL ;LED Reihe rechts schreiben
|
|
CALL zeit ;warten
|
|
MOV BL,AL ;Inhalt von AL wird noch gebraucht
|
|
IN AL,59H ;Tastenreihe rechts lesen auf AL
|
|
BT EAX,7 ;Bit 7 von EAX in Carry Flag
|
|
MOV AL,BL ;AL bekommt alten Wert zurueck
|
|
JC m1 ;if(m1==0) goto m1
|
|
JMP m3 ;goto m3 (Loop)
|
|
|
|
;zeit ist ein Unterprogramm, welches nur Zeit verbrauchen soll:
|
|
zeit: MOV ECX,[verzoe] ;Lade wartezeit
|
|
z1: DEC ECX ;ECX=ECX-1
|
|
JNZ z1 ;if(ECX!=0) goto z1
|
|
RET ;zurueck zum Hauptprogramm
|
|
|
|
; Datenbereich:
|
|
verzoe DD ? ;Eine Speicherzelle (Doppelwort)
|
|
ziff DB 3FH,03H,6DH,67H,53H,76H,7EH,23H,7FH,77H
|
|
\end{lstlisting}
|
|
|
|
\begin{description}
|
|
\item[anf] setzt die Länge der Wartezeit
|
|
\item[m1] Lädt Register
|
|
\item[m2] Zählt auf Sieben Segment Anzeige
|
|
\item[m3] schreibt auf LED Reihe links und invertierend rechts
|
|
\item[zeit] Verbraucht Zeit nach "verzoe"
|
|
\end{description}
|
|
|
|
\clearpage
|
|
|
|
\section*{ Grundaufgabe b: Programmentwurf}
|
|
\subsection*{einfaches Lauflicht}
|
|
auf der rechten LED-Reihe soll ein sichtbarer Lichtpunkt von links nach rechts laufen und immer wieder von links beginnen
|
|
|
|
\begin{lstlisting}[language=Assembler]
|
|
anf: MOV EDX,400000H
|
|
MOV [verzoe],EDX
|
|
|
|
MOV AL, 80H ;Startwert fuer LED Reihe
|
|
lauf: OUT 5CH, AL ;Wert auf LED Reihe schreiben
|
|
CALL zeit ;warten
|
|
ROR AL, 1 ;Bits um 1 nach rechts
|
|
JMP lauf ;Schleife wiederholen
|
|
|
|
zeit: MOV ECX,[verzoe]
|
|
z1: DEC ECX
|
|
JNZ z1
|
|
RET
|
|
\end{lstlisting}
|
|
|
|
|
|
|
|
\subsection*{Lauflicht mit Geschwindigkeitsumschalter}
|
|
das Lauflicht soll durch den linken Schalter zwischen "schnell" (Schalter oben) und "langsam" (Schalter unten) umschalten
|
|
|
|
\begin{lstlisting}[language=Assembler]
|
|
anf: MOV Al, 80H
|
|
|
|
lauf: MOV EDX, 400000H ; Wert fuer "langsam"
|
|
MOV [verzoe], EDX ;"langsam" in Speicher
|
|
OUT 5CH, AL ;LED Reihe schreiben
|
|
MOV BL, AL ;AL speichern
|
|
IN AL, 58H ;Schalter einlesen
|
|
BT AL, 7 ;7. Bit von AL in Carry Flag
|
|
JNC langsam ;Carry Flag = 0, schalter unten
|
|
MOV EDX, 200000H ; Wert fuer "schnell"
|
|
MOV [verzoe], EDX ;"schnell" in Speicher
|
|
CMC ;Carry Flag umschalten (0)
|
|
|
|
langsam: CALL zeit ;warten
|
|
MOV AL, BL ;AL aus speicher zurueck
|
|
ROR AL,1 ;Bits um 1 nach rechts
|
|
JMP anf ;Schleife wiederholen
|
|
|
|
zeit: MOV ECX,[verzoe]
|
|
z1: DEC ECX
|
|
JNZ z1
|
|
RET
|
|
\end{lstlisting}
|
|
|
|
\clearpage
|
|
|
|
\subsection*{Lauflicht verändert Richtung}
|
|
zusätzlich zum oben implementierten soll die Bewegungsrichtung des Lichtpunktes durch den rechten Schalter der Schalterreihe zwischen "nach links" und "nach rechts" wechseln.
|
|
|
|
\begin{lstlisting}[language=Assembler]
|
|
anf: MOV Al, 80H
|
|
lauf: MOV EDX, 400000H ; Wert fuer "langsam"
|
|
MOV [verzoe], EDX ;"langsam" in Speicher
|
|
OUT 5CH, AL ;LED Reihe schreiben
|
|
MOV BL, AL ;AL speichern
|
|
IN AL, 58H ;Schalter einlesen
|
|
BT AL, 7 ;7. Bit von AL in Carry Flag
|
|
JNC langsam ;Carry Flag = 0, Schalter unten
|
|
MOV EDX, 200000H ; Wert fuer "schnell"
|
|
MOV [verzoe], EDX ;"schnell" in Speicher
|
|
CMC ;Carry Flag umschalten
|
|
langsam: CALL zeit ;warten
|
|
MOV AL, BL ;AL aus speicher zurueck
|
|
BT AL, 0 ;0. Bit von AL in Carry Flag
|
|
JNC rechts ;Carry Flag = 1; Schalter oben
|
|
ROL AL,1 ;Bits um 1 nach links
|
|
CMC ;Carry Flag umschalten (0)
|
|
JMP anf ;Schleife wiederholen
|
|
rechts: ROR AL, 1 ;Bits um 1 nach rechts
|
|
JMP anf ;Schleife wiederholen
|
|
zeit: MOV ECX,[verzoe]
|
|
z1: DEC ECX
|
|
JNZ z1
|
|
RET
|
|
\end{lstlisting}
|
|
|
|
|
|
\subsection*{Lauflicht mit Invertierung}
|
|
durch drücken einer beliebigen Taste der blauen Tastenreihe wird die Anzeige invertiert, d.h. der Lichtpunkt ist dunkel etc. Invertierung nur solange die Taste gedrückt wird.
|
|
\begin{lstlisting}[language=Assembler]
|
|
anf: MOV Al, 80H
|
|
lauf: MOV EDX, 400000H ; Wert fuer "langsam"
|
|
MOV [verzoe], EDX ;"langsam" in Speicher
|
|
MOV BL, AL ;Kopie von AL anlegen
|
|
IN AL, 59H ;Tastenreihe einlesen
|
|
AND AL, FFH ;UND Operation mit FF
|
|
JZ nopress ;kein Schalter gedrueckt
|
|
NOT BL ;BL invertieren
|
|
MOV AL, BL ;AL ueberschreiben
|
|
nopress: OUT 5CH, AL ;LED Reihe schreiben
|
|
IN AL, 58H ;Schalter einlesen
|
|
BT AL, 7 ;7. Bit von AL in Carry Flag
|
|
JNC langsam ;Carry Flag = 0, Schalter unten
|
|
MOV EDX, 200000H ; Wert fuer "schnell"
|
|
MOV [verzoe], EDX ;"schnell" in Speicher
|
|
CMC ;Carry Flag umschalten
|
|
langsam: CALL zeit ;warten
|
|
MOV AL, BL ;AL aus speicher zurueck
|
|
BT AL, 0 ;0. Bit von AL in Carry Flag
|
|
JNC rechts ;Carry Flag = 1; Schalter oben
|
|
ROL AL,1 ;Bits um 1 nach links
|
|
CMC ;Carry Flag umschalten (0)
|
|
JMP anf ;Schleife wiederholen
|
|
rechts: ROR AL, 1 ;Bits um 1 nach rechts
|
|
JMP anf ;Schleife wiederholen
|
|
zeit: MOV ECX,[verzoe]
|
|
z1: DEC ECX
|
|
JNZ z1
|
|
RET
|
|
\end{lstlisting}
|
|
|
|
|
|
\subsection*{Zusatzaufgabe}
|
|
Erweiterungen des Programms nach eigenen Ideen:
|
|
\begin{itemize}
|
|
\item symetrische LED Reihe zur Mitte
|
|
\item Sieben Segment zählt 9 Schritte mit
|
|
\end{itemize}
|
|
\begin{lstlisting}[language=Assembler]
|
|
anf: MOV Al, 80H
|
|
MOV EDI, 0
|
|
MOV ESI, OFFSET ziff
|
|
lauf: MOV EDX, 400000H ; Wert fuer "langsam"
|
|
MOV [verzoe], EDX ;"langsam" in Speicher
|
|
MOV BL, AL ;Kopie von AL anlegen
|
|
IN AL, 59H ;Tastenreihe einlesen
|
|
AND AL, FFH ;UND Operation mit FF
|
|
JZ nopress ;kein Schalter gedrueckt
|
|
NOT BL ;BL invertieren
|
|
MOV AL, BL ;AL ueberschreiben
|
|
nopress: OUT 5CH,AL ;LED Reihe links schreiben
|
|
NOT AL ;AL negieren
|
|
OUT 5DH,AL ;LED Reihe rechts schreiben
|
|
MOV BH,[ESI+EDI-1] ;Sieben Segment berechnen
|
|
OUT 0B0H,BH ;Sieben Segment schreiben
|
|
DEC EDI ;Sieben Segment runterzaehlen
|
|
JZ timer ;Timer auf 0 setzen
|
|
IN AL, 58H ;Schalter einlesen
|
|
BT AL, 7 ;7. Bit von AL in Carry Flag
|
|
JNC langsam ;Carry Flag = 0, Schalter unten
|
|
MOV EDX, 200000H ; Wert fuer "schnell"
|
|
MOV [verzoe], EDX ;"schnell" in Speicher
|
|
CMC ;Carry Flag umschalten
|
|
langsam: CALL zeit ;warten
|
|
MOV AL, BL ;AL aus speicher zurueck
|
|
BT AL, 0 ;0. Bit von AL in Carry Flag
|
|
JNC rechts ;Carry Flag = 1; Schalter oben
|
|
ROL AL,1 ;Bits um 1 nach links
|
|
CMC ;Carry Flag umschalten (0)
|
|
JMP anf ;Schleife wiederholen
|
|
rechts: ROR AL, 1 ;Bits um 1 nach rechts
|
|
JMP anf ;Schleife wiederholen
|
|
timer: MOV BH, 0FFH
|
|
RET
|
|
zeit: MOV ECX,[verzoe]
|
|
z1: DEC ECX
|
|
JNZ z1
|
|
RET
|
|
\end{lstlisting}
|
|
\end{document} |