CATEGORII DOCUMENTE |
Operatii aritmetice
Exista urmatoarele tipuri de operatii efectuate de ALU:
aritmetice;
logice;
deplasari si rotatii;
Toate acestea afecteaza corespunzator unul sau mai multi din urmatorii indicatori de conditii:
CF (Carry Flag) - indicator de transport -reflecta transportul in exterior al bitului cel mai semnificativ al rezultatului operatiilor aritmetice.Acest indicator poate fi folosit in cazul adunarii sau scaderii numerelor pe mai multi octeti, semnificind in primul caz transport la adunare si in al doilea caz imprumut la scadere. Indicatorul CF nu este modificat de instructiuni de incrementare si decrementare.
PF (Parity Flag) -indicator de paritate - este pozitionat pe 1 daca rezultatul are un numar par de biti 1.
AF (Auxiliary Carry Flag) - indicator de transport auxiliar - este pozitionat in 1 daca a fost transport de la nivelul inferior la nivelul superior al octetului rezultatului (de la bitul 3 la bitul 4). Acest indicator se foloseste in programele de calcule in aritmetica zecimala.
ZF (Zero Flag) - indicatorul de zero - este pozitionat in 1 daca rezultatul operatiei a fost zero.
SF (Sign) indicatorul de semn - este pozitionat in 1 daca cel mai semnificativ bit al rezultatului (MSB) este 1, adica daca in reprezentarea numerelor in complement fata de 2 rezultatul este negativ.
OF (Overflow Flag) - Indicator de depasire aritmetica (a gamei de valori posibil de reprezentat) - este pozitionat in 1 daca dimensiunea rezultatului depaseste capacitatea locatiei de destinatie si a fost pierdut un bit (la valorile cu semn se altereaza semnul).
Toate structurile algebrice presupun existenta unui element simetric fata de operatia de adunare, definit prin relatia:
numar+simetric =0
In notatia zecimala obisnuita, avem de exemplu:
In binar se poate face o notatie fara a specifica separat semnul, daca se considera cuvinte de o lungime fixa, L. Astfel, de exemplu daca L=4, putem spune ca 1 are ca simetric numarul binar 1111=F, deoarece
1+F= 0001+1111=0000 plus un transport (care insa nu mai incape in numarul de L=4 biti).
Similar:
Daca L=8, putem spune ca 1 are ca simetric numarul binar 1111.1111=FF, deoarece
1+FF= 0000.0001+1111.1111=0000.0000 plus un transport (care insa nu mai incape in numarul de L=8 biti).
Similar:
Deci FE = -2
Deci FD = -3
Deci FC = -4
Deci FB = -5
Aceasta reprezentare se numeste reprezentarea in complement fata de 2, deoarece numarul simetric este egal cu cel initial scazut din 2L.
Se poate arata ca complementul fata de 2 se obtine prin negarea bitilor numarului si adunarea unui 1.
In limbaj de asamblare, complementul fata de 2 al unui numar (negativul acelui numar) se obtine cu instructiunea NEG (vezi mai jos descrierea instructiunii).
2 Prezentarea instructiunilor aritmetice
ADD dst,src - Adunare
Actiune: dst = dst + src;
Operanzi: dst: r8, r16, r32, m8, m16, m32
src: r8, r16, r32, m8, m16, m32, n, nn, nnnn
ADC dst,src - Adunare cu carry (transport)
Actiune: dst = dst + src +CF;
Operanzi: dst: r8, r16, r32, m8, m16, m32
src: r8, r16, r32, m8, m16, m32, n, nn, nnnn
INC dst -Incrementare
Actiune: dst = dst + 1
Operand: r8, r16, r32, m8, m16, m32
SUB dst,src - Scadere
Actiune: dst = dst - src;
Operanzi: dst: r8, r16, r32, m8, m16, m32
src: r8, r16, r32, m8, m16, m32, n, nn, nnnn
Exemplul 1:
mov al,33h;Desc azutul
mov bl,44h;este mai mic decat scazatorul
sub al,bl ;rezultatul in AL va fi negativ,0EFh
;si va apare si CARRY
SBB dst,src - Scadere cu borrow (imprumut)
Actiune: dst = dst - src - CF;
Operanzi: dst: r8, r16, r32, m8, m16, m32
src: r8, r16, r32, m8, m16, m32, n, nn, nnnn
Exemplul 2:
mov al,33
mov bl,44
sub al,bl ;La aceasta scadere apare imprumut
sbb cl,al ;Acesta e luat in consideratie aici
DEC dst -Decrementare
Actiune: dst = dst + 1
Operand: r8, r16, r32, m8, m16, m32
NEG dst -Negare aritmetica
Actiune: dst = - dst ( se obtine complementul fata de doi)
Operand: r8, r16, r32, m8, m16, m32
Descriere: Instructiunea NEG genereaza complementul fata de 2 al opernadului adica numarul respectiv cu semn schimbat. CF este setat automat, cu exceptia cazului cand Operandul este 0.
Exemplul 3:
mov al,0EFh;In complement fata de 2 este negativ
neg al ;Se schimba semnul si rezulta 11
NOT dst -Complementare fata de 1.
Actiune: dst ← 0FFh - dst ; pentru Operand de 8 biti
dst ← 0FFFFh - dst ; pentru Operand de 16 biti
dst ← 0FFFFFFFFh - dst ; pentru Operand de 32 biti
Operand: r8, r16, r32, m8, m16, m32
Descriere: Instructiunea NOT inverseaza operandul; orice 1 devine 0 si viceversa. Nu sunt afectati indicatorii de conditii.
CMP dst,src -Comparatie aritmetica (prin scadere)
Actiune: dst-src;fara generare rezultat - modifica doar indicatorii de conditii.
Operanzi: dst: r8, r16, r32, m8, m16, m32
src: r8, r16, r32, m8, m16, m32, n, nn, nnnn
MUL src - Inmultirea fara semn lui AL, AX sau EAX cu un numar.
Actiunea depinde de marimea Operandului src, luand urmatoarele forme:
- src de 8 biti: AX ← AL * src8; src: r8,m8
Daca AH = 0 atunci CF ← 0; In celelalte cazuri CF ← 1 si OF ← CF
-src de 16 biti: DX: AX ← AX * src16; src: r16,m16
Daca DX = 0 atunci CF ← 0; In celelalte cazuri CF ← 1 si OF ← CF
- src de 32 biti: EDX: EAX ← EAX * src32; src: r32,m32
Daca EDX = 0 atunci CF ← 0; In celelalte cazuri CF ← 1 si OF ← CF
Exemplul 4:
mul bl ; Se inmulteste AL cu BL (8 biti) iar ;rezultatul este in AX
mul cx ; Se inmulteste AX cu CX iar rezultatul ;este in DX (octetii superiori) si AX ;(octetii inferiori)
IMUL (dst,)src - Inmultirea cu semn a lui AL, AX, EAX sau a altui registru cu un numar.
Actiunea depinde de Operandul destinatie si de marimea Operandului src.
In cazul in care destinatia este acumulatorul AL,AX sau EAX se obtine rezultatul complet, chiar daca apare flagul Overflow, deoarece rezultatul va fi memorat cu precizie dubla fata de a operanzilor:
-src de 8 biti: AX ← AL * src8; src: r8,m8
Daca AH = 0 sau AH = FF atunci CF ← 0; In celelalte cazuri CF ← 1 si OF ← CF
- src de 16 biti: DX: AX ← AX * src16; src: r16,m16
Daca DX = 0 sau AH = FF atunci CF ← 0; In celelalte cazuri CF ← 1 si OF ← CF
- src de 32 biti: EDX: EAX ← EAX * src32; src: r32,m32
Daca EDX = 0 sau AH = FF atunci CF ← 0; In celelalte cazuri CF ← 1 si OF ← CF
Spre deosebire de inmultirea numerelor fara semn (cu instructiunea MUL), in cazul instructiunii IMUL este posibil ca deinmultitul sa fie si alt registru in afara de acumulator, iar sursa poate sa fie o valoare numerica imediata. In acest caz insa, daca rezultatul are mai multi biti decat registrul care contine deinmultitul, se pierd bitii care depasesc largimea acestuia. Actiunea este urmatoarea:
- IMUL dst,src
dst ← dst * src; (dst= r16; src=r16/m16 /imm8/imm16)
Daca DX = 0 sau AH = FF atunci CF ← 0; In celelalte cazuri CF ← 1 si OF ← CF
Daca src este de tip imm8, acesta se extinde cu semn pana la lungimea dst.
- IMUL dst,src
dst ← dst * src; (dst= r32; src=r32/m32 /imm8/imm32)
Daca DX = 0 sau AH = FF atunci CF ← 0; In celelalte cazuri CF ← 1 si OF ← CF
Daca src este de tip imm8, acesta se extinde cu semn pana la lungimea dst
DIV src - Impartirea fara semn a acumulatorului cu un registru sau locatie de memorie.
Actiune: - daca src este de 8 biti:
AL ← AX/src8; (catul impartirii)
AL ← AX % src8 (restul impartirii)
src: r8,m8.
- daca src este de 16 biti:
AX ← DX : AX/srcl6; (catul impartirii)
DX DX : AX % srcl6 (restul impartirii)
src: r16,m16.
- daca src este de 32 biti:
EAX ← EDX : EAX/srcl6; (catul impartirii)
EDX EDX : EAX % srcl6 (restul impartirii)
src: r32,m32.
Observatii: Daca rezultatul (catul) nu incape in registrul destinatie AL, AX respectiv EAX, sau impartitorul este 0, se genereaza Intrerupere 0 (DE - Divide Error) si se sare automat din program. De aceea trebuie facuta o evaluare prealabila a domeniului de valori ale rezultatului si trebuie folosit un registru destinatie corespunzator.
Daca catul este subunitar, el este ajustat la 0.
Indicatorii de conditii sunt nedefiniti.
Exemplul 5:
mov ax, 0F0h
mov cl,10
div cl; Se imparte AX la CL(8biti). Catul este in AL iar restul in AH
Exemplul 6:
mov ax, 0F0h
mov cl,5
div cl ; Se imparte AX la CL (8biti). Catul este mai ;mare decat decat FF si apare eroare ;(intreruperea 0).
Corect ar fi fost:
mov ax,0F0h
mov cl,5
mov dx,0 ; Se pregateste ca deimpartitul sa fie in ;perechea DX:AX
mov ch,0 ; Se pregateste ca impartitorul sa fie in CX
div cx ; Impartire pe 16 biti, deci catul va fi in ;AX iar restul in DX
IDIV src - Impartirea cu semn a acumulatorului cu un registru sau locatie de memorie.
Actiune: - daca src este de 8 biti:
AL ← AX/src8; (catul impartirii, cu semn)
AL ← AX % src8 (restul impartirii,cu semn)
src: r8,m8.
- daca src este de 16 biti:
AX ← DX : AX/srcl6; (catul impartirii,cu semn)
DX DX : AX % srcl6 (restul impartirii,cu semn)
src: r16,m16.
- daca src este de 32 biti:
EAX ← EDX : EAX/srcl6; (catul impartirii,cu semn)
EDX EDX : EAX % srcl6 (restul impartirii,cu semn)
src: r32,m32.
Observatie: Daca rezultatul (catul) nu incape in registrul destinatie AL, AX respectiv EAX, sau impartitorul este 0, se genereaza Intreruperea 0 (DE - Divide Error) si se sare automat din program. De aceea trebuie facuta o evaluare prealabila a domeniului de valori ale rezultatului si trebuie folosit un registru destinatie corespunzator.
Daca catul este subunitar, el este ajustat la 0.
Semnul restului este acelasi cu al impartitorului.
Indicatorii de conditii sunt nedefiniti.
CBW - Conversie de la Byte (8 biti) la Word (16 biti) cu pastrare semn. Actiune: AL 7 = 0 => AH =0;
AL 7 = 1 => AH =0FF;
CWD - Conversie de la Word (16 biti) la Dword (32 biti) cu pastrare semn. Actiune: AX 15 = 0 => DX =0;
AL 15 = 1 => DX =0FFFF;
Modul de lucru
P 1 Sa se scrie un program care sa incarce constantele 11,10,33 si 44 hexa in AL, BX, CL, respectiv DL, constanta 99h in memorie la adresa indicata de BX, apoi sa adune continutul registrelor AL,CL si DL ,sa scada rezultatul din memorie de la adresa continuta in BX si sa memoreze rezultatul final la adresa de memorie urmatoare.
Indicatii
Cand se transfera un numar de un octet cu memoria, el trebuie precedat de prefixul "byte ptr".
P 2 Acelasi program ca la punctul 1, dar continutul registrelor va fi 1122, 10, 3344, 5566 iar in memorie [BX]=AABB.
Indicatii
Cand se transfera un numar de doi octeti cu memoria, si octetul cel mai semnificativ este 00 sau lipseste, el trebuie precedat de prefixul "word ptr". Daca octetul cel mai semnificativ este diferit de 00, prefixul respectiv poate fi omis, el subintelegandu-se.
Constantele care incep cu o litera trebuie precedate de cifra 0. Daca se si termina cu o litera trebuie urmate de sufixul H.
In final, in memorie incepand de la adresa 10 trebuie sa fie octetii: EF.10.EF.10.
P 3 Sa se scrie un program care sa incarce constantele 9, 19 si 29 in AL, BL respectiv CL Sa se incrementeze continuturile acestor registre si sa se inmulteasca apoi intre ele. Se va verifica rezultatul cu aplicatia Calculator.
Indicatii:
Atunci cand deanmultitul este (sau poate fi) de doi octeti, inmultirea trebuie facuta cu un inmultitor care ocupa un registru de 16 biti, chiar daca inmultitorul este de numai 8 biti.
In final, in AX trebuie sa fie rezultatul 2AA8.
P 4 Se vor incarca registrele in felul urmator: BX=1122, DX=22 si CX=5566. Sa se inmulteasca aceste registre intre ele iar rezultatul sa se trimita in memorie la adresa 20h.
Indicatii:
Algoritmul poate fi urmatorul:
11.22*566*22 = 0B7.1D.8C*22 = 1D.8C*22+10000*0B7*22 = C251.EC98
Continutul unora dintre registre va trebui salvat in memorie.
P 5 Sa se incarce in CX , BL si DL numerele 6655, 44 respectiv 22 sa se imparta CX la BL , catul fiind apoi inmultit cu DL si adunat cu restul.
Indicatii
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 2071
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved