Informatik/Rechnerarchitekturen 1 - Praktikum A1.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}