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