MINISTERUL EDUCAȚIEI, CULTURII ȘI CERCETĂRII AL REPUBLICII MOLDOVA I.P CENTRUL DE EXCELENȚĂ ÎN ENERGETICĂ ȘI ELECTRONICĂ Catedra ” Sisteme informaţionale”
Raport Lucrarea de laborator nr. 2 La disciplina: Microprocesoare si Microcontrolere Tema: „Setul de instruct,iuni al familiei de procesoare Intel x86”
A efectuat elevul gr. AI-0115:
/________/ Deșcan Victor
A verificat profesorul:
/________/ Negară Eugeniu
Data prezentării: _______________
Chișinău 2019
1. Scopul lucrarii; Studierea structurii unui sistem de calcul: Familia Intel x86; Arhitectura setului de instrucțiuni; Organizarea memoriei; In cadrul acestei lucrări se prezintă o primă parte din instrucțiunile limbajului de asam-blare al procesoarelor Intel x86 (varianta pe 32 bit). Restul instrucțiunilor vor i prezen-tate în lucrarea următoare. În prima parte a lucrării se prezintă sintaxa generală a unei instrucțiuni de asamblare și câteva reguli de scriere a programelor. În partea practică a lucrării se vor scrie programe cu instrucțiunile prezentate și se va analiza efectul execuției acestora. 2. Desfăşurarea lucrării; 1) Am prezentat setul de instrucțiuni al familiei de procesoare Intel x86 Instrucţiunile PUSH şi POP au sintaxa PUSH s şi push eax
sub esp, 4
POP d
; pregătim (alocăm) spaţiu pentru a stoca
valoarea mov [esp], eax ; stocăm valoarea in locaţia alocată pop eax
mov eax, [esp] ; încărcăm în eax valoarea din vârful stivei add esp, 4
; eliberăm locaţia
Instrucţiunea XCHG permite interschimbarea conţinutului a doi operanzi de aceeaşi dimensiune (octet, cuvânt sau dublucuvânt), cel puţin unul dintre ei trebuind să fie registru. Sintaxa ei este XCHG operand1, operand2 Instrucţiunea XLAT "traduce" octetul din AL într-un alt octet, utilizând în acest scop o tabelă de corespondenţă creată de utilizator, numită tabelă de translatare. Instrucţiunea are sintaxa [reg_segment]
XLAT
De exemplu, secvenţa mov ebx, Tabela mov al,6 ES xlat
AL < ES:[EBX+6] >
Instrucţiunea de transfer al adreselor LEA
Instrucţiunea LEA (Load Effective Address) transferă deplasamentul operandului din memorie mem în registrul destinaţie. De exemplu lea
eax,[v]
lea
eax,[ebx+v-6]
mov eax, ebx+v-6 Exemplu: inmulţirea unui număr cu 10 mov eax, [număr]
; eax <- valoarea variabilei număr ; eax <- număr * 2
lea eax, [eax * 2]
lea eax, [eax * 4 + eax] ; eax <- (eax * 4) + eax = eax * 5 = (număr * 2) * 5
Instrucţiuni asupra flagurilor
Instrucţiunea LAHF (Load register AH from Flags) copiază indicatorii SF, ZF, AF, PF şi CF din registrul de flag-uri în biţii 7, 6, 4, 2 şi respectiv 0 ai registrului AH. Conţinutul biţilor 5,3 şi 1 este nedefinit. Indicatorii nu sunt afectaţi în urma acestei operaţii de transfer (în sensul că instrucţiunea LAHF nu este ea însăşi generatoare de efecte asupra unor flag-uri – ea doar transferă valorile flag-urilor şi atât). Instrucţiunea SAHF (Store register AH into Flags) transferă biţii 7, 6, 4, 2 şi 0 ai registrului AH în indicatorii SF, ZF, AF, PF şi respectiv CF, înlocuind valorile anterioare ale acestor indicatori. Instrucţiunea PUSHF transferă toţi indicatorii în vârful stivei (conţiunutul registrului Flags se transferă în vârful stivei). Indicatorii nu sunt afectaţi în urma acestei operaţii. Instrucţiunea POPF extrage cuvântul din vârful stivei şi transferă din acesta indicatorii corespunzători în registrul de flag-uri. Instrucţiuni de conversie (distructivă) Instrucţiunea CBW converteşte octetul cu semn din AL în cuvântul cu semn AX (extinde bitul de semn al octetului din AL la nivelul cuvântului din AX, modificând distructiv conţinutul registrului AH). De exemplu, mov al, -1 ; AL = 0FFh cbw valoarea cuvânt -1 din AX (0FFFFh).
;extinde valoarea octet -1 din AL în
Instrucţiunea JMP
Instrucţiunea de salt necondiţionat JMP are sintaxa
JMP operand
unde operand este o etichetă, un registru sau o variabilă de memorie ce conţine o adresă. Efectul ei este transferul necondiţionat al controlului la instrucţiunea ce urmează
etichetei, la adresa dată de valoarea registrului sau constantei, respectiv la adresa conţinută în variabila de memorie. De exemplu, după execuţia secvenţei mov ax,1 jmp AdunaUnu: inc jmp
AdunaDoi eax urmare
AdunaDoi: add
eax,2
urmare:
.
.
.
Instrucţiunile CALL şi RET
Apelul unei proceduri se face cu ajutorul instrucţiunii CALL, acesta putând fi apel direct sau apel indirect. Apelul direct are sintaxa CALL operand CALL operand A: . . .
push A jmp operand
Terminarea execuţiei secvenţei apelate este marcată de întâlnirea unei instrucţiuni RET. Aceasta preia din stivă adresa de revenire depusă acolo de CALL, predând controlul la instrucţiunea de la această adresă. Sintaxa instrucţiunii RET este RET [n] unde n este un parametru opţional. El indică eliberarea din stivă a n octeţi aflaţi sub adresa de revenire. Instrucţiunea RET poate fi ilustrată prin echivalenţa B dd ? RET n (revenire near)
.
. . pop [B] add esp,[n] jmp [B]
2) Am deschis fişierul s3ex1.asm cu EMU8086.
Fig. 1. „Model de program în limbaj de asamblare” 3) Am prezentat continutul fisierului s3ex1.asm. include "emu8086.inc" org 100h mov al, 5 mov bl, 5 cmp al, bl ; compare al - bl. ; je equal ; there is only 1 byte jne not_equal ; jump if al <> bl (zf = 0). jmp equal not_equal: add bl, al sub al, 10 xor al, bl jmp skip_data db 256 dup(0) ; 256 bytes skip_data: putc 'n' ; if it gets here, then al <> bl, jmp stop ; so print 'n', and jump to stop. equal: ; if gets here, putc 'y' ; then al = bl, so print 'y'. stop:
ret
4) Am compilat s3ex1.asm
Fig. 2. „Programul scris în EMU8086” 5) Am executat emulatorul EMU8086 apăsind butonul „emulate”.
Fig. 3. „emulator: s3ex1.com_”
Fig. 4. „original source code” 6) Am apasat pe butonul „RUN” si sa pornit procesul de executare.
Fig. 5. „emulator screen” 7) Am analizat rezultatul care este y 8) Am deschis fişierul s3ex2.asm cu EMU8086.
Fig. 6. „Model de program în limbaj de asamblare” 9) Am prezentat continutul fisierului s3ex2.asm. org 100h mov bx, 0 ; total step counter. mov cx, 5 k1: add bx, 1
mov al, '1' mov ah, 0eh int 10h push cx mov cx, 5 k2: add bx, 1 mov al, '2' mov ah, 0eh int 10h push cx mov cx, 5 k3: add bx, 1 mov al, '3' mov ah, 0eh int 10h loop k3 ; internal in internal loop. pop cx loop k2 ; internal loop. pop cx loop k1 ; external loop. ret 10) Am compilat s3ex1.asm
Fig. 7. „Programul scris în EMU8086”
11) Am executat emulatorul EMU8086 apăsind butonul „emulate”.
Fig. 8. „emulator: s3ex2.com_”
Fig. 9. „original source code”
12) Am apasat pe butonul „RUN” si sa pornit procesul de executare.
Fig. 10. „emulator screen”
3. Concluzia; În această lucrare de laborator am studiat structura unui sistem de calcul, familia Intel x86, arhitectura setului de instrucțiuni, organizarea memoriei, studierea elementelor de bază ale limbajului de asamblare, construcții de bază, structura generală a unui program MASM, studierea instrumentelor de lucru pentru compilare și depanare, asamblorul și linker-ul, depanarea programelor, am efectuat discuții legate de arhitectura Intel x86, am deschis fişierul s3ex1.asm și s3ex2.asm cu EMU8086. am prezentat conținutul fișierului s3ex1.asm și s3ex2.asm am compilat s3ex1.asm, am executat emulatorul EMU8086 apăsind butonul „RUN”, am apasat pe butonul „RUN” si sa pornit procesul de executare, am analizat rezultatul.