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