Elementele de bază de asamblare

Când scrieți un program în limbaj de asamblare, doar scrie procesorul de comandă. comandă procesor - este doar un cod sau coduri de operațiuni sau Opcodes. Opcodes - de fapt, „text care poate fi citit“ - versiune de coduri hexazecimale. Din acest motiv, de asamblare este considerat limbajul de programare de nivel scăzut, toate în limbaj de asamblare convertite direct în coduri hexazecimale. Cu alte cuvinte, nu aveți un compilator care transformă un limbaj de nivel înalt într-un limbaj de nivel scăzut, asamblor convertește codul de asamblare numai în datele.

In acest tutorial vom discuta câteva Opcodes, care sunt relevante pentru calculul, operațiunile la nivel de bit, etc. Alte Opcodes: echipa de tranziție, comparații, etc., vor fi discutate mai târziu.

Numerele din ansamblul pot fi furnizate în binar, zecimal sau hexazecimal. În scopul de a arăta ce sistem de a utiliza numărul ar trebui să fie pus după numărul de litere. Pentru sistemul binar este scris litera b (exemplu: 0000010b, 001011010b), nu puteți specifica nimic pentru sistemul zecimal după numărul sau specificați d litere (exemple: 4589, 2356d), pentru sistemul hexazecimal este necesar să se precizeze litera h, numărul hexazecimal este necesar să se scrie la zero la început (exemple: 00889h, 0AC45h, 056Fh, incorect F145Ch, S123h).

Chiar prima echipă va fi bine cunoscut tuturor MOV. Această comandă este utilizată pentru a copia (ignora numele de comanda), valoarea de la un loc la altul. Această „locație“ ar putea fi un registru, locație de memorie, sau o valoare imediată (la fel ca și valoarea inițială). Sintaxa comenzii este:

Aveți posibilitatea să copiați valoarea de la un registru la altul.

de exemplu: această comandă - nu este valid:

Acest opcod încearcă să plaseze DWORD (32-bit) în octet (8 biți). Nu se poate face comanda mov (există alte echipe).

Și aceste comenzi sunt corecte, deoarece acestea au sursa și receptorul nu diferă în mărime:

Puteți obține, de asemenea, valoarea din memorie și a pus ego-ul în registru. De exemplu, luați în considerare următorul circuit de memorie:

(Fiecare bloc reprezinta un octet)

Valoarea offset este desemnată aici ca un octet, dar, de fapt, este - o valoare de 32 de biți. Să luăm, de exemplu 3A, este de asemenea - o valoare de 32 de biți: 0000003Ah. Doar pentru a economisi spațiu, unele folosesc un mic offset.

Uită-te la 3A în tabelul de mai sus de offset. Datele cu privire la această deplasare - 25, 7A, 5E, 72, EF, etc. Pentru a pune valoarea la 3A de offset, de exemplu, în registru, veți utiliza, de asemenea, MOV comanda:

Mijloacele puse valoarea cu DWORD dimensiune (32 de biți) din memorie cu 3Ah compensate în EAX registru. După rularea acestei comenzi, EAX conține o valoare 725E7A25h. Este posibil să fi observat că este - o inversare a ceea ce este în memorie: 25 7A 5E 72. Acest lucru se datorează faptului că valorile sunt stocate în memorie, folosind formatul endian mic. Acest lucru înseamnă că baitul cel mai puțin semnificativ este stocat în cel mai semnificativ octet: ordinea de octet pe spate în față. Cred că aceste exemple vor arăta acest lucru:

  • valoare DWORD (32-bit) de 10203040 hex este stocat în memorie ca: 40, 30, 20, 10
  • cuvânt (16 biți) valoarea 4050 hexazecimală este stocată în memorie: 50, 40

Revenind la exemplul de mai sus. De asemenea, puteți face cu alte dimensiuni:

Probabil deja știut că PTR prefix indică faptul că trebuie să luăm o parte din dimensiunea memoriei. Un prefix înainte de PTR reprezintă dimensiunea datelor:

Uneori, dimensiunea poate fi omisă:

Deoarece EAX - registru de 32 de biți, asamblorul își dă seama că aceasta necesită, de asemenea, o valoare de 32 de biți, în acest caz, memoria de offset 403045h.

De asemenea, puteți direcționa semnificații:

Această comandă este o scriere la EDX registru, valoarea 5006. Consolele [și], sunt utilizate pentru a obține valoarea din memorie (în paranteze este offset), fără paranteze, este doar o valoare imediată.

Acesta poate fi, de asemenea, utilizat ca o locație de memorie registru (ar trebui să fie pe 32 de biți pentru aplicațiile pe 32 de biți):

In cx mov, [eax], procesorul arată în primul rând, o valoare (= celule de memorie) cuprinde eax, valoare care este apoi stocat în aceeași celulă de memorie și stochează această valoare (cuvânt, 16 biți, deoarece receptorul, cx, este 16- bit registru) în CX.

  • 1: a pus 100 în ECx
  • 2: a pus 200 în EAX
  • Valoarea Locul ECx (= 100) în stivă (primul este situat): 3
  • 4: plasează valoarea eax (= 200) în stivă (ultima plasat)
  • 5/6/7: efectuarea operațiunilor pe ECx, valoarea ECx variază
  • 8: extrage valoarea din stivă în ebx: ebx va fi de 200 (ultimul aranjament, prima extracție)
  • 9: extrage valoarea din stivă în ECx: ECX din nou devine 100 (prima plasare, ultima extragere)

Pentru a afla ce se întâmplă în memorie, atunci când introducerea și scoaterea valorilor pe stivă, a se vedea figura de mai jos .:

(Stiva este umplut cu zerouri, dar în realitate nu e ca aici). ESP stă în locul în care punctele)

O notă importantă: registru EAX este aproape întotdeauna utilizat pentru a stoca rezultatul procedurii.

Acest lucru este valabil și pentru funcțiile de ferestre. Desigur, puteți utiliza orice alt registru în propriile proceduri, dar este standardul.

Acesta a terminat lecția următoare. În lecția următoare vom scrie primul program în limbaj de asamblare.

Despre 0 la începutul numerelor hexazecimale. Asta este scris pe acest subiect în Zubkov ( „asamblare pentru DOS, Windows și Unix“, 1.2.3 hexazecimal.):


Programele de asamblare pentru numerele de înregistrare încep cu A, B, C, D, E, F, la început atribuite la „0“ pentru a evita confuzia cu un nume de variabilă număr, sau alt identificator. După numere hexazecimale, litera «h»