Totusi, cititi si NG:)
Instructiuni aritmetice
Inmultirea:
= op1 * op2, unde op1 si op2 sunt BYTE:
- se pune op1 in AL
- se
exec instructiunea MUL op2
- rezultatul e in AX
(WORD)
= op1 * op2, unde op1 si op2 sunt WORD:
- se pune op1 in AX
- se
exec. instructiunea MUL op2
- rezultatul e in DX:AX
Impartirea:
= op1 / op2, unde op1 este WORD, op2 este BYTE:
- se pune op1 in AX
- se
executa instructiunea DIV op2
- catul este in AL,
restul este in AH
= op1 / op2, unde op1 este DOUBLE WORD, op2 este WORD:
- se pune op1 in DX:AX
-
se executa instructiunea DIV op2
- catul este in AX
restul este in DX
ATENTIE!!! - daca vreti sa impartiti byte la byte sau word
la word, amintiti-va de CBW, respectiv CWD
LOOP:
Forma generala:
eticheta_revenire:
instructiuni
LOOP eticheta_revenire
- in cazul general, se repeta instructiunile de CX ori (valoarea depusa
dinainte in CX)
- daca se vrea o conditie de revenire mai detaliata, se pot
utiliza variantele LOOPE (LOOP While Equal), LOOPNE (LOOP While Not Equal) (daca
inainte de LOOP* avem o instructiune aritmetica, comparatie, s.a. - se iese din
LOOP cand CX devine 0 sau cand se intalneste o "nepotrivire", la LOOPE,
respectiv o "egalitate" pt. LOOPNE)
(pt. exemplificare, vezi exemplul din
lab6)
Proceduri
nume_procedura PROC
instructiuni...
RET
nume_procedura ENDP
Apel: (in general)
CALL nume_procedura
Exemplu:
;Se
da un sir de octeti sa se creeze un nou sir de aceasi lungime, care va
;contine
doar acei octeti din primul sir care au numarul de biti 1 mai
mare
;decat
numarul de biti 0… si asa mai departe…
assume
ds:data,cs:code
data
segment
a db
47h,65h,35h,41h
d equ
$-a
r db d
dup(0h)
data
ends
code
segment
start:
;incarcare registri cu
adresele necesare…
mov
ax,data
mov
ds,ax
mov
es,ax
mov si,offset
a
mov di,offset
r
mov
cx,d
cld
again:
lodsb
call
numara
mov
bh,8
sub bh,bl ;bh=nr 0, bl=nr 1
cmp
bl,bh
…
loop
again
jmp
sf
numara
proc
;numara bitii 1 din AL
push cx
;salvare CX
mov
cx,8
xor
bx,bx
iar:
rol
al,1
adc
bl,0
loop
iar
;in
BL s-a obtinut numarul de biti “1”
pop cx ;refacere
CX
ret ;revenire din
procedura…
numara
endp
sf:
mov
ax,4C00h
int
21h
code
ends
end
start