NEU: RA1 Praktika zur Vorbereitung
This commit is contained in:
264
Rechnerarchitekturen 1 - Praktikum A1.tex
Normal file
264
Rechnerarchitekturen 1 - Praktikum A1.tex
Normal file
@@ -0,0 +1,264 @@
|
||||
\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}
|
||||
Reference in New Issue
Block a user