benützte Befehle: mov, add, sub, cbw, cwd, adc,
sbb, mul, imul, div,
idiv
8 Bit Register : ah, al, bh, bl, ch, cl,
dh, dl.
16 Bit Register : ax, bx, cx, dx,
si, di.
Die allgemeine Register (ax,bx,cx,dx) lassen
sich in zwei 8 Bit breite
Register teilen. Z. B. al ist der niederwertige Registerteil von ax
und ah der
höherwertige Registerteil. Das heißt, wenn
der Wert von
ah oder
al verändert ist, wird sich auch
ax ändern, und umgekehrt.
Nach den folgenden
Befehle:
mov al,
12 ;12 = 0Ch
mov ah,
1
wird der Wert vom Register ax 268
(010Ch).
Variablendeklaration: db (1 Oktett = 8 Bits),
dw
(2 Oktette = 16 Bits),
dd
(4 Oktette = 32 Bits).
Aritmetische Operationen:
- Addition und Subtraktion: dafür kann jeder
(von den oben angeführten)
Register und auch noch auxiliare
Variablen benützt werden.
- Befehle: add,adc,sub,sbb
Beispiel: rechnen
wir e=a+b-c aus, wo
a und c auf 16 Bits, bzw. b
auf
8 Bits, als Zahlen
mit Vorzeichen dargestellt sind.
das Datensegment:
a dw 2000
b db -4
c dw 12
e dw ?
das Codesegment:
.....
mov al,b
cbw ; ax = b
mov bx, a
add bx,
ax ; bx =
a+b
sub bx,c ; bx=a+b-c
mov e, bx
....
- Addition und Subtraktion auf 32
Bits:
Wir haben
keine Befehle für Addition/Subtraktion die mit, auf 32 Bit
dargestellte
Zahlen handeln. Deswegen werden wir die Operation in
zwei 16
Bit Teile ausführen. Wir werden zuerst
die niederwertigen
16 Bits vom Operanden
addieren, danach die zwei hochwertige 16 Bits
und noch
den Übertrag vom vorigen Operation addieren.
Auf ähnlicher Weise
kann man im Fall der Subtraktion oder
Datentransport (mov) verfahren.
Beispiel: Rechnen
wir e=a+b-c aus, wo a,b,c auf 32 Bits dargestellt
sind.
das Datensegment:
a dd
1000000
b dd
1000001
c dd
1000000
e dd
?
das Codesegment:
.....
mov ax,
word ptr a
mov dx, word ptr a +2
add ax, word ptr
b
adc dx, word ptr b+2
sub ax, word ptr
c
sbb dx, word ptr c+2
mov word ptr e, ax
mov word ptr e+2, dx
.....
- 'word ptr a' bezeichnet
eine Speicherstelle von 2 Oktette (Wort)
von der Adresse der a (ptr a), die niederwertigen 16
Bits der
Variable a.
- word ptr
a+2 bezeichnet auch eine Speicherstelle von 2 Oktette
(Wort) von einer
Adresse die der Adresse von a plus 2 (ptr a +2)
entspricht,
d.h. das dritte und vierte Oktett von a (die
höcherwertige
16 Bits von a).
- bei der Operation add wird der Übertrag im
CF (carry flag) gespeichert.
- adc addiert die zwei operanden und noch den Wert von
CF.
Auf ähnlicher Weise
wird der neue Übertrag im
CF gespeichert
- Konversionsbefehle: man braucht sie wenn
die zwei operanden
der Addition oder Subtraktion nicht von gleicher Größe sind.
- benützte
befehle: cbw,cwd
- die Erweiterung für die Darstellung einer vorzeichenlose Zahl wird
durch Ergänzung mit 0-s durchgeführt.
Beispiel : e=a-b+c, e,a
- sind auf 16 Bits, b,c auf
8 Bits dargestellt.
das Datensegment:
a dw 120
b db 3
c db 4
e dw ?
das Codesegment:
......
mov al, b
mov ah,
0 ; ax = b - das
ist gültig nur für den Fall wenn b positiv ist
sub ax, b ; ax = a-b
mov bx,ax ; bx=a-b
mov al,c
cbw ;
ax=c - das ist gültig auch wenn
c negativ ist
add ax,bx ; ax=ax+bx=c+a-b
mov e, ax
.......
- Multiplikation und Division:
In diesem Fall
soll man die Anforderungen der Länge beachten,
den festgelegte
Register für bestimmte Operanden und den
Unterschied zwischen
den Befehlen für Zahlen mit Vorzeichen
(imul, idiv)
und ohne Vorzeichen (mul und div).
- Benützte Befehle
für Multiplikation: mul, imul (für
Multiplikation
mit Vorzeichen), und für Division: div, idiv (mit Vorzeichen)
Beispiel : rechnen wir
e=(a*b-c)/d aus, e,a,b,c -
auf 16 Bits mit
Vorzeichen dargestellt.
das Datensegment:
....
a dw 100
b dw 50
c dw -25
d dw 5
e dw ?
.....
das Codesegment:
.....
mov ax,a
imul b ; dx:ax = a*b
mov bx, dx
mov cx, ax ; bx:cx =a*b , wir brauchen dx:ax für die Erweiterung von c
mov ax, c
cwd ;
dx:ax = c
sub ax, cx
sbb dx, bx ; dx:ax = a*b-c
idiv d ;
ax = (a*b-c)/d
mov e, ax
.....
Bemerkung: mehr
Information -> in Norton Guide.