Sunteți pe pagina 1din 12

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnica a Moldovei


Facultatea Calculatoare, Informatic i Microelectronic
Catedra Informatic Aplicat

RAPORT
Lucrare de laborator 2
la Arhitectura Calculatoarelor

A efectuat: st.gr. IA-


151
B
Iulian
A verificat: lect.sup.
Victoria
Lazu
Chiinu 2015

Lucrarea de laborator nr.2


Tema: Moduri de adresare i structuri de control n limbajul de
Asamblare (Assembler)
Obiectiv: De studiat modurile de adresare i structurile de
control n limbajul de asamblare. De elaborat un program ce va
efectua operaii asupra vectorilor utiliznd structuri de control.
Sarcini:
1. Se studiaz notele teoretice

Adresare direct n limbaj de asamblare


Registrele sunt iniializate cu valori constante
Exemplu:
mov AX, 1234h

Numele variabilei este utilizat ca operand n instruciune.


Exemplu:
vector dw 10 dup(5) ; definire vector cu 10 elemente initializate cu
valoarea 5

mov AX, vector ;copiaza valoarea primului element de tip cuvant din
vector in AX

mov BX, vector[3] copiaza valoarea cuvantului care incepe de la offset-ul al


treilea
Valoarea offset-ului este utilizat pentru a citi date direct din

segmentul DS.
Exemplu:
vector dw 10 dup(5) ; definire vector cu 10 elemente initializate cu
valoarea 5

mov AX, DS:[00h] ;copiaza valoarea primului element de tip cuvant din
vector in AX

mov BX,DS:[08h] ;copiaza valoarea cuvantului care incepe de la offset-ul


08h

Cnd se specific offset-ul este absolut necesar s se utilizeze


expresia DS:[valoare_offset] pentru c, dac se scrie instruciunea:
mov AX,[08h]

se copiaz n AX doar valoarea 8h (Vei primi i un WARNING


[Constant] assumed to mean immediate constant.)
Adresare indirect in limbaj de asamblare

Se utilizeaz unul dintre registrele index SI, DI, BP sau registrul de baza
BX. Atenie: utilizarea altor registre va genera eroare: Illegal indexing
mode.
Se utilizeaz n general pentru parcurgerea masivelor i pentru a accesa
elemente din structuri de date de tip articol.

Utilizarea registrului index SI sau DI pentru adresare indirect


indexat
registrul SI este utilizat pentru a reine offset-ul elementului pe care
dorim sa-l accesam;
registrul SI sau DI este utilizat asemenea unui indice n
parcurgerea masivului;
n cazul n care vectorul are elemente de tip word parcurgerea acestuia se
face marind SI cu valoarea 2 de fiecare dat:

Instructiunea LOOP
forma analitic a instruciunii este:
LOOP nume_eticheta

decrementeaz registrul CX i sare la eticheta nume_eticheta cu


condiia c valoarea din CX s fie mai mare decat zero;
nu afecteaza nici un flag;
instruciunea memoreaz ntr-un octet offset-ul etichetei fa de
poziia sa n segmentul de cod; deci, eticheta trebuie s se gseasc
la o distan de maxim128 de octei n interiorul segmentului de cod
fa de poziia instruciunii LOOP;
utilizat de obicei pentru a implementa instruciuni de control
repetitive;

Instructiunea LEA
forma analitic a instruciunii este:
LEA registru, operand

ncarc n registrul specificat offset-ul operandului;


registrul nu poate fi unul dintre registrele de segment;

I. Structuri de control
Limbajul de asamblare pentru procesoare din familia Intel 8086 are
urmtoarele structuri de control:

structura alternativ, sau structura IF


structura pre-condiionat, sau WHILE-DO
structura post-condiionat, sau DO-WHILE
structura alternativ multipl, sau CASE

Structura alternativa IF
n limbajele de nivel nalt structura de control alternativ este asociat cu
expresia IF-THEN-ELSE. Implementarea structurii alternative
presupune:

evaluarea unei expresii;


compararea a dou valori.
Dac condiia 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 instruciunile

CMP
CMPSB
CMPSW.

Tipuri de salturi n limbaj 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 instruciunii jmp. Destinaia saltului poate fi n acelai
segment (intrasegment) sau ntr-un segment diferite (intersegment).

Tip jump Forma intern

5 octeti: 1 pentru codul operatiei (EAh), 2 pentru offset i 2 pentru adresa


Jump intersegment
segment.
Jump
3 octeti: 1 pentru codul operatiei (E9h), 2 pentru offset.
intrasegment

2 octeti: 1 pentru codul operatiei (EBh), 1 pentru a reprezenta o valoare cu


Jump-uri scurte
semn aferenta offset-ului. In acest caz, destinatia trebuie sa fie intre +127
(short jumps)
i -128 de octeti fata de instructiunea de salt.

Instructiunea CMP
Flag-urile modificate de rezultatul instruciunii CMP sunt:
OF;
SF;
ZF;
AF;
PF;
CF;
Instruciunea CMP compar cei doi operanzi prin intermediul unei
scderi logice. Asta nseamn c cei doi operanzi nu sunt modificai, nsa
biii de flag sunt setai astfel nct s indice rezultatul diferenei.

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 constanta (!) 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 fr semn. Flag-uri diferite sunt verificate n funcie de
interpretarea valorilor.
Cum tie procesorul cum interpreteaz utilizatorul valorile (fie cu
semn, fie fr semn)?
Raspuns: n funcie de tipul instruciunii de salt.
Salturi fr semn (valorile comparate sunt considerate fr semn) se
refer prin cuvintele cheie above pentru mai mare i below
pentru mai mic.
Salturile cu semn se refer prin greater i less.

Instruciune de salt condiionat dac


Instruciune de salt condiionat dac
Operatie ambii operanzi sunt considerai fr
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


1. Se editeaz programele exemplu i se salveaz cu
extensia .asm

1 PROGRAM:
.MODEL SMALL
.STACK 100h
.DATA
TimePrompt DB 'E trecut de ora 12? (da/nu) - [Y/N]$'
GoodMorningMessage LABEL BYTE
DB 13,10,'Buna dimineaa!',13,10,'$'
GoodAfternoonMessage LABEL BYTE
DB 13,10,'Buna ziua!',13.10,'$'

.CODE
mov ax,@Data
mov ds,ax ;
mov dx,OFFSET TimePrompt ;
mov ah,9 ;
int 21h ;
mov ah,1 ;
int 21h
or al,20h

cmp al,'y' ;
jnz IsAfternoon ;
cmp al,'n' ;
jnz IsMorning ;
IsAfternoon:
mov dx,OFFSET GoodAfternoonMessage ;
jmp DisplayGreeting
IsMorning:
mov dx,OFFSET GoodMorningMessage ;

DisplayGreeting:
mov ah,9 ;
int 21h ;
mov ah,4ch ;
int 21h ;
END

2 PROGRAM:
.MODEL SMALL
.STACK 100h
.DATA
a db 8
b db 3
c db 5
d db -8
e db ?
.CODE
Mov AL,[b]
Mov AH,[c]
Add AL,AH
DEC AL
Mov AH,d
Neg AH
Add AL,AH
Mov AH,a
Sub AH,AL
Mov [e],aH
Mov AX,4cooh
Int 21h
End

2.Se asambleaz i link-editeaz programele,


obinndu-se forma .exe
Program 1

Program 2
Se testeaz programele prin ncrcarea sa n
depanator.
1 Program

Program 2
3. Se cere s se modifice programele anterior astfel
nct s ndeplineasc acelai lucru, dar fr a
utiliza saltul JNE, ci saltul JE. Se vor folosi funciile
principale ale mediului Debugger: Trace into(F7),
Step over(F8), Watch .a.
Concluzie:
n cadrul acestei lucrri de laborator am studiat modurile de adresare i
structurile de control n limbajul de asamblare. Am elaborat un program
care a afiat valoarea expresiei propuse. De asemenea, am elaborat i un
program ce va efectua operaii asupra vectorilor utiliznd structuri de
control.