Asamblare X86
Asamblarea x86 este o familie de limbaje de asamblare compatibile cu versiunile anterioare utilizate pentru a produce codul mașinii pentru procesoarele de arhitectură x86 . La fel ca toate limbajele de asamblare, folosește mnemonice scurte, care sunt ușor de reținut abrevieri (de exemplu, cmp înseamnă comparați sau „comparați”) care reprezintă operațiile fundamentale pe care procesorul le poate efectua.
Procesoarele Intel 8086 și 8088 au fost primii care au setul de instrucțiuni care este denumit în mod obișnuit x86. Aceste procesoare pe 16 biți au moștenit multe caracteristici de la procesoarele anterioare pe 8 biți , dar au fost actualizate primind mult mai multe instrucțiuni și funcționalități. Asamblarea x86 vă permite să scrieți codul mașinii pentru 8086, pentru toate procesoarele Intel ulterioare și pentru procesoarele de la alți producători (cum ar fi AMD ) care utilizează arhitectura x86 .
Registrele
Per total, registrele utilizate în ansamblul x86 sunt 14. Patru sunt registre de uz general, utilizate pentru stocarea temporară: [1]
- AX, registrul acumulatorului, este registrul utilizat pentru instrucțiuni matematice precum adunarea, scăderea, înmulțirea și împărțirea.
- BX, registru de bază, este registrul care poate specifica o adresă de memorie.
- CX, contor registru, este registrul utilizat în contorizarea ciclului sau în instrucțiunile de operații matematice.
- DX, registru I / O , este registrul care se adresează porturilor de intrare / ieșire; poate fi folosit și în instrucțiuni matematice precum multiplicarea și divizarea.
Două sunt registre index, utilizate atât pentru stocarea temporară (numai pe 16 biți), cât și în instrucțiunile în care șirurile sunt manipulate:
- YES, registrul indexului sursă, este registrul în care este specificată adresa de la care trebuie citită matricea.
- DI, registrul indexului de destinație, este registrul unde este specificată adresa pentru a scrie matricea.
Două registre sunt utilizate pentru gestionarea stivei și adresarea memoriei:
- BP, registrul de bază al pointerului, este registrul care conține prima adresă de memorie a stivei .
- SP, registrul indicatorului stivei, este registrul care conține ultima adresă de memorie a stivei stivei .
Două registre sunt actualizate de procesor și, prin urmare, nu pot fi modificate de programator:
- IP, registrul indicatorului de instrucțiuni, este registrul care conține cea mai puțin semnificativă parte a următoarei instrucțiuni care trebuie executată.
- Flag, flag flag, este registrul în care fiecare bit are o semnificație diferită după executarea unei instrucțiuni; descrie starea procesorului.
Ultimele patru registre sunt segmentate și sunt utilizate pentru a conține cei mai importanți 16 biți ai oricărei adrese de memorie. [2]
- CS, registrul segmentului de cod, este registrul care conține cea mai semnificativă parte a contorului de programe și este asociat cu registrul IP.
- DS, registrul segmentului de date, este registrul care conține cea mai semnificativă parte a unei memorii de date și este asociat cu registrele BX, SI și DI.
- ES, registru de segment suplimentar, este același cu registrul DS, dar este asociat cu o a doua memorie de date.
- SS, registrul segmentului stivei, este registrul care conține cea mai semnificativă parte a memoriei unde este atribuită stiva și este asociat cu registrele BP și SP
Instrucțiuni
MOV
mov a , b
Instrucțiunea mov copiază conținutul unui (care poate fi o valoare constantă, un registru sau un conținut de memorie) în b . [3]
APĂSAȚI
împingeți a
Instrucțiunea push introduce în partea de sus a teancului o adresă introdusă în registrul SP care la rândul său este decrementată de două unități. [4]
POP
pop b
Instrucțiunea pop preia un element din stivă, din adresa introdusă în registrul SP și îl mută în b . Registrul SP este incrementat cu două unități. [5]
NOP
nop
Instrucțiunea nop nu face nimic, dar este utilizată de exemplu dacă doriți să încetiniți executarea programului sau dacă doriți să măriți adresa codului cu o unitate. [6]
CMP
cmp a - b
Instrucțiunea cmp compară valorile conținute în a și b prin scăderea. Steagurile sunt apoi setate pe baza rezultatului declarației. [7]
JMP
jmp a
Instrucțiunea JMP (salt necondiționat) transferă adresa la fluxul de program executat. [8]
BUCLĂ
bucla a
Instrucțiunea buclă , atunci când este executată, verifică registrul CX. Dacă este diferit de zero, valoarea sa este redusă cu o unitate, altfel programul reia executarea normală. [9]
Operații matematice
adăugați a , b
sub a , b
mul a
div a
Instrucțiunea add face suma lui a și b; rezultatul este inserat într- un .
Instrucțiunea secundară scade între a și b; rezultatul este inserat într- un.
Instrucțiunea mul se înmulțește între valoarea registrului AX și a; rezultatul este introdus în AX.
Instrucțiunea div împarte valoarea registrului AX și a; rezultatul este introdus în AX. [10]
Întreruperi
În ansamblul x86, întreruperile (sau întreruperile ) sunt tratate prin instrucțiuni foarte importante dacă doriți să scrieți un program, deoarece acestea sunt utilizate pentru a accesa ecranul și tastatura.
Managementul intrărilor
Instrucțiunile int 10 și int 21 sunt instrucțiunile necesare pentru a imprima un caracter pe ecran; acesta din urmă trebuie indicat întotdeauna în cod ASCII, chiar dacă este alcătuit dintr-o cifră zecimală. [11]
Exemplul de mai jos arată cum este imprimat caracterul „A”.
; varianta int 10
mov al , 41 ; 41h = „A”
mov ah , 0 și
int 10
; varianta int 21
mov al , 41 ; 41H = 'A'
mov ah , 02
int 21
Managementul rezultatelor
Instrucțiunile int 16 și int 21 sunt instrucțiunile necesare pentru a introduce un caracter de la tastatură. Când este invocată întreruperea, execuția programului este blocată, așteptând ca utilizatorul să introducă un caracter de la tastatură. La sfârșitul execuției, caracterul apăsat de utilizator este afișat în ASCII . [12]
; varianta int 16
mov ah , 00
int 16
; afișarea caracterului apăsat
; varianta int 21
mov ah , 01
int 21
; afișarea caracterului apăsat
Închiderea unui program
Instrucțiunea int 20 închide un program COM ; DOS nu este informat despre starea de închidere. Declarația int 21 închide un program EXE ; DOS este informat despre starea de închidere. [13]
; pentru a închide un program COM
int 20
; pentru a închide un program EXE
mov al, 00
mov ah , 4 c
int 21
Ora curentă
Instrucțiunea int 21h returnează ora curentă, inclusiv minute, secunde și sutimi de secundă. [14]
mov ah , 2 cap
int 21 h
Depanare
Programul debug.exe este utilizat pentru a scrie și compila programe în asamblare x86 (executabil prin comanda de depanare în promptul Windows și MS-DOS ), prezent în MS-DOS și în versiunile de 16 biți și 32 biți de Windows . În versiunile pe 64 de biți programul nu este prezent, totuși pentru aceste sisteme este posibil să se utilizeze emulatoare gratuite descărcabile pe net, cum ar fi DOSBox [15] . Notația utilizată este cea hexazecimală. În debug.exe comenzile sunt foarte ușor de înțeles de către utilizator și sunt, de asemenea, sensibile la majuscule și minuscule . Comenzile principale sunt rezumate mai jos:
Comanda | Ce face |
---|---|
LA | Scrie programul începe. |
D. | Vă permite să vizualizați memoria. |
L | Încărcați programul. |
Nu. | Redenumiți programul. |
Î | Iese din debug.exe. |
R. | Vă permite să vizualizați și / sau să setați registrele. |
U | Vă permite să modificați programul. |
W | Salvați programul. |
Notă
- ^ P. Ollari , 2013 , pp. 26-27.
- ^ P. Ollari , 2013 , pp. 27-28.
- ^ P. Ollari , 2013 , p. 36.
- ^ P. Ollari , 2013 , p. 86.
- ^ P. Ollari , 2013 , pp. 86-87.
- ^ P. Ollari , 2013 , p. 52.
- ^ P. Ollari , 2013 , p. 54.
- ^ P. Ollari , 2013 , p. 55.
- ^ P. Ollari , 2013 , p. 57.
- ^ P. Ollari , 2013 , pp. 76-77.
- ^ P. Ollari , 2013 , pp. 44-45.
- ^ P. Ollari , 2013 , pp. 43-44.
- ^ P. Ollari , 2013 , p. 45.
- ^ P. Ollari , 2013 , p. 87.
- ^ P. Ollari , 2013 , p. 48.
Bibliografie
- Paolo Ollari, curs Sisteme și rețele. Volumul 1. Arhitecturi și rețele , Bologna, Zanichelli, 2013, ISBN 978-88-08-14169-9 .
Elemente conexe
linkuri externe
- Cursuri de asamblare pentru x86 , pe quequero.org .
- ( RO ) Ghid pentru asamblarea x86 , pe cs.virginia.edu .
- Scurt ghid pentru asamblarea 80x86 , pe old.disco.unimib.it .
Controlul autorității | LCCN ( EN ) sh2012003657 |
---|