12.04.23Universitatea "1 Decembrie 1918" Alba Iulia1
Instrucţiunile comune Instrucţiunile comune ale familiei de ale familiei de
microprocesoare microprocesoare INTEL 80X86 INTEL 80X86
(Cursul 3)(Cursul 3)
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia2
IntroducereIntroducere 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
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia3
IntroducereIntroducere 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
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia4
Instrucţiuni Assembler comune 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
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia5
Instrucţiuni Assembler comune 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 (regreg, memreg şi reg mem) sau a dată imediată, atragem atenţia că nu se pot face transferuri memmem (un astfel de transfer se poate face prin doua instrucţiuni de transfer, una memreg şi una reg mem)
Formatul de bază al instrucţiunii este:
MOV <Size> reg/mem, <Size> reg/mem
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia6
Instrucţiuni Assembler comune 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,NumeMOV SI,offset SubnumeMOV ES,AXMOV DS,AXMOV AH,[BX+05]MOV byte ptr TEST,45h
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia7
Instrucţiuni Assembler comune 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 AXExemplu: XCHG BP ; Execută swaps AX BP
XCHG reg1,reg2 Interschimbă conţinutul lui reg1 cu cel al registrului reg2Exemplu: 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 memExemplu: XCHG DX,Data1 ; Execută swaps DX
Data1
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia8
Instrucţiuni aritmetice 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) – 1INC/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
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia9
Instrucţiuni aritmetice 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,dataExemple:ADD AL,55h ; Rezultatul în AL
ADD AX,7E45h ; Rezultatul în AXADD BX,0140h ; Rezultatul în BX
ADD mem,dataExemplu:
ADD word ptr Data1,0077h ; Rezultatul în cuvântul din Data1
ADD reg,memExemplu: ADD CX,Data1 ; Rezultatul în CX
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia10
Instrucţiuni aritmetice Instrucţiuni aritmetice Instrucţiunea de adunare (ADD)
ADD mem,regExemplu: ADD Data1,AL ; Rezultatul în octetul din Data1
ADD reg,regExemple:ADD DX,CX ; Rezultatul în DX
ADD CH,BL ; Rezultatul în CHADD 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
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia11
Instrucţiuni aritmetice 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 = RestulExemplu:
MOV BL,03 ; Mută valoarea 03 în BLMOV AX,07 ; Mută valoarea 07 în AXDIV BL ; Împarte conţinutul lui AX cu conţinutul lui BL şi
; rezultatul se obţine în AX astfel: AH = 01 şi AL = 02
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia12
Instrucţiuni aritmetice 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 AXMOV DX,07 ; Mută valoarea 07 în DXMOV CX,50000 ; Mută valoarea 50000 în CXDIV 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.04.23Universitatea "1 Decembrie 1918" Alba Iulia13
Instrucţiuni aritmetice 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 DLMOV AL,04 ; Mută valoarea 04 în ALMUL DL ; Înmulţeşte conţinutul lui AL cu conţinutul
; lui DL şi rezultatul se obţine în AL = 08
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia14
Instrucţiuni aritmetice 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:AXExemplu:
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 CXMOV JosData,AX ; Culege în JosData val. low a rezultatuluiMOV SusData,DX ; Culege în SusData val. high a rezultatului
; Rezultatul este : 00207060h
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia15
Instrucţiuni logice Instrucţiuni logice Instrucţiunile şi/sau (AND/OR) Ambele au patru moduri diferite de operare:
AND/OR reg,data ; Rezultatul în regExemplu: 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ă
BXAND/OR reg1,reg2 ; Rezultatul în reg1
Exemplu: OR DH,CL ; Execută SAU logic între DH şi ; conţinutul registrului CL iar rezultatul este dat în DH
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia16
Instrucţiuni logice 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 CHOR 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’
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia17
Instrucţiuni de manipulare a biţilorInstrucţiuni de manipulare a biţilor Instrucţiuni de deplasare şi rotaţii (SHL, ROL, …) Au două moduri de operare:
SHL/SHR/ROL/ROR reg/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 2ROR AL,1 ; AL = 0001 1001 binar
SHL/SHR/ROL/ROR reg/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 = 02hSHR AL,CL ; AL = 0000 0110 binar = 06h = 19h / 4ROL AL,CL ; AL = 0001 1000 binar
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia18
Instrucţiuni de manipulare a biţilorInstrucţ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
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia19
Instrucţiunile de comparare şi Test 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
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia20
Instrucţiunile de comparare şi Test Instrucţiunile de comparare şi Test Instrucţiunea de comparare (CMP) Are 4 moduri de operare:CMP reg,data CMP mem,regCMP reg,mem CMP reg,regEx: Pentru cel mai întâlnit caz (utilizând ZF)
MOV AX,Data1 ; Culege Data1 în registrul AXCMP AX,0303h ; Compară conţinutul lui AX cu val. 0303hJZ Eticheta1 ; DA: Dacă sunt egale salt la Eticheta1 MOV CX,0FFFFh; NU: Dacă nu se execută următ. instrucţiuneJMP Eticheta2 ; Salt necondiţionat la Eticheta2…………………………
Eticheta1: MOV CX,0AAAAh ; Mută valoarea AAAAh în CX…………………………
Eticheta2: ………………………… (Restul programului)
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia21
Instrucţiunile de comparare şi Test 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: TESTreg/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
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia22
Instrucţiuni pe şiruri de caractere 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-altaLODSB/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)
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia23
Instrucţiuni pe şiruri de caractere 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)
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia24
Instrucţiuni pe şiruri de caractere 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
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia25
Instrucţiuni iterative 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
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia26
Instrucţiuni iterative 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
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia27
Instrucţiuni specifice stivei 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ţiPUSH 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
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia28
Instrucţiuni specifice stivei 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:
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia29
Instrucţiuni specifice stivei 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
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia30