Sunteți pe pagina 1din 30

Instrucţiunile comune

ale familiei de
microprocesoare
INTEL 80X86
(Cursul 3)

1
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Introducere
 Subiectele prelegerii:
 În cursul anterior operaţiile de bază ale unui sistem cu
microprocesor au fost prezentate cu accent pe înregistrarea
şi adresarea memoriei interne
 Pe parcursul acestui curs vom vedea mai multe detalii, de
la maniera în care utilizatorul este capabil să utilizeze
sistemul de programare al microprocesorului, până
satisfacerea dorinţei de utilizare a întregului set de
instrucţiuni al CPU
 Fiecare CPU are un set de bază de instrucţiuni cod maşină
care implementează un set de operaţii logice care se doresc
a fi executate

2
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Introducere
 Subiectele prelegerii:
 Familia de microprocesoare INTEL 80X86 suportă un set
foarte larg de instrucţiuni, unele relativ complexe, în
consecinţă sunt privite ca CISC (Complex Instruction Set
Computer) spre deosebire de microprocesoarele RISC
(Reduced Instruction Set Computer)
 Pe parcursul acestui curs (la fel ca şi în cursul general) noi
vom opri doar asupra unui subset de instrucţiuni aflate la
dispoziţie
 Totuşi, o data învăţate aceste instrucţiuni pot deveni
elementele de bază în conceperea şi realizare unor exemple
simple de programe în limbaj de asamblare

3
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Instrucţiuni Assembler comune
 Formatul instrucţiunilor Assembler
 Formatul poate varia depinzând de utilizarea particulară a
instrucţiunilor, totuşi, în general instrucţiunile sunt prezentate
în următoarea formă:
Instrucţiune Registru/Dată, Registru/Dată
Exemplu: MOV AX,51h
 La compilare asamblorul transformă instrucţiunile în
echivalentul binar al instrucţiunilor cod maşină, care sunt între
1 şi 6 octeţi lungime
 Aceste instrucţiuni în cod binar sunt de nediferenţiat de datele
binare aflate în memorie, de aceia cade în sarcina utilizatorului
să se asigure că CPU execută instrucţiuni din program

4
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Instrucţiuni Assembler comune
 Instrucţiunea de transfer (MOV)
• Instrucţiunea MOV este utilizată pentru transferul
(copierea) unui element individual de dată din spaţiul de adrese
al familiei 80X86 şi este cea mai comună instrucţiune
 • Elementul de dată poate fi transferat între două registre,
între o zonă de memorie şi un registru (reg⇒reg, mem⇒reg şi
reg⇒ mem) sau a dată imediată, atragem atenţia că nu se pot
face transferuri mem⇒mem (un astfel de transfer se poate face
prin doua instrucţiuni de transfer, una mem⇒reg şi una reg⇒
mem)
 • Formatul de bază al instrucţiunii este:
MOV <Size> reg/mem, <Size> reg/mem

5
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Instrucţiuni Assembler comune
 Instrucţiunea de transfer (MOV)
 Se utilizează la:
 - Încărcarea registrelor cu date sau pointeri de adrese,
 - Memorarea valorilor în zone specificate din memorie,
 - Memorarea rezultatelor în memorie,
 - Setarea parametrilor pentru întreruperi şi bucle,
 - Copierea şirurilor în memoria video etc.
Exemple: MOV AX,0B800h
MOV CL,Nume
MOV SI,offset Subnume
MOV ES,AX
MOV DS,AX
MOV AH,[BX+05]
MOV byte ptr TEST,45h
6
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Instrucţiuni Assembler comune
 Instrucţiunea de interschimb (XCHG)
 Instrucţiunea XCHG poate fi utilizată pentru interschimbarea
datelor, în trei formate:
XCHG reg
 Interschimbă conţinutul lui reg cu cel al registrului AX
Exemplu: XCHG BP ; Execută swaps AX ⇔ BP
XCHG reg1,reg2
 Interschimbă conţinutul lui reg1 cu cel al registrului reg2
Exemplu: XCHG SI,DI ; Execută swaps SI ⇔ DI
XCHG ES,DS ; Execută swaps ES ⇔ DS
XCHG reg,mem
 Interschimbă conţinutul lui reg cu cel conţinut în mem
Exemplu: XCHG DX,Data1 ; Execută swaps DX ⇔ Data1
7
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Instrucţiuni aritmetice
 Instrucţiunile INC/DEC
 Instrucţiunile INC/DEC au două moduri de operare :
INC/DEC reg
 Incrementează sau decrementează pe reg cu unu (dacă dă zero
atunci ZF=1)
Exemple: INC SI ; (SI) = (SI) + 1
DEC DI ; (DI) = (DI) – 1
INC/DEC mem
 Incrementează sau decrementează conţinutul locaţiei mem cu
unu (dacă dă zero atunci ZF=1)
Exemple: INC byte ptr Data1 ; Incrementează octetul Data1 cu 1
DEC word ptr Data2 ; Consideră Data2 & Data2 + 1 ca
; o valoare pe cuvânt şi pe care
; o decrementează cu 1
8
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Instrucţiuni aritmetice
 Instrucţiunea de adunare (ADD)
 Instrucţiunea ADD are de asemenea u mod strict de operare :
 Notă: Instrucţiunea următoare ADD X,Y furnizează
rezultatul în X
ADD reg,data
Exemple: ADD AL,55h ; Rezultatul în AL
ADD AX,7E45h ; Rezultatul în AX
ADD BX,0140h ; Rezultatul în BX
ADD mem,data
Exemplu:
ADD word ptr Data1,0077h ; Rezultatul în cuvântul din Data1
ADD reg,mem
Exemplu: ADD CX,Data1 ; Rezultatul în CX
9
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Instrucţiuni aritmetice
 Instrucţiunea de adunare (ADD)
ADD mem,reg
Exemplu: ADD Data1,AL ; Rezultatul în octetul din Data1
ADD reg,reg
Exemple: ADD DX,CX ; Rezultatul în DX
ADD CH,BL ; Rezultatul în CH
ADD AL,AH ; Rezultatul în AL
 Notă: Nu este posibilă efectuarea unei adunări între două zone
de memorie:
ADD Data1,Data2 Este o ilegal instruction
CPU trebuie să utilizeze un registru la instrucţiunea de
adunare

10
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Instrucţiuni aritmetice
 Instrucţiunea de împărţire (DIV)
 Are două moduri de operare: modul pe 8 sau 16 biţi
DIV reg
 modul pe 8 biţi ⇒ Împarte conţinutul lui AX la reg
 modul pe 16 biţi ⇒ Împarte conţinutul registrului dublu
AX:DX la reg
 În modul pe 8 biţi:

DIV BL ; Rezultatul în: AL = Câtul şi AH = Restul


Exemplu:
MOV BL,03 ; Mută valoarea 03 în BL
MOV AX,07 ; Mută valoarea 07 în AX
DIV BL ; Împarte conţinutul lui AX cu conţinutul lui BL şi
; rezultatul se obţine în AX astfel: AH = 01 şi AL = 02
11
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Instrucţiuni aritmetice
 Instrucţiunea de împărţire (DIV)
 În modul pe 16 biţi:
DIV CX ; Conţinutul registrului dublu DX:AX se
împarte la CX ; Rezultatul în: AX = Câtul şi DX = Restul
Exemplu:
MOV AX,41252 ; Mută valoarea 41252 în AX
MOV DX,07 ; Mută valoarea 07 în DX
MOV CX,50000 ; Mută valoarea 50000 în CX
DIV CX ; Împarte conţinutul registrului dublu
; DX:AX cu conţinutul lui CX şi
; rezultatul se obţine în registrul dublu
; DX:AX astfel: AX = 000A şi
; restul DX = 0004
 Notă: Este o împărţire întreagă, pentru împărţire fracţionară
se utilizează aritmetica în virgulă mobilă
12
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Instrucţiuni aritmetice
 Instrucţiunea de înmulţire (MUL)
 Are două moduri de operare: modul pe 8 sau 16 biţi
MUL reg
 modul pe 8 biţi ⇒ Înmulţeşte conţinutul lui AL cu reg şi da
rezultatul în AX
 modul pe 16 biţi ⇒ Înmulţeşte conţinutul registrului AX cu reg
şi dă rezultatul în registrul dublu DX:AX
 În modul pe 8 biţi:
MUL DL ; Rezultatul în AX = AL x DL (sau în AL dacă
; nu-i peste un octet)
Exemplu:
MOV DL,02 ; Mută valoarea 02 în DL
MOV AL,04 ; Mută valoarea 04 în AL
MUL DL ; Înmulţeşte conţinutul lui AL cu conţinutul
; lui DL şi rezultatul se obţine în AL = 08
13
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Instrucţiuni aritmetice
 Instrucţiunea de înmulţire (MUL)
 În modul pe 16 biţi (N.B. 16 biţi x 16 biţi = 32 biţi rezultatul):
MUL CX ; Rezultatul în registrul dublu DX:AX
Exemplu:
MOV CX,1020h ; Mută valoarea 1020h în CX (Înmulţitorul)
MOV AX,0203h ; Mută valoarea 0203h în AX (De înmulţitul)
MUL CX ; Rezultatul în DX:AX = AX x CX
MOV JosData,AX; Culege în JosData val. low a rezultatului
MOV SusData,DX ; Culege în SusData val. high a rezultatului
; Rezultatul este : 00207060h

14
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Instrucţiuni logice
 Instrucţiunile şi/sau (AND/OR)
 Ambele au patru moduri diferite de operare:
AND/OR reg,data ; Rezultatul în reg
Exemplu: AND AX,0302h ; Execută SI logic între AX şi
; valoarea 0302h, rezultatul în AX
AND/OR mem,reg ; Rezultatul în mem
Exemplu: OR Data1,CL ; Execută SAU logic între Data1 şi
; conţinutul registrului CL iar rezultatul este dat în Data1
AND/OR reg,mem ; Rezultatul în reg
Exemplu: AND BX,Data1 ; Execută SI logic între BX şi
; valoarea din Data1 şi rezultatul se dă BX
AND/OR reg1,reg2 ; Rezultatul în reg1
Exemplu: ORDH,CL ; Execută SAU logic între DH şi
; conţinutul registrului CL iar rezultatul este dat în DH
15
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Instrucţiuni logice
 Instrucţiunile şi/sau (AND/OR)
 Instrucţiunea AND poate fi folosită pentru ştergeri particulare de
biţi (mascări de biţi, eliminarea cu ajutorul măştilor a biţilor
nedoriţi)
 Ex: MOV AL,45h ; Mută val. 45h, adică ‘0100 0101’ b. în AL
AND AL,0Fh ; Execută un SI logic între conţinutul
; registrului AL şi 0Fh adică ‘0000 1111’ binar (masca) şi AL va
; conţine după operaţie valoarea binară ‘0000 0101’ adică 05h
 Similar, instrucţiunea OR poate fi folosită pentru setări particulare
de biţi (introducerea cu ajutorul măştilor a biţilor necesari)
 Ex: MOV CH,05h ; Mută val.05h adică ‘0000 0101’ b.în CH
OR CH,30h ; Execută un SAU logic între conţinutul reg. CH şi
; 30h adică ‘0011 0000’ binar (masca) şi CH va conţine după
; operaţie valoarea binară ‘0011 0101’ adică 35h şi care
; corespunde codului ASCII al caracterului afişabil ‘5’

16
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Instrucţiuni de manipulare a biţilor
 Instrucţiuni de deplasare şi rotaţii (SHL, ROL, …)
 Au două moduri de operare:
SHL/SHR/ROL/RORreg/mem,1
(Shift Left/Shift Right/Rotate Left/Rotate Right cu un bit)
Ex: MOV AL,19h ; AL = 0001 1001 binar
SHL AL,1 ; AL = 0011 0010 binar = 32h = 19h x 2
ROR AL,1 ; AL = 0001 1001 binar
SHL/SHR/ROL/RORreg/mem,CL
(Shift Left/Shift Right/Rotate Left/Rotate Right cu un CL biţi)
Ex: MOV AL,19h ; AL = 0001 1001 binar
MOV CL,02 ; Valoarea contorului CL = 02h
SHR AL,CL ; AL = 0000 0110 binar = 06h = 19h / 4
ROL AL,CL ; AL = 0001 1000 binar
17
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Instrucţiuni de manipulare a biţilor
 Instrucţiuni de rotaţii cu Carry (RCL,RCR)
 Au două moduri de operare:

RCL/RCR reg/mem,1
(Rotate Left utilizând Carry/Rotate Right utilizând CF cu 1 bit)
RCL/RCR reg/mem,CL
(Rotate Left utilizând Carry/Rotate Right utiliz. CF cu CL biţi)
Ex: MOV AL,19h ; AL = 0001 1001 binar
MOV CL,02 ; Valoarea contorului CL = 02h
RCL AL,1 ; AL = 0011 0011 binar, CF = 0
RCR AL,CL ; AL = 1000 1100 binar, CF = 1
18
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Instrucţiunile de comparare şi Test
 Instrucţiunea de comparare (CMP)
 Se utiliz. pentru compararea a 2operanzi care au aceiaşi lungime
 Nici unul din operanzii aflaţi în locaţii nu sunt afectaţi de
operaţia de comparare
 Instrucţiunea CMP AA,BB execută o pseudo scădere a lui BB
din AA şi setează indicatorii CF, ZF, SF şi PF ca şi când o
instrucţiune SUB s-ar fi efectuat, astfel încât salturile
condiţionale pot fi realizate bazându-se pe rezultatele din
indicatorii de condiţii

19
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Instrucţiunile de comparare şi Test
 Instrucţiunea de comparare (CMP)
 Are 4 moduri de operare:
CMP reg,data CMP mem,reg
CMP reg,mem CMP reg,reg
Ex: Pentru cel mai întâlnit caz (utilizând ZF)
MOV AX,Data1 ; Culege Data1 în registrul AX
CMP AX,0303h ; Compară conţinutul lui AX cu val. 0303h
JZ Eticheta1 ; DA: Dacă sunt egale salt la Eticheta1
MOV CX,0FFFFh; NU: Dacă nu se execută următ. instrucţiune
JMP Eticheta2 ; Salt necondiţionat la Eticheta2
…………………………
Eticheta1: MOV CX,0AAAAh ; Mută valoarea AAAAh în CX
…………………………
Eticheta2: ………………………… (Restul programului) 20
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Instrucţiunile de comparare şi Test
 Instrucţiunea de testare (TEST)
 Execută o operaţie AND pentru a determina dacă anumiţi biţi
dintr-un registru sunt setaţi pe 1
 La fel ca şi la operaţiunea de comparare, datele din registrul în
care se află operandul, nu sunt afectate de operaţia AND ci
numai indicatorii de condiţii SF, ZF sau OF sunt afectaţi (de
asemenea OF şi CF sunt totdeauna resetaţi la zero)
 Un singur mod:
 TEST reg/data
 Ex: MOV AX,13ACH ; AX = 0001 0011 1010 1100 binar
 TEST AX,0040h ; Se compară conţinutul lui AX cu val.
; bin. 0000 0000 0100 0000 (făra a se afecta conţinutul lui AX)
; Rezultatul lui AND ar fi 0000 0000 0000 0000 şi
; după operaţia de TEST avem poziţionaţi indicatorii
; de condiţii astfel: SF = 0, PF = 1, ZF = 1
21
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Instrucţiuni pe şiruri de caractere
 Instrucţiuni de transfer al şirurilor (LODS, STOS, …)
 Utilizate pentru transferul blocurilor de date dintr-o zonă de
memorie RAM într-alta
LODSB/W
 LODSB ⇒ încarcă un octet (byte) al unei date aflate la adresa
de memorie dată de DS:SI în registrul AH şi incrementează sau
decrementează conţinutul registrului SI cu valoarea 1,
depinzând de valoare indicatorului de condiţii DF (dacă DF = 0
(CLD) atunci se incrementează SI, iar dacă DF = 1 (STD) atunci
se decrementează SI)
 LODSW ⇒ încarcă un cuvânt (word) al unei date aflate la
adresa de memorie dată de DS:SI (primul octet al cuvântului) şi
DS:SI+1(al doilea octet al cuvântului) în registrul AX şi
incrementează sau decrementează conţinutul registrului SI cu
valoarea 2, depinzând de valoare indicatorului de condiţii DF
(dacă DF = 0 (CLD) atunci se incrementează SI, iar dacă DF = 1
(STD) atunci se decrementează SI)
22
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Instrucţiuni pe şiruri de caractere
 Instrucţiuni de transfer al şirurilor (LODS, STOS, …)
 STOSB/W
 STOSB ⇒ stochează octetul (byte) din registrul AH într-o
zonă de memorie aflată la adresa de memorie dată de ES:DI şi
incrementează sau decrementează conţinutul registrului DI cu
valoarea 1, depinzând de valoare indicatorului de condiţii DF
(dacă DF = 0 (CLD) atunci se incrementează DI, iar dacă DF =
1 (STD) atunci se decrementează DI)
 STOSW ⇒ stochează cuvântul (word) din registrul AX într-o
zonă de memorie aflată la adresa de memorie dată de ES:DI
(primul octet al cuvântului) şi ES:DI+1(al doilea octet al
cuvântului) şi incrementează sau decrementează conţinutul
registrului DI cu valoarea 2, depinzând de valoare indicatorului
de condiţii DF (dacă DF = 0 (CLD) atunci se incrementează DI,
iar dacă DF = 1 (STD) atunci se decrementează DI)
23
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Instrucţiuni pe şiruri de caractere
MOVSB/W
MOVSB ⇒ copiază un octet (byte) al unei date aflate la adresa de
mem.dată de DS:SI într-o altă zonă de date a cărei adresă este
dată de ES:DI şi incrementează sau decrementează conţinutul
reg. SI şi DI cu valoarea 1, depinzând de valoare indicatorului
de condiţii DF (dacă DF = 0 (CLD) atunci se incrementează SI şi
DI, iar dacă DF = 1 (STD) atunci se decrementează SI şi DI)
MOVSW ⇒ copiază un cuvânt (word) al unei date aflate la adresa
de mem. dată de DS:SI (primul octet al cuvântului) şi DS:SI+1
(al doilea octet al cuvântului) într-o altă zonă de date a cărei
adr. este dată de ES:DI (primul octet al cuv.) şi ES:DI+1(al
doilea octet al cuv.) şi incrementează sau decrementează
conţinutul reg. SI şi DI cu val. 2, depinzând de val. indicatorului
de condiţii DF (dacă DF = 0 (CLD) atunci se incrementează SI şi
DI, iar dacă DF = 1 (STD) atunci se decrementează SI şi DI)
În mod curent aceste instrucţiuni se folosesc alături de instrucţ.
LOOP sau REP, de exemplu pentru copierea unor şiruri ASCII
în memoria video RAM la afişarea mesajelor 24
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Instrucţiuni iterative
Instrucţiunea de repetare (REP)
 Se foloseşte pentru a repeta un şir de instrucţiuni de CX ori
Exemple: REP LODSB sau REP LODSW
REP STOSB sau REP STOSW
REP MOVSB sau REP MOVSW
 CX este decrementat de fiecare când se execută şirul de
instrucţiuni şi odată ce CX ajunge să conţină valoarea 0 (ZF = 1)
repetarea este abandonată şi programul continuă în secvenţă
 De exemplu, pentru copierea a 10 caractere din Text1 în Text2:

MOV SI, offset Text1; Culege adr. Rel. a lui Text1 în reg. SI
MOV DI, offset Text2 ; Culege adr. Rel. a lui Text2 în reg. DI
MOV CX, 10 ; Încarcă numărul de repetări (10 octeţi)
REP MOVSB ; Copiere 10 octeţi de la DS:SI la ES:DI
25
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Instrucţiuni iterative
Instrucţiunea de buclare (LOOP)
 Se fol. pentru a exec. într-un ciclu un set de instrucţ. de CX ori
 Ca şi la instrucţiunea REP, conţinutul registrului CX este
decrementat de fiecare când se execută în mod ciclic setul de
instrucţiuni şi odată ce CX ajunge să conţină valoarea 0 (ZF = 1)
se iese din ciclu şi programul continuă în secvenţă
 Dacă este nevoie ca registrul CX să fie utilizat în corpul ciclului
(în setul de instrucţiuni care trebuie repetat) atunci conţinutul
registrului CX trebuie salvat în stivă:
MOV CX,10 ; Încarcă numărul de ciclări
Ciclu: PUSH CX ; Salv. conţinutul contorului de ciclare în stivă
MOV CX,5000h ; Se utilizează reg. CX în alte scopuri
; în ciclu (CX se alterează)
CALL IesireMON; Apelul procedurii IesireMON
POP CX ; Reface conţ. contorului CX (necesar ciclării)
LOOP Ciclu ; Repetă bucla de 10 ori
26
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Instrucţiuni specifice stivei
Instrucţiunile de încărcare&descărcare a stivei (PUSH, POP)
 Se fol. pentru copierea datelor la nivel de registru în şi din stivă
PUSH reg - copierea conţinutului registrului reg în vârful
stivei (încărcare (salvare) în stivă)
POP reg - copierea valorii din vârful stivei în registrul
reg (descărcare (restaurare) din stivă)
 Aceste operaţii se pot efectua pe 8 sau 16 biţi

PUSH AH ; Salvarea octetului hight din AX în stivă


POP BX ; Descărcarea unei valori de 16 biţi din vârful
; stivei în registrul BX
Notă: Trebuie să fim totdeauna atenţi la salvările şi restaurările
din stivă, deoarece restaurările se fac în ordine inversă a
salvărilor

27
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Instrucţiuni specifice stivei
Instrucţiunile de încărcare şi descărcare a stivei (PUSH, POP)
 Când se utilizează apelul unei proceduri cu CALL:

28
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Instrucţiuni specifice stivei
Instrucţiunile de încărcare şi descărcare a stivei (PUSH, POP)

 Dacă instrucţiunea POP AX nu a fost dusă la îndeplinire (fie s-


a efectuat un salt peste ea, fie a uitat-o programatorul s-o
introducă) în cadrul procedurii apelate, atunci instrucţiunea
RET iniţiază un salt la adresa indicată de conţinutul lui AX
(conţinut interpretat drept IP)
 Evident, acest lucru trebuie evitat (în afară de cazul când este
făcut în mod deliberat, de programator, cu un scop precis)
deoarece poate duce la blocaje de sistem

29
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
30
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09

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