Expresii aritmetice - laboratorul 1b
1. Notiuni teoretice
Instructiuni folosite : 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.
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.
In urma instructiunilor :
mov al, 12
;12 = 0Ch
mov ah, 1
registrul ax va contine valoarea 268 (010Ch).
Declaratii de date : db (1 octet = 8 biti), dw (2 octeti = 16 biti), dd (4 octeti
= 32 biti).
Operatii aritmetice :
- adunari si scaderi : Putem folosi oricare dintre registrii, precum si variabile
auxiliare.
- instructiuni : add,adc,sub,sbb
Exemplu : Sa se efectueze e=a+b-c unde a,b,c sunt reprezentati pe 16 biti cu
semn
segmentul de date : a dw 2000
b db -4
c dw 12
e dw ?
segmentul de cod :
.....
mov al, b
cbw
; ax = b
mov si, a
add si, ax
; si = a+b
sub si,c
;si=a+b-c
mov e, si
....
- adunari si scaderi pe 32 de biti : Pentru numere reprezentate pe 32 de biti
nu avem instructiune de adunare/scadere corespunzatoare.
Vom efectua atunci operatia pe "fragmente" de 16 biti. Vom aduna astfel
cei 16 biti mai putin semnificativi din cei doi operanzi, apoi vom aduna cei
16 biti mai semnificativi impreuna cu bitul de transport de la "fragmentul"
precedent. Asemanator si in cazul scaderii, sau al mutarii ( mov) care nici
ea nu permite operanzi pe 32 de biti
Exemplu: Sa se efectueze e=a+b-c unde a,b,c sunt reprezentati pe 32 biti
segmentul de date :
a dd 1000000
b dd 1000001
c dd 1000000
e dd ?
segmentul de cod :
.....
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
.....
- unde :
word ptr a desemneaza un obiect din memorie, de 2 octeti (word) de la adresa
lui a (ptr a), cei mai putin semnificativi 16 biti din componenta lui a.
word ptr a+2 desemneaza un obiect din memorie, tot de 2 octeti (word) de la
adresa egala cu adresa lui a plus 2 (ptr a +2), adica al treilea si al patrulea
octet din a, adica cei mai semnificativi 16 biti.
add are ca efect retinerea transportului in bistabilul CF (carry flag).
adc aduna operanzii plus valoarea lui CF. De asemenea, noul transport generat
in urma adunarii este scris in CF.
- conversii de lungime : sunt necesare cand operanzii adunarii sau scaderii
nu au lungimile egale
- instructiuni utilizate : cbw,cwd
- lungirea reprezentarilor pentru numere fara semn se face prin completare cu
zerouri.
Exemplu : e=a-b+c, e,a - pe 16 biti, b,c pe 8 biti
segmentul de date :
a dw 120
b db 3
c db 4
e dw ?
segmentul de cod :
......
mov al, a
mov ah, 0
; ax = b - e valabil doar pt cazul cand b e pozitiv
sub ax, b
; ax = a-b
mov bx,ax
; bx=a-b
mov al,c
cbw
;ax=c - e valabil si daca c e negativ
add ax,bx
; ax=ax+bx=c+a-b
mov e, ax
.......
- inmultiri si impartiri : in acest caz trebuie avute in vedere restrictiile
de lungime, registrii specifici pentru unii operanzi si diferenta intre instructiunile
pentru numere reprezentate cu semn (imul si idiv) si fara semn (mul si div).
- instructiuni utile pentru inmultire : mul, imul ( pentru inmultire cu semn)
iar pentru impartire: div, idiv (cu semn)
Exemplu : Sa se efectueze e=(a*b-c)/d, e,a,b,c - reprezentate pe 16 biti cu
semn
segmentul de date :
....
a dw 100
b dw 50
c dw -25
d dw 5
e dw ?
.....
segmentul de cod :
.....
mov ax,a
imul b
; dx:ax = a*b
mov bx, dx
mov cx, ax
; bx:cx =a*b , avem nevoie de dx:ax pt. conversia lui 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
.....
OBS Pentru mai multe detalii consultati Norton Guide-ul.
--------------------------------------------------------------------------------
2.Exemplu de expresie aritmetica
; Sa se calculeze expresia aritmetica :
; e=((a+b*c-d)/f+g*h)/i
; Am considerat a,d,f - cuvant
; b,c,g,h,i -byte
; ca sa putem executa impartirea cu f convertim impartitorul la dublucuvant
; ne vor interesa doar caturile impartirilor
; rezultatul va fi de tip octet
assume cs:code,ds:data
data segment
a dw 5
b db 6
c db 10
d dw 5
f dw 6
g db 10
h db 11
i db 10
interm dw ?
rez db ?
data ends
code segment
incepe:
mov ax,data
mov ds,ax
mov al,b
imul c
; in ax avem b*c
add ax,a
; ax=b*c+a
sub ax,d
; ax=b*c+a-d
cwd
; am convertit cuvantul din ax , in dublu cuvantul , retinut in dx:ax
idiv f
; obtinem catul in ax
; si restul in dx
; ax=(a+b*c-d)/f
mov interm, ax
; interm=(a+b*c-d)/f
mov al,g
imul h
; ax=g*h
add ax, interm
;ax=(a+b*c-d)/f+g*h
idiv i
; obtinem catul in al si restul in ah
mov rez,al
mov ax, 4C00h
int 21h
code ends
end incepe
; Date de test : vom obtine rezultatul ((a+b*c-d)/f+g*h)/i=((5+6*10-5)/6+10*11)/10=12
--------------------------------------------------------------------------------
3. Cerinte la laborator:
Sa se calculeze expresiile :
1. z=1/(a*a+b*b-5)+2/(a*a-b*b+4)
2. z=a+b*b-(2/(b*b)/(1+(2/(b*b)))
3. z=(3+(c*c))/(6-(b*b))+((a*a-b*b)/(a*a+c*c))
4. z=(a*3+b*b*5)/(a*a+a*b)-a-b
5. z=(a+b+c+1) *(a+b+c+1) /((a-b+d)*(a-b+d))
6.z=(a-b*c/d)/(c+2-a/b)+5
7.z=(5*a-b/7)/(3/b+a*a)
8.z=(a+b+c+1)^3/(a-b*c+d)
9.z=((a+1)*(a+1)+2)^2/(b*b+c*c)
10.z=(a*a+b*b)/(a*a-b*b-5).
11. z=(5*a-b/7)/(3/b+a*a).
12.z=(2+1/a)/(3+1/(b*b))-1/(c*c)
13.z=((a+b)/c + 2*d)/e
14.z= ((a*c-b*d)/f +(a+b)*c/d)/h
15.z=((a+b*c-d)/f+h)/g