Sunteți pe pagina 1din 25

Instrucţiuni aritmetice

Dimensiunea câmpului Întreg fără semn Întreg cu semn


bait
Diapazonul
0...255
valorilor–128...+127
numerelor binare
cuvânt 0...65 535 –32 768...+32 767
cuvânt dublu 0...4 294 967 295 –2 147 483 648...+2 147 483 647
Instrucţiuni aritmetice

Conversie de tipuri

Instrucţiunea cbw (Convert Byte to Word)

FG: cbw
S: daca (al7) = 0, atunci (ah) 0 în caz contrar (ah) 1
AF: nu-i afectat nici un flag

Se extinde bitul de semn din al la întreg registrul ah


Instrucţiuni aritmetice
Conversie de tipuri

Instrucţiunea cwd (Convert Word to Double-word)

FG: cwd
S: daca (ax15) = 0, atunci (dx) 0 în caz contrar (dx) 1
AF: nu-i afectat nici un flag

Se extinde bitul de semn din ax la întreg registrul dx


Instrucţiuni aritmetice

Instrucţiunea add (Add –adună)

FG: add <destinaţie>,<sursă>


S: (destinaţie)  (destinaţie)+(sursă)
AF: of ,sf, zf, af, pf, cf şi depind de rezultatul instrucţiunii
Instrucţiuni aritmetice
Exemplu:

mov al, 5
mov cl, 6
add al, cl
mov ah, 0
push ax
add ax,20
pop cx
add cx, ax
Instrucţiuni aritmetice
Instrucţiunea inc (Increment – Incrementează)

FG: inc <destinaţie>


S: (destinaţie)  (destinaţie) + 1
AF: Afectate: af, pf, sf, zf, of(fără cf)

In care destinaţie este un registru sau un operand în memorie, de tip octet sau
cuvânt
Instrucţiuni aritmetice

Instrucţiunea sub (Subtract - Scade)

FG: sub <destinaţie> , <sursă>


S: (destinaţie)  (destinaţie)-(sursă)
AF: of ,sf, zf, af, pf, cf şi depind de rezultatul instrucţiunii
Instrucţiuni aritmetice
Instrucţiunea dec (Decrement - Decrementează)

FG: dec <destinaţie>


S: (destinaţie)  (destinaţie) - 1
AIF: Afectate: af, pf, sf, zf, of (fără cf).
Instrucţiuni aritmetice
Exemplu:
mov ax, 10
add ax, 15
push ax
mov bx, 20
inc bx
sub ax, 4
push ax
add bx, 15
pop cx
add cx, bx
pop bx
add cx, ax
dec cx
Instrucţiuni aritmetice
Instrucţiunea mul (Multiply - Inmulţeşte fără semn)

FG: mul <sursă>


S: sursa - 1 octet: (ax)(al)*(sursa)
sursa -2 octeţi: (dx:ax)(ax)*(sursa)
AF: dacă extensia acumulatorului (adică ah sau dx) este diferită de 0,
atunci cf şi of sunt 1, în caz contrar cf şi of sunt 0.
Restul flagurilor sunt nedefinite

Sursa poate fi un registru sau o locaţie de memorie de 8 sau 16 biti. Variantele noi de
procesoare acceptă şi date imediate ca operand sursă.
Instrucţiuni aritmetice
Exemple
Ce conţinut va avea registrul ax după execuţia următoarelor secvenţe de program?

mov al,3 mov ax, 12 mov al,3 mov al,10 mov al, 18
mov bl, 7 mov bx, 7 mov bl, 7 mul al sub al, 3
mul bl sub ax, bx mul al mul ah mov dl, 2
mov bl,3 mul bl mul dl
mul bl
Instrucţiuni aritmetice
În situaţia în care un operand este de tip byte, iar
celălalt de tip word, se converteste operandul de tip byte la
word.
.data
alfa db 10
beta dw 200
.code
mov al, alfa
cbw
mul beta
Instrucţiuni aritmetice

Să se scrie secvența de program ce face calculul


următoare expresii aritmetice:
a*a+b*c-a+b
a, b - tip byte, c- tip word
Instrucţiuni aritmetice
Instrucţiunea imul (Integer Multiply - Inmulţeşte cu semn)
FG: imul <sursă>
S: sursa - 1 octet: (ax)(al)*(sursa)
sursa - 2 octeţi: (dx:ax)(ax)*(sursa)
AF: dacă extensia acumulatorului reprezintă extensia de semn a
acumulatorului, atunci cf şi of se poziţionează la 0, în caz contrar devin 1.
Restul flagurilor sunt nedefinite.

Este similară cu instrucţiunea mul. Deosebirea este că operaţia de înmulţire


se face considerând operanzii numere cu semn.
Instrucţiuni aritmetice
Împărţirea presupune că deîmpărţitul este pe o lungime dublă decât
ţmpărţitorul. Prin împărţire se obţin câtul şi restul, de lungime egală cu a
împărţitorului.
Instrucţiunea div (Divide - Imparte fără semn)
FG: div <sursă>
S: sursa - 1 octet, atunci (ax)/(sursa)
(ah)restul de la împărţire, (al) câtul împărţirii
sursa - 2 octeţi, atunci (dx:ax)/(sursa)
(dx)restul de la împărţire, (ax) câtul împărţirii
AF: toate flagurile sunt nedefinite.
Instrucţiuni aritmetice
Instrucţiunea idiv (Integer Divide – Împarte cu semn)
FG: idiv <sursă>
S: sursa - 1 octet, atunci (ax)/(sursa)
(ah)restul de la împărţire, (al) câtul împărţirii
sursa - 2 octeţi, atunci (dx:ax)/(sursa)
(dx)restul de la împărţire, (ax) câtul împărţirii
AF: toate flagurile sunt nedefinite.
Instrucţiuni aritmetice
Împărţirea poate conduce la depăşiri. În situatia în care câtul rezultă mai mare decât valoarea
maximă reprezentabilă pe 8, respectiv 16 biţi, sau dacă împărţitorul este 0, rezultatele sunt nedefinite şi
se generează o întrerupere soft pe nivelul 0 (Divide Overflow - Depăşire la împărţire).
De exemplu, în secvenţa:
mov ax, 1000
mov bl,2
div bl
câtul ar trebui să fie 500, valoare care nu se poate reprezenta pe un octet. Întreruperea opreşte de
obicei programul executabil şi afişează un mesaj de eroare la consolă.
De exemplu, în secvenţa:
mov ax, 400
mov bl, 2
idiv bl
câtul ar trebui să rezulte 200, valoare care nu se poate reprezenta ca număr cu semn pe un octet. Ca
atare, va apărea o întrerupere.
Instrucţiuni aritmetice

Ce conţinut va avea registrul ax după execuţia următoarelor


secvenţe de program?

mov ax, 83 mov ax, 96 mov ax, 64


mov bl, 10 mov bl,13 add ax, 12
add al, bl sub al,bl mov ch, 16
div bl div bl div ch
Instrucţiuni aritmetice
Sarcini:
.data
a db 191
b db 3
c dw 361
d dw 20
.code
; împărţire octet la octet a/b
; împărţire cuvânt la octet c/b
;împărţire cuvânt la cuvânt c/d
;împărţire octet la cuvânt a/d
a, b, c, d numere fără semn
Instrucţiuni aritmetice
Sarcini:
.data
a db -191
b db 3
c dw -361
d dw 20
.code
; împărţire octet la octet a/b
; împărţire cuvânt la octet c/b
;împărţire cuvânt la cuvânt c/d
;împărţire cuvânt la cuvânt a/d
a, b, c, d numere cu semn
Instrucţiuni aritmetice
Aplicații:
Un exemplu de afişare la consolă a unui număr pozitiv cuprins în intervalul 10..99:
mov ax, <număr>
mov bl, 10
div bl

mov ah,2
mov dl, al
add dl,30h
int 21h

mov dl, ah
add dl,30h
int 21h
Exemplu:
Determinați expresia ce se calculează în următoarea secvență de program:
.data
x dw ?
y dw ?
.code

mov ax, x
mov bx, ax
mul bx
add ax, x
mov bx, y
add bx,y
mul bx
sub ax, y
Instrucţiuni aritmetice
Instrucţiunea neg (Negate - Schimbă semnul)
FG: neg <destinaţie>
S: (destinaţie)  0 - (destinaţie)
AIF: afectate: AF, CE, PF, SF, ZF, OF (toate).

Destinaţia este un registru sau o locaţie de memorie, pe 8 sau pe 16 biţi.

Schimbarea semnului poate conduce uneori la aceeaşi valoare, în cazul depăşirii domeniului
admisibil. De exemplu, secvenţa:
mov al, -128
neg al
va lăsa registrul al neschimbat (80H), deoarece 128 şi -128 au aceeaşi reprezentare internă.
Instrucţiuni aritmetice
Un exemplu de afişare la consolă a unui număr negativ cuprins în intervalul -10..-99:
mov bx, <număr>
mov ah,2
mov dl, ‘-’
int 21h
mov ax,bx
neg ax
mov bl, 10
div bl
mov ah,2
mov dl, al
add dl,30h
int 21h
mov dl, ah
add dl,30h
int 21h
Instrucţiuni aritmetice

Instrucţiunea cmp (Compare - Compară) - instrucţiune cu principiu aritmetic


FG: cmp <destinaţie> , <sursa>
S: execuţia unei scăderi temporare (destinaţie) - (sursă), fără a se
modifica vreun operand, dar cu poziţionarea bistabililor de condiţie.
AF: afectate: af, cf, pf, sf, zf, of (toate).

Testând bistabilii de condiţie, putem deduce relaţia dintre cei doi operanzi. De
exemplu, instrucţiunea cmp ax, bx va provoca o scădere temporară (ax) - (bx).
Dacă zf = 1, înseamnă că (ax) = (bx).
Dacă cf = 1 înseamnă că la scădere a apărut un împrumut, deci (AX) < (BX), dacă sunt
considerate ca numere fără semn.
Instrucţiunea CMP se foloseşte, de obicei, împreună cu instrucţiuni de salt
condiţionat.

S-ar putea să vă placă și