Documente Academic
Documente Profesional
Documente Cultură
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:
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
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)
29
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
30
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09