Übung 1

Starten Sie im 'ZENworks Application Window' den '8086 Assembler (DOSBox)'. Den nun angezeigte Hinweis bestätigen Sie und rufen die Entwicklungsumgebung folgendermaßen auf:

  • 8086 h:\prog1

Der Text prog1 ist bei neuen Programmen ein beliebiger Name ohne Erweiterung. Geben Sie mit dem Menüpunkt 0 (Editor) den Programmtext ein, assemblieren Sie das Programm mit Punkt 1 und linken Sie es mit Punkt 2. Starten Sie dann Punkt 3 und überprüfen Sie die Richtigkeit Ihres Programmes mit dem Debugger. Wählen Sie im Debugger den Menüpunkt View und darin z.B. CPU oder Register. Arbeiten Sie die Programme jeweils im Schrittbetrieb (F8-Taste) ab und prüfen Sie, ob die Registerinhalte bzw. Speicherbereiche die richtigen Werte enthalten. Nutzen Sie für diese Übung nur den Befehlssatz des 8086.

1. Geben Sie folgenden Programmtext ein:

.model small
.stack 100h
.data
meldung db 'Mein erstes Assemblerprogramm$'
.code
start:mov ax, @data
    mov ds, ax
    mov ah, 9
    mov dx, offset meldung
    int 21h
    mov ah, 4ch
    int 21h
    end start

2. Addition

Laden Sie ax mit 16 und bx mit 32, addieren Sie beide Zahlen.

3. Addition und Überlauf

Laden Sie ax mit 65535 und bx mit 65535, addieren Sie beide Zahlen. Mit welchem Flagbit kann der Überlauf des Zahlenbereichs erkannt werden?

4. Subtraktion

Laden Sie ax mit 31 und bx mit 31, subtrahieren Sie beide Zahlen voneinander. An welchem Flagbit kann erkannt werden, daß das Ergebnis 0 ist?

5. 8-Bit-Multiplikation

Multiplizieren Sie die Zahlen 400 und 200. In welche Register müssen die Zahlen geladen werden und wo steht das Ergebnis?

6. 16-Bit-Multiplikation

Multiplizieren Sie die Zahlen 0FFFFh und 4h. In welchen Registern steht jetzt das Ergebnis. Mit welchen Registern wird angezeigt, daß jetzt zwei 16-Bit/Register das Ergebnis darstellen?

7. Nutzung des Stack

Laden Sie ax mit 1000h, kellern Sie ax mit dem PUSH-Befehl in den Stack ein, der Stack-Pointer muß sich jetzt verändern, laden Sie ax jetzt mit einem anderen Wert, mit dem Befehl pop ax holen Sie den abgelegten Wert wieder aus dem Stack.

8. Vergleich von zwei Zahlen

Vergleichen Sie zwei 16-Bit-Integer-Zahlen mit Hilfe des CMP-Befehls. In welche Register können die Werte z.B. geladen werden? Wiederholen Sie den Test für alle drei Fälle (Ziel größer, gleich, kleiner als Quelle).

Flagbeeinflussung
S-Flag (Sign)Z-Flag (Zero)C-Flag(Carry)Bemerkung
101Ziel < Quelle
010Ziel = Quelle
000Ziel > Quelle

9. Division

Mit Hilfe des DIV-Befehls rechnen Sie folgende Aufgaben:

  • 20 : 5
  • 7000:10
  • 24:5    In welchem Register steht der Rest?

10. Logische Befehle

Führen Sie folgende logische Operationen aus (mit binärer Zahlenschreibweise):
0101 1001b  AND  1111 1000b
0101 1101b  OR   1001 1011b

11. Bitschiebe- und Rotationsbefehle

Gegeben sei die Zahl 0111 0010b. Verschieben Sie die Bits

  • um eine Stelle nach links,
  • um zwei Stellen nach rechts. Welchen arithmetischen Operationen entspricht das?

Rotieren Sie die Bits unter Einbeziehung des Carry-Flags

  • um eine Stelle nach links,
  • um eine Stelle nach rechts.

Hinweis: Das Carry-Flag kann dann von bedingten Sprungbefehlen ausgewertet werden (z.B. JC oder JNC)

12. Schreiben Sie ein Programm mit folgendem Inhalt und wählen Sie die Register selbst aus.

Zwei Zahlen, die Sie selbst wählen, sollen verglichen werden,

  • ist a = b sollen sie addiert werden,
  • ist a > b sollen sie subtrahiert werden,
  • ist a < b sollen sie auch addiert werden.

13. Zusatzaufgabe:

Schreiben Sie ein Programm, das eine 32-Bit-Zahl mit einer 16-Bit-Zahl multipliziert. Da wiederum nur der Befehlssatz des 8086 verwendet werden soll, ist die 32-Bit-Zahl aufzuteilen, z.B. so (Vereinbarung im Datensegment):

  • faktor2h dw 0    ;enthält höherwertigen Teil der 32-Bit-Zahl
  • faktor2n dw 0    ;enthält niederwertigen Teil der 32-Bit-Zahl

Überlegen Sie sich ob Sie eventuell noch weitere Daten im Datensegment ablegen müssen, z.B. für Zwischenergebnisse.

keyboard_arrow_up