Arithmetische Ausdrücke

 

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.