Programovanie v assembleri vo Windows x64 (x86-64): Rozdiel medzi revíziami

Smazaný obsah Přidaný obsah
Fabcde (diskusia | príspevky)
Revízia textu
Fabcde (diskusia | príspevky)
Riadok 184:
 
=== Zásobník ===
<!-- pokracovat v revizii -->Zásobník (stack) je pamäťová štruktúra typu LIFO. Hardvérový zásobník je realizovaný priamo v operačnej pamäti, ako jedna súvislá oblasť, ku ktorej sa pristupuje pomocou inštrukcií procesora PUSH a POP. V ďalšom texte sa pod zásobníkom rozumie vždy hardvérový zásobník, nie nejaká jeho softvérová implementácia.<!-- Tu pokračovať revíziou -->
 
Zásobník sa zvykne používať na ukladanie lokálnych premenných, často aj na odovzdávanie argumentov podprogramu. Používa ho aj inštrukcia CALL, ktorá na vrchol zásobníka ukladá návratovú adresu z podprogramu, t.j. adresu inštrukcie nasledujúcej za inštrukciou CALL, t.j. hodnotu registra RIP než bola nahradená adresou začiatku podprogramu.
Zásobník používa inštrukcia CALL na uloženie návratovej adresy z podprogramu (funkcie). Je ideálny aj na ukladanie lokálnych premenných, často sa používa aj na odovzdávanie argumentov podprogramu.
 
RovnakoV ako v architektúrearchitektúrach x86, aj va x86-64 zásobník rastie smerom od vyššej adresy k nižšej. Na vrchol zásobníka, čiže poslednú (najnižšiu) adresu, na ktorej je niečo uložené, ukazuje register RSP. Novú hodnotu uložíme do zásobníka inštrukciou PUSH. Táto posunie vrchol zásobníka (zníži hodnotu uloženú v registri RSP) o príslušný počet bajtov a na takto vzniknuté miesto uloží novú hodnotu. Napríklad inštrukciu <code>PUSH RAX</code> si môžme predstaviť ako dvojicu inštrukcií<syntaxhighlight lang="nasm">
SUB RSP, 8
MOV [RSP], RAX
Riadok 194:
| |
+==============+
| AL ( 0. bajt) | <- RSP (Vrchol zásobníka) po
+--------------+
| AH ( 1. bajt) | ^
+--------------+ |
| ( 2. bajt) | |
+--------------+ |
| ( 3. bajt) | |
+--------------+ |
| ( 4. bajt) | | RSP - 8
+--------------+ |
| ( 5. bajt) | |
+--------------+ |
| ( 6. bajt) | |
+--------------+ |
| ( 7. bajt) | |
+==============+
| . | <- RSP (Vrchol zásobníka) pred
Riadok 214:
| . |
| . |
+==============+ <- Dno zásobníka
<- Dno zásobníka
</syntaxhighlight>K dátam uloženým v zásobníku je možné stále pristupovať aj priamo, ako ku hocijakým iným dátam uloženým kdekoľvek v pamäti, napríklad pomocou relatívneho odkazu na vrchol zásobníka <code>MOV EAX, [RSP+4]</code>.
 
Řádek 221 ⟶ 220:
MOV RAX, [RSP]
ADD RSP, 8
</syntaxhighlight>Pamäť zásobníka mimo rozsahu vymedzenom registrom RSP je nestála (volatile) a môže ju prepísať OS alebo debuger. Pri ukladaní údajov dona vrchol zásobníka je preto nutné vždy najskôr alokovať potrebný priestor (napríklad <code>SUB RSP, n</code>) a až do takto alokovanej pamäte možno potom niečo bezpečne uložiť. Nepotrebné miesto na vrchole zásobníka uvoľní <code>ADD RSP, n</code>.
 
=== Microsoft x64 ===