Gründe für Assembler

Einige Voraussetzungen für diese Veranstaltung

8086 und Speicher

Unterteilung des Speichers in 64 KB große Einheiten (Segmente)

Bildung einer physikalischen Adresse:

Segmentadresse (Bit 15-0) Segmentadresse = Segmentanfang
Segmentadresse * 16 (Bit 19-0) Verschiebung Segmentregister im Adressrechenwerk
plus Offsetadresse (Bit 15-0) Offsetadresse = Distanz (Offset) vom Segmentanfang
gleich physikalische Adresse (Bit 19-0) auf Adressbus des Rechners

Merke: Physikalische Adresse := Segmentadresse * 16 + Offsetadresse

Adressbereich: 220 Bytes = 1 MB

CS: Codesegment; Segmentadresse
IP: Instruction Pointer, Befehlszeiger; Offsetadresse
IP zeigt gemeinsam mit CS auf den nächsten auszuführenden Befehl

Addition und Subtraktion mit dem 8086

Datenregister: AX, BX, CX, DX (Registerbreite: 16 Bit)

ADD AX,BX  (AX:=AX+BX)

0 1 D 8 Maschinensprache
00000001xxxxxxxx Addiere Wörter
xxxxxxxx11xxxxxx Zwei Registeroperanden
xxxxxxxxxx011xxx Quellregister BX
xxxxxxxxxxxxx000 Zielregister AX

SUB AX,BX  (AX:=AX-BX)

2 9 D 8 Maschinensprache
00101001xxxxxxxx Subtrahiere Wörter
xxxxxxxx11xxxxxx Zwei Registeroperanden
xxxxxxxxxx011xxx Quellregister BX
xxxxxxxxxxxxx000 Zielregister AX

AX Register
1. Hexziffer 2. Hexziffer 3. Hexziffer 4. Hexziffer  
AH AL Halbregister

ADD AL,BL  (AL:=AL+BL)

0 0 D 8 Maschinensprache
00000000xxxxxxxx Addiere Bytes
xxxxxxxx11xxxxxx Zwei Registeroperanden
xxxxxxxxxx011xxx Quellregister BL
xxxxxxxxxxxxx000 Zielregister AL

ADD AH,BH  (AH:=AH+BH)

0 0 F C Maschinensprache
00000000xxxxxxxx Addiere Bytes
xxxxxxxx11xxxxxx Zwei Registeroperanden
xxxxxxxxxx111xxx Quellregister BH
xxxxxxxxxxxxx100 Zielregister AH

Debug kann Halbregister nicht modifizieren

Multiplikation und Division mit dem 8086 (vorzeichenlos)

MUL BX  (DX:AX:=AX*BX)
DX: Bits 31-16 des Produkts, AX: Bits 15-0 des Produkts
DX und AX bilden ein Registerpaar (DX:AX)

F 7 E 3 Maschinensprache
11110111xx100xxx Vorzeichenlose Wort-Multiplikation
xxxxxxxx11xxxxxx Multiplikator im Register
xxxxxxxxxxxxx011 BX-Register

DIV BX (AX:=DX:AX div BX, DX:=DX:AX mod BX)
Vor der Division:
DX: Bits 31-16 des Dividenden, AX: Bits 15-0 des Dividenden
DX und AX bilden ein Registerpaar (DX:AX)
Nach der Division:
AX: Ganzzahliges Divisionsergebnis, DX: Ganzzahliger Divisionsrest

F 7 F 3 Maschinensprache
11110111xx110xxx Vorzeichenlose Wort-Division
xxxxxxxx11xxxxxx Divisor im Register
xxxxxxxxxxxxx011 BX-Register

INT-Befehl (Softwareinterrupt auslösen)

INT nn  (Interruptnummer nn)

00 xxxx:yyyy
01 xxxx:yyyy
... xxxx:yyyy
1F xxxx:yyyy
20 xxxx:yyyy
21 xxxx:yyyy
22 xxxx:yyyy
... xxxx:yyyy
FE xxxx:yyyy
FF xxxx:yyyy
Interruptnummer Adresse der Interruptserviceroutine

INT 21  (DOS-Funktionsaufruf)

C D 2 1 Maschinensprache
11001101xxxxxxxx Softwareinterrupt
xxxxxxxx00100001 Interruptnummer

INT 20  (Programmende, nur COM-Format !)

C D 2 0 Maschinensprache
11001101xxxxxxxx Softwareinterrupt
xxxxxxxx00100000 Interruptnummer

MOV-Befehl (Wert kopieren)

MOV Operand1,Operand2  (Operand1:=Operand2)

Diverse Adressierungsarten
Einfachste Adressierungsart: Direktoperand (Der Operand ist Bestandteil des Befehls)

DOS-Funktion Zeichenausgabe

AH=02: Funktionscode; Zeichenausgabe
DL=nn: ASCII-Code nn des auszugebenden Zeichens

Programmbeispiel

Hinweis: Diese DOS-Funktion modifiziert irrtümlich das AL-Register !