Übung Assembler 1 - Aufgabe 1
Bitte arbeitet im 1. Teil der Übung die folgende Beschreibung am Rechner nach :
Für den Pseudocodebefehl
steht der MOV-Befehl zur Verfügung
Dieser Befehl unterstützt diverse Adressierungsarten. Die einfachste Adressierungsart ist der Direktoperand, d.h. der zur Laufzeit verwendete Wert ist Bestandteil des Befehls. So wird beispielsweise mit
zur Laufzeit der Wert 0200 ins AX-Register geschrieben, oder mit
zur Laufzeit der Wert 41 ins DL-Register geschrieben.
Es soll nun ein Programm zur Zeichenausgabe entwickelt werden.
Dabei hilft die DOS-Funktion "Zeichen über die Standardausgabe ausgeben".
Wie (fast) alle DOS-Funktionen wird sie durch das Auslösen des Software-Interrupts 21 aufgerufen.
Im AH-Register wird der DOS-Funktionscode (hier 02) und im DL-Register der ASCII-Code des auszugebenden Zeichens erwartet.
Zunächst wird das Debug-Programm gestartet :
Anschließend wird vom Debug-Kommandomodus in den Assembliermodus gewechselt (der erste Befehl soll - oder besser muß - an der Adresse 0100 stehen)
Nun können die notwendigen Assemblerbefehle eingegeben werden :
MOV AH,02
MOV DL,41
INT 21
INT 20
Abschließend wird der Assembliermodus durch die Eingabe einer Leerzeile (einfach die RETURN-Taste drücken) zwecks Rückkehr in den Debug-Kommandomodus verlassen.
Mit dem Unassemble-Befehl kann die Byte- bzw. Bitfolge in die Assembler-Schreibweise disassembliert werden :
Nun soll noch eine COM-Datei entstehen, um das Programm zur Zeichenausgabe z.B. von der MSDOS-Eingabeaufforderung aus starten zu können.
Mit dem Name-Befehl wird der Programmname vergeben : Wähle ein anderes beschreibbares Verzeichnis sofern C:\WORK nicht zur Verfügung steht
Im Registerpaar BX:CX wird die Länge des Programms erwartet, die in unserem Beispiel 0008 Bytes beträgt (Der Unassemble-Befehl hilft bei der Ermittlung der Bytelänge).
Mit dem Register-Befehl können Registerinhalte betrachtet und verändert werden :
Mit dem Write-Befehl wird die COM-Datei auf der Festplatte angelegt :
Der Quit-Befehl beendet das Debug-Programm :
Durch Eingabe von C:\WORK\CHAR auf der MSDOS-Eingabeaufforderung wird das Programm zur Zeichenausgabe gestartet.
Das Debug-Programm liest ausschließlich von der Standardeingabe und
schreibt ausschließlich auf die Standardausgabe. Daher können
die obigen Eingaben auch mit dem persönlich bevorzugten Editor
z.B. in der Datei C:\WORK\CHAR.DBG hinterlegt werden
A 0100
MOV AH,02
MOV DL,41
INT 21
INT 20
N C:\WORK\CHAR.COM
R BX
0000
R CX
0008
W
Q
um anschließend per Umlenkung der Standardeingabe dem Debug-Programm
als Eingabe zu dienen :
Da die COM-Datei nur ein Abbild des Hauptspeichers darstellt, kann ihr Inhalt einfach mit
in das Debug-Programm geladen werden.
Bitte entwickelt im 2. Teil der Übung ein Programm (abgespeichert als COM-Datei MP1A.COM) folgender Funktionalität :
- Schreiben des Wertes 1004 in das AX-Register
- Schreiben des Wertes 1204 in das BX-Register
- Schreiben des Wertes 34 in das DL-Register
- Subtrahieren des Inhalts des AX-Registers vom Inhalt des BX-Registers
- Kopieren des Inhalts des BX-Registers in das AX-Register
- Auslösen des Software-Interrupts 21
- Schreiben des Wertes 32 in das DL-Register
- Auslösen des Software-Interrupts 21
- Auslösen des Software-Interrupts 20
Was macht das Programm überhaupt ?
Die bei der Benutzung des Debug-Programms getätigten Eingaben
sollen in der Datei MP1A.DBG hinterlegt werden.
Bitte entwickelt im 3. Teil der Übung ein Programm (abgespeichert als COM-Datei MP1B.COM) folgender Funktionalität :
- Schreiben des Wertes DB in das BL-Register
- Schreiben des Wertes 8 in das CX-Register
- Rotieren des BL-Registers um eine Stelle nach links über das Carry-Bit
- Schreiben des Wertes 30 in das DL-Register
- Addieren des Carry-Bits zum DL-Register
- Schreiben des Wertes 2 in das AH-Register
- Auslösen des Software-Interrupts 21
- Dekrementieren des CX-Registers um den Wert 1 und Rücksprung zum "Rotieren des BL-Registers" falls das CX-Register nach dem Dekrementieren nicht den Wert 0 enthält
- Auslösen des Software-Interrupts 20
Was macht das Programm überhaupt ?
Die bei der Benutzung des Debug-Programms getätigten Eingaben
sollen in der Datei MP1B.DBG hinterlegt werden.
Im 4. und letzten Teil der Übung wird der Abstraktionsgrad gegenüber den vorherigen Teilen ein wenig gesteigert :
Entwickle mit dem Tool DEBUG ein COM-Programm zur Ausgabe des Alphabets in folgendem Format :
A * B * C * D * E * F * G * H * I * J * K * L * M * N * O * P * Q * R * S * T * U * V * W * X * Y * Z
Die Ausgabe des Alphabets mittels der DOS-Funktion "Zeichenkettenausgabe" (DOS-Funktionscode : 09) gilt als unzulässig.
Gesucht ist vielmehr eine geeignete Schleife, in der u.a. die DOS-Funktion "Zeichenausgabe" (DOS-Funktionscode : 02) aufgerufen wird.
Beachte ferner, das sich weder vor dem ersten noch hinter dem letzten Buchstaben ein Sternchen befindet.
Der Alphabetausgabe soll ein mittels DOS-Funktion "Zeichenkettenausgabe" (DOS-Funktionscode : 09) ausgegebener Begrüßungstext vorangehen.
Ein Zeilenwechsel ist durch die Ausgabe der Zeichen CarriageReturn (ASCII-Code : 0D) und LineFeed (ASCII-Code : 0A) möglich.
Alle für die Erstellung des COM-Programms mit dem Tool DEBUG notwendigen Eingaben sind in der Datei MP1C.DBG zu hinterlegen.
Zur Verdeutlichung der Funktionalität mag eine vorherige Implementierung mit Turbo Pascal hilfreich sein.
Als weitere Hilfe möge die nachfolgende Zusammenstellung der meisten in den ersten zwei Vorlesungsvormittagen behandelten (vereinfacht dargestellten) Befehlsformate dienen :
MOV Register,Direktoperand |
MOV Register,Register |
ADD Register,Direktoperand |
ADD Register,Register |
ADC Register,Direktoperand |
ADC Register,Register |
SUB Register,Direktoperand |
SUB Register,Register |
SBB Register,Direktoperand |
SBB Register,Register |
MUL Register |
|
DIV Register |
|
INT Nummer |
|
RCL Register,1 |
|
RCR Register,1 |
|
STC |
|
CLC |
|
CMC |
|
LOOP Adresse |
|
CMP Register,Direktoperand |
CMP Register,Register |
JE/JNE Adresse |
|
JL/JLE/JGE/JG Adresse |
|
JB/JBE/JAE/JA Adresse |
|
JMP Adresse |
|
Stand: 31.10.2005 (Birger Wolter)