Вы находитесь на странице: 1из 9

UNIVERSITATEA TEHNIC A MOLDOVEI

FACULTATEA CALCULATOARE INFORMATIC I MICROELETRONIC

CATEDRA MICROELECTRONICA I INGINERIA BIOMEDICAL

RAPORT
Lucrare de laborator Nr.5
la Arhitectura Calculatorului
Tema: Programarea microprocesorului
Intel 8086.
Instruciuni pentru lucrul cu
iruri.

A efectuat:

st. gr. ISBM-131


Iurevici Clim

A verificat:

lector superior
Creu Vasile

2014
Scopul lucrrii :
a) Instruciuni de transfer pentru lucrul cu iruri.
b) Instruciuni de comparaie pentru lucrul cu iruri.
Teorie :
Instructiuni pentru lucrul cu siruri cu operanzi expliciti
Instructiunile pentru lucrul cu siruri utilizeaza intotdeauna cate 2
operanzi. Daca acestia sunt specificati explicit in codul
instructiunii dupa mnemonica atunci instructiunea se numeste cu
operanzi expliciti.
Instructiuni pentru lucrul cu siruri cu operanzi impliciti
Instructiunile pentru lucrul cu siruri care nu are cei doi operanzi
specificati explicit in codul instructiunii se numesc cu operanzi
impliciti.
Deoarece sirurile de date se afla in memorie s-au stabilit perechi
de registre utilizate implicit pentru adresarea datelor curente ale
sirurilor. Daca sirul este de tip destinatie, atunci perechea de
registre de adresare este ES : DI. Daca sirul este de tip sursa,
atunci perechea de registre de adresare este DS : SI. De aceea
registrul DI poarta numele Destination Index iar registrul SI
numele Source Index.

Instructiuni de transfer pentru lucrul cu siruri


Instructiunile MOVS, LODS, STOS
Instructiunile de transfer pentru lucrul cu siruri cu operanzi
expliciti sunt:
MOVS SIRDEST, SIRSURSA - transfer intre doua siruri;
LODS AL, SIRSURSA sau LODS AX, SIRSURSA - transfer din sir in
registru (incarcare registru);
STOS SIRDEST, AL sau STOS SIRDEST, AX transfer din registru in
sir (stocare in memorie);
Instructiunile cu operanzi impliciti pentru siruri de octeti au
formele:
MOVSB - transfer intre doua siruri;
LODSB - transfer din sir in registru (incarcare registru);
STOSB - transfer din registru in sir (stocare in memorie);

iar instructiunile cu operanzi impliciti pentru siruri de octeti au


formele:
MOVSW - transfer intre doua siruri;
LODSW - transfer din sir in registru(incarcare registru);
STOSW - transfer din registru in sir (stocare in memorie);

Prefixul REP
Pentru a reduce timpul de executie in cazul repetarii de N>1 ori a
unei instructiuni pentru lucrul cu siruri s-a introdus prefixul REP.
Punand acest prefix in fata uneia dintre instructiunile pentru lucrul
cu siruri, numita generic instrsir:
REP instr sir
efectul ei devine echivalent cu al secventei:
etich: instrsir
LOOP etich
(necesitand preincarcarea in registrul CX a numarului de repetari).

Instructiuni de comparatie pentru lucrul cu siruri


Instructiunile CMPS si SCAS
Instructiunile de comparatie pentru lucrul cu siruri cu operanzi
expliciti sunt:
CMPS SIRDEST, SIRSURSA - comparatie intre doua siruri;
SCAS SIRDEST, ALsau SCAS SIRDEST, AX comparatie intre sir
"destinatie" si registru;
Instructiunile cu operanzi impliciti pentru siruri de octeti au
formele:
CMPSB - comparatie intre doua siruri;
STOSB - comparatie intre sir "destinatie" si registru;
iar instructiunile cu operanzi impliciti pentru siruri de octeti au
formele:
CMPSW - comparatie intre doua siruri;
STOSW - comparatie intre sir "destinatie" si registru;
Aceste instructiuni au un efect asemanator cu instructiunea de
test CMP (rezultatul nu este incarcat intr-un registru sau stocat in

memorie). De aceea ele sunt folosite in cazul in care se doreste


testarea unor conditii.
Prefixele REPZ, REPE, REPNZ si REPNE
Pentru a reduce timpul de executie in cazul unei repetari de
N>1 ori a unei instructiuni de comparatie pentru lucrul cu
siruri, se poate folosi unul dintre prefixele: REPZ, REPE, REPNZ,
REPNE.
Punand unul dintre aceste prefixe, numit generic REPconditie,
in fata uneia dintre instructiunile de comparatie pentru lucrul
cu siruri, numita generic instrsir:
REPconditie instr sir
efectul ei devine echivalent cu al secventei:
etich: instrsir
LOOPconditie etich
Desfurarea lucrrii :
1. Sa se scrie un program care sa citeasca de la tastatura doua sir
de caractere (incheiate de exemplu prin punct), sa determine
daca sirurile sunt identice sau nu si sa afiseze un mesaj
corespunzator pe ecran.
2. Sa se scrie un program care sa citeasca de la tastatura un sir
de caractere (incheiat de exemplu prin punct) si inca un caracter
pe care sa il compare cu sirul citit anterior, sa determine daca
sirul contine caracterul si daca da pe ce pozitie, si sa afiseze
mesaje rezultatele pe ecran.
1)
#make_COM#
. data ; marcm inceputul segmentului de date
string1 db '1234567890abcde' ;sirul doar pentru
string2 db 'edcba0789654321' ;a verifica programul
.code ;marcheaz nceputul codurilor segment
org 100h ; programa se incepe cu adresa 100h
lea si,string1 ;Adresa oblasti de unde
lea di,string2 ; Adresa oblasti unde
mov cx,15 ; contor pe 15 biti
aa: ; (etaj) comparare octetului curent

repne cmpsb ; asigura repetarea pina la continutul flagului ZF=0,adica in cazul in


care flagul a fost ridicat inseamna ca sirurile nu sunt egale sau (repeta de max N ori
daca octetul current al sirusursa este 0 , identic cu octetu curent al sirului sirdest)
je a1 ; (etaj) continuare daca octetul curent este identic
jmp exit ; se iesa din saltul neconditionat unde pozitia poate fi o
eticheta,registru,variabila
a1: ; (etaj) incarcarea in dl
mov dl,byte ptr [si-1] ; retransmitere a bitilor in dl , daca nu este segment in
registrul specificat , atunci vor fi utilizate de catre dl
mov ah,2 ; 0 se scrie in ah , ah = 2
int 21h ; intrerupere ,apeleaza functia DOS
cmp cx,0 ; compara cx cu 0
je aa ; (etaj) continuare daca ultimii octeti comparati sunt identici
exit: ; iesire
mov ah,0 ; 0 se scrie in ah , ah = 0
int 21h ; intrerupere ,apeleaza functia DOS
mov ax,4c00h ; incheierea programului (4c-numarul functiei , 00 returnarea
valorii)
int 21h ; intrerupere ,apeleaza functia DOS
end ; sfirsitul
2)
#make_COM#
ORG 100h ; programa se incepe cu adresa 100h
.DATA ; marcm inceputul segmentului de date
Buf DB 254, 0, 255 DUP (0) ;rezerveaz 254 ,0,255 bii , fiecare din ei se
restabilete
Buf1 DB 254, 0, 255 DUP (0) ; rezerveaz 254 ,0,255 bii , fiecare din ei se
restabilete
text db 'Yes$' ; text
text1 db 'No$' ; text
.CODE
;marcheaz nceputul codurilor segment
mov AX, @data ; copiem adresa
mov DS, AX ; DS = AX
mov ES, AX ; ES = AX
mov dx, offset Buf ;citim primul ir de la tastatur
mov AH, 0ah ; inscrie datele in buffer ,determina lungimea maximala textului
int 21h; intrerupere ,apeleaza functia DOS
mov al,10 ; copiem in al cifra 10 , al = 10
int 21h; intrerupere ,apeleaza functia DOS

mov dx, offset Buf1 ; adresa bufferului pentru inscrierea primul ir de la tastatur
mov AH, 0ah ; inscrie datele in buffer ,determina lungimea maximala textului
int 21h ; intrerupere ,apeleaza functia DOS
mov al,10 ; copiem in al cifra 10 , al = 10
int 21h ; intrerupere ,apeleaza functia DOS
cmp cl,Buf1+1 ; daca au fost controlate Buf1+1 , iesim din ciclu si trecem la
prelucrarea inscrierii
jnz not_equal ; daca ZF=0 el salteaza la not_equal
mov di,offset Buf+2 ; ES:DI , adresa mesajului bufferului Buf+2
mov si,offset Buf1+2 ; DS:SI adresa primului sir
repe cmpsb ; {ds:si es:di},Comparare pina cind simbolurile coincid , nu mai mult
de CX ori
jnz not_equal ; daca ZF=0 el salteaza la not_equal
equal: ; este egal
mov dx,offset text ; bufferul in care de introdus
mov ah,9 ; Inscriem in (ah) , ah = 9
int 21h ; intrerupere , apeleaza functia DOS
not_equal: ; nu este egal
mov dx,offset text1 ; indica adresa de pornire,loc de memorie pentru text
mov ah,9 ; Inscriem in (ah) , ah = 9
int 21h; intrerupere , apeleaza functia DOS
exit: ;ieire
xor ax,ax;reseteaz registrul ax mai rapid ca mov ax,0
int 21h; intrerupere , apeleaza functia DOS
mov ax,4c00h ;incheierea programului (4c-numarul functiei , 00 returnarea
valorii)
int 21h; intrerupere , apeleaza functia DOS
END ; sfrit
Screenshot :
1)

2.1)

2.2)

Concluzie:
n aceast lucrare de laborator am fcut cunotin cu instruciunile pentru iruri
(CMPSB, REPE,REPNE ,MOVSW).Am aflat diferenele intre MOV i MOVSW ;
CMP i CMPS etc.Am scris codurile n Emu 8086 cu ajutorul internetului i
programei.
Intrebri :
1. Care sunt perechile de registre utilizate implicit la adresare de
instructiunile pentru lucrul cu siruri ?
DS : SI - ir , din care se efectueaz copierea;
ES : DI ir , n care se efectueaz copierea,nceputul irului sau indic ultimul
bit al irului;
DS : AX = indicator la primul ir copiat;
DS : BX = indicator la al doilea ir copiat,nceputul adresei de completare;
DS:DI indic irul.
2. Care sunt registrele utilizate implicit de instructiunile pentru
lucrul cu siruri LODS, STOS si SCAS ?
Registrele care
urmtoare :

se

utilizeaz

cu

instruciunile

date

sunt

AX/AL(Valoarea scanrii , receptor pentru LODS,surs pentru


STOS);
DF(0-automat se mrete SI,DI ,1-automat se micoreaz
SI,DI);
ZF(semn de sfritul scanrii sau comparrii);
CX (contor de repetri);
DI(mutarea ir-receptor);
SI(mutarea ir-surs).
3. Care sunt asemanarile si care sunt deosebirile intre efectul
instructiunii LOOP si efectul prefixului REP ?
Instruciunea REP lucreaz ca i LOOP , diferena ntre ele este
c :
REP se utilizeaz numai cu irurile pe cnd LOOP este
standart pentru toate;
REP n-are new de etichet;
REP poate lucra cu comenzile de iruri MOVSB , LODSW etc;
Ambele comenzi lucreaz cu registrul CX.
4. Care sunt asemanarile si care sunt deosebirile intre efectul
instructiunii LOOPE si efectul prefixului REPE ?
REPE se folosete doar pentru iruri;
REPE l putem utiliza mpreun cu comenzile CMPSW, SCASB etc;
Ambele comenzi lucreaz i cu CX i cu bifa ZF;
n cazul cu REPE , dac CX <> 0 , atunci CX = CX -1 ; dac ZF = 1 , atunci se
intoarce la CX altfel ieim din comanda REPE;
n cazul cu LOOPE , dac CX <> 0 , atunci CX = CX -1 ; dac ZF = 1 , atunci
se face trece mai de parte sau nu se face i se continue ciclul.

Вам также может понравиться