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