Instructiuni folosite (a se vedea Norton Guide pentru detalii): mov, add, sub, cbw, cwd, adc, sbb, mul, imul, div, idiv.
Registrii de 8 biti: ah, al, bh, bl, ch, cl, dh, dl.
Registrii de 16 biti: ax, bx, cx, dx, si, di.
Atentie! Registrul ax este format prin juxtapunerea registrilor ah si al. Asta inseamna ca modificarea continutului unuia din registrii ah sau al conduce la modificarea bitilor corespunzatori din ax si reciproc. De exemplu, in urma instructiunilor
mov al, 10 ;10 = 0Ah mov ah, 1registrul ax va contine valoarea 266 (010Ah).
Declaratii de date: db (1 octet = 8 biti), dw (2 octeti = 16 biti), dd (4 octeti = 32 biti).
Putem folosi oricare dintre registrii numiti mai sus, precum si variabile auxiliare.
Exemplu: sa se evalueze expresia r=(a+b)-(c+d)-(e+20) unde toate veriabilele sunt reprezentate pe 16 biti cu semn.
Rezolvare
Date:
a dw 1000 b dw 500 c dw 20 d dw 300 e dw -300 r dw ?
Cod:
mov ax, a add ax, b ; ax = a+b mov si, c add si, d ; si = c+d sub ax, si ; ax = (a+b) - (c+d) mov si, e add si, 20 ; si = e+20 sub ax, si ; ax = (a+b) - (c+d) -(e+20) mov r, ax
Daca avem de adunat/scazut numere reprezentate pe 32 de biti (sau mai multi), nu avem instructiune de adunare/scadere corespunzatoare. In scopul efectuarii operatiei, vom aduna cate o "felie" de 16 biti o data. Astfel, vom aduna cei 16 biti mai putin semnificativi din cei doi operanzi, apoi vom aduna cei 16 biti mai semnificativi din cei doi operanzi impreuna cu transportul de la "felia" anterioara.
O a doua problema ce apare este faptul ca nu putem transfera 32 de biti o data.
Fie urmatorul exemplu: sa se calculeze r=a+b, unde r, a si b sunt reprezentate pe 32 de biti.
Rezolvare
Date:
a dd 1000000 b dd 500000 r dd ?
Cod:
mov ax, word ptr a mov dx, word ptr a +2 add ax, word ptr b adc dx, word ptr b+2 mov word ptr r, ax mov word ptr r+2, dx
Constructii folosite:
Exercitii
Daca operanzii pentru adunare si scadere nu au lungimile egale este necesara modificarea lungimii reprezentarii cel putin pentru unul dintre ei.
Lungirea reprezentarii pentru intregii cu semn se face cu ajutorul instructiunilor cbw si cwd. Lungirea reprezentarilor pentru numere fara semn se face prin completare cu zerouri.
Exemple
Rezolvare
Date:
a dw 2000 b db -4 r dw ?
Cod:
mov al, b cbw ; ax = b mov si, a sub si, ax ; si = a-b mov r, si
Rezolvare
Date:
a dw 2000 b db 4 r dw ?
Cod:
mov al, b mov ah, 0 ; ax = b add ax, b ; ax = a+b mov r, ax
Exercitii
Trebuie avute in vedere restrictiile de lungime, registrii specifici pentru unii operanzi, precum si diferenta intre instructiunile pentru numere reprezentate cu semn (imul si idiv) si fara semn (mul si div).
Exemplu
Sa se evalueze r=(a-b*c)/d, unde a, b, c, d, r vor fi reprezentate pe 16 biti cu semn.
Rezolvare
Date
a dw 1000 b dw -500 c dw 30000 d dw 10000 r dw ?
Cod
mov ax, b imul c ; dx:ax = b*c mov bx, dx mov cx, ax ; bx:cx = b*c , avem nevoie de dx:ax pt. conversia lui a mov ax, a cwd ; dx:ax = a sub ax, cx sbb dx, bx ; dx:ax = a-b*c idiv d ; ax = (a-b*c)/d mov r, ax