Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateC
C sharpCalculatoareCorel drawDot netExcelFox pro
FrontpageHardwareHtmlInternetJavaLinux
MatlabMs dosPascalPhpPower pointRetele calculatoare
SqlTutorialsWebdesignWindowsWordXml

Operatii aritmetice

calculatoare



+ Font mai mare | - Font mai mic



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).

1 Reprezentarea in complement fata de 2

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:

  • 1 are simetric pe -1 deoarece suma lor da 0
  • 2 are simetric pe -2 deoarece suma lor da 0
  • etc.

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:

  • 0010 are ca simetric 1110  deoarece suma lor da 0000. Deci E = -2
  • 0011 are ca simetric 1101  deoarece suma lor da 0000. Deci D = -3
  • 0100 are ca simetric 1100  deoarece suma lor da 0000. Deci C = -4
  • 0101 are ca simetric 1011  deoarece suma lor da 0000. Deci B = -5
  • etc.

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:

  • 0000.0010 are ca simetric 1111.1110 deoarece suma lor da 0000.0000.

Deci FE = -2

  • 0000.0011 are ca simetric 1111.1101 deoarece suma lor da 0000.0000.

Deci FD = -3

  • 0000.0100 are ca simetric 1111.1100 deoarece suma lor da 0000.0000.

Deci FC = -4

  • 0000.0101 are ca simetric 1111.1011 deoarece suma lor da 0000.0000.

Deci FB = -5

  • etc.

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

  • Continutul unora dintre registre va trebui salvat in memorie.
  • Impartirea va avea un rezultat mai mare de 8 biti, deci trebuie ca deampartitul sa fie format din DX si AX. Pentru aceasta, DX va fi facut 0 iar impartitorul va fi BX (cu BH=0).
  • Adunarea finala trebuie facuta pe 4 octeti, deci dupa ce se va face o prima adunare pe 16 biti pentru octetii mai putin semnificativi, se va anula un registru si se va aduna cu CARRY la cei 16 biti mai semnificativi.


Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 2093
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved