Sunteți pe pagina 1din 7

Ministerul Educaiei din Republica Moldova

Universitatea Liber Internaional din Moldova


Facultatea Informatic ,Inginerie i Design

RAPORT
la lucrarea de laborator 3
Disciplina: Programarea n Assembler

"Salturi. Instruciuni de comparare "

A efectuat
studentul gr. TI-41 Lidvinschi Oleg

A verificat
Lec. univ. Semntura Mititelu V.

Chiinu 2016
Lucrarea de laborator Nr.3
Varianta 15
Tema lucrrii: Salturi. Instruciuni de comparare.
Scopul lucrrii: Obinerea deprinderii practice de a utiliza diferite operaii i
salturi ntr-un program din limbajul assembler.
Noiuni teoretice:n limbajele de nivel nalt structura de control alternativa este
asociat cu expresia IF-THEN-ELSE. Implementarea structurii alternative
presupune:
a) evaluarea unei expresii;
b) compararea a dou valori.
n ambele cazuri sunt iniializate flag-urile de condiie. Dac condi ia evaluat este
adevarat, atunci se execut secvena de instruciuni de pe ramura true, altfel
expresiile de pe ramura false au prioritate. n Assembler se utilizeaz pentru a
compara doi operanzi instructiunile:
CMP
CMPSB
CMPSW
Tipuri de salturi n limbajul de asamblare
salturi neconditionate: JMP;
salturi conditionate: JA sau JNBE, JAE sau JNB, JB sau JNAE, JBE sau
JNA, JC, JCXZ sau JECXZ, JE sau JZ, JG sau JNLE, JGE sau JNL, JL sau
JNGE, JLE sau JNZ, JNC, JNE sau JNG, JNO, JNP sau JPO, LOOP,
LOOPE sau LOOPZ, LOOPNE sau LOOPNZ.
Procesorul 8086 permite mai multe modaliti de a efectua un salt prin intermediul
instructiunii jmp. Destinaia saltului poate fi n acelai segment (intrasegment) sau
ntr-un segment diferite (intersegment).
Instructiunea CMP
Flag-urile modificate de rezultatul instruciunii CMP sunt:
OF; AF;
SF; PF;
ZF; CF;
Instruciunea CMP compar cei doi operanzi prin intermediul unei scderi logice.
Asta nseamn c cei doi operanzi nu sunt modificai, ns biii de flag sunt seta i
astfel nct s indice rezultatul diferenei.
Exemplu de secvent de cod necesar comparrii a dou valori intregi n limbaj de
asamblare.
CMP DX, BX;
2
Cnd BX = 0004 i DX = 0008,
DX BX = 0004, aceast scdere nu modific operanzii
nu are loc overflow (OF=0)
rezultatul este pozitiv (SF=0)
Cnd BX = 000A i DX = 0008,
DX BX = FFFE (- 2)
- nu are loc overflow (OF=0)
negativ (SF=1)
Ce putem compara?
registru cu registru: CMP AX, BX
registru cu memorie (variabile definite): CMP AX, mval
registru cu constante: CMP AX, 42
memorie cu registru: CMP mval, AX
memorie cu constant (!) CMP mval, 42
Ce nu putem compara?
Nu se poate compara memorie cu memorie!!! CMP a, b ;instruciune greit. Una
dintre valori trebuie copiat ntr-un registru nainte de a realiza comparaia.
Salturi condiionate
Salturile condiionate sunt utilizate pentru a trece la o alt locaie n segmentul de
cod n funcie de valorile anumitor bii de flag.
Numerele care sunt comparate pot reprezenta att valori cu semn ct i far semn.
Flag-uri diferite sunt verificate n funcie de interpretarea valorilor.
Cum tie procesorul cum interpreteaza utilizatorul valorile (fie cu semn, fie fara
semn)?
Raspuns: in funcie de tipul instruciunii de salt.
Salturi fara semn (valorile comparate sunt considerate far semn) se refera prin
cuvintele cheie above pentru mai mare i below pentru mai mic.
Salturile cu semn se refer prin greater i less.
Opera Instruciune de salt condiionat dac Instruciune de salt condiionat
ie ambii operanzi sunt considerai fara dac unul dintre operanzi este cu
semn semn
<> or != JNE sau JNZ JNE sau JNZ
= or JE sau JZ JE sau JZ
==
>= JNB JNL
> JNBE sau JA JNLE or JG
<= JNA JNG
< JNAE sau JB JNGE sau JL
3
Mersul lucrrii: a) A>B cu semn
lab3 segment jmp e_p2
assume cs:lab3, ds:lab3, es:lab3, et_pst: ret
ss:lab3 num_ASCII endp
org 100h
begin: jmp main main: ;nceputul programului
a dw ? ;a... ;nscrierea lui a
b dw ? mov ah,9
c dw ? mov dx, offset mesa
str0 label byte int 21h
max0 db 6 mov ah,0Ah
real0 db ? mov dx, offset str0
date0 db 6 dup (0) int 21h
mesa db 0DH,0AH,'Introdu nr a= $' call ASCII_num
mesb db 0DH,0AH,'Introdu nr b= $' mov a,ax
mesc db 0DH,0AH,'rezultatul este $' ;...a
afish db 0,0,0,0,0,'$' ;b... ;nscrierea lui b
cit label byte mov ah,9
max db 1 mov dx, offset mesb
real db ? int 21h
date db 0 mov ah,0Ah
ASCII_num proc mov dx, offset str0
xor ax,ax int 21h
xor cx,cx call ASCII_num
mov cl,real0 mov b,ax
lea si,date0 ;...b
xor bx,bx
mov bl,10 mov ax,a ;ax=a
et_p1: cmp ax,b ;se compar a cu b
xor dx,dx jg et1 ;dac ax<a salt la et1
push cx mov bx,b ;bx=b
mov cl, [si] mov c,bx ;c=b
sub cl,30h jmp et2 ;salt la et2
mul bx et1: ;start et1
add ax,cx mov c,ax ;c=b
inc si et2: ;start et2
pop cx xor ax,ax ;golire ax
loop et_p1 mov ax,c ;ax=c
ret call num_ASCII
ASCII_num endp mov ah,9
num_ASCII proc mov dx,offset mesc
xor bx,bx int 21h
mov bl,10 mov ah,9
lea si,afish+4 lea dx,afish
e_p2: int 21h
cmp ax,0 mov ah,0Ah
je et_pst mov dx,offset cit
div bx int 21h
add dx,30h ret
mov [si],dl lab3 ends
dec si end begin
xor dx,dx

4
Rezultatul obinut n urma executrii programului este

Concluzii
Prin intermediul prezentului cod noi am putut s depistm maxim dintre dou
numere introduse de la tastatur, i s-l afi m la ecran. Dar acest program nu este
valabil pentru cifre negative.
0, ( a b) 5
F ( a , b)
1, ab 7
Mersul lucrrii b)
Condiia
lab3 segment add ax,cx
assume cs:lab3, ds:lab3, es:lab3, inc si
ss:lab3 pop cx
org 100h loop et_p1
begin: jmp main ret
a db ? ASCII_num endp
b db ?
c db ? main: ;inceputul programului
d db ?,'$' ;a... ;inscrierea lui a
str0 label byte mov ah,9
max0 db 6 lea dx, mesa
real0 db ? int 21h
date0 db 6 dup (0) mov ah,0Ah
mesa db 0DH,0AH,'Introdu nr a= $' lea dx, str0
mesb db 0DH,0AH,'Introdu nr b= $' int 21h
mesc db 0DH,0AH,'F(a,b)=$' call ASCII_num
adevar db 'ADEVARAT$' mov a,al
fals db 'FALS$' ;...a
afish db 0,0,0,0,0,'$' ;b... ;inscrierea lui b
cit label byte mov ah,9
max db 1 lea dx, mesb
real db ? int 21h
date db 0 mov ah,0Ah
ASCII_num proc lea dx, str0
xor ax,ax int 21h
xor cx,cx call ASCII_num
mov cl,real0 mov b,al
lea si,date0 ;...b
xor bx,bx xor bx,bx
mov bl,10 xor ax,ax
et_p1: mov bl,a
xor dx,dx add bl,b ;bl=a+b
push cx mov al,a
mov cl, [si] mov ah,b
sub cl,30h mul ah ;ax=ab
mul bx mov a,al; a=ab
5
mov b,bl int 21h
mov al,b jmp et_sfirsit
mov bl,5
xor ah,ah ;golirea registrului ah et_2: ;ah=!0
div bl ;al=citul cmp a,7 ;se compara a cu 7
;ah=restul jb et_3 ;daca a<7,et_3
ah=0
cmp ah,0 ;ah se compara cu mov ah,9 ;ah=!0, a>=7
0 a<7 lea dx, mesc
je et_1 ;daca ah=0, et_1 int 21h
jmp et_2 ;daca ah=!0, et_2 mov ah,9
lea dx, fals
et_1: ;ah=0 int 21h
cmp a,7 ;se compara a cu 7 jmp et_sfirsit;salt la sfirsit
jb et_adevar ;daca a<7,
et_adevar et_3: ;ah=!0, a<7
mov d,31h
mov d,30h ;d=0 mov ah,9
mov ah,9 lea dx, mesc
lea dx, mesc int 21h
int 21h mov ah,9
mov ah,9 lea dx,d
lea dx,d int 21h
int 21h
jmp et_sfirsit;salt la sfirsit et_sfirsit:
mov ah,0Ah
et_adevar: ;ah=0, a<2 lea dx, cit
mov ah,9 int 21h
lea dx, mesc ret
int 21h lab3 ends
mov ah,9 end begin
lea dx,adevar

6
Rezultatele

F(a,b)=satisface condiia 1

F(a,b)=satisface conditia 2

Concluzii
codul programului se bazeaz pe salturile condiionate ce se efectueaz datorit
comparrii. i el face o alegere dintre mesajele ce le are i n dependen de
valoare variabilei a i b.

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