\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}