Stack register - Stack register

Registr zásobníku je registr centrálního procesoru počítače, jehož účelem je sledovat zásobník volání . Na počítači s architekturou na bázi akumulátoru to může být vyhrazený registr, jako je SP na počítači Intel x86 . Na stroji s obecným registrem to může být registr, který je vyhrazen konvencí, například na strojích PDP-11 nebo RISC . Některé designy, jako je Data General Eclipse, neměly žádný vyhrazený registr, ale pro tuto funkci používaly vyhrazenou adresu hardwarové paměti.

Stroje před koncem šedesátých let - jako PDP-8 a HP 2100 - neměly kompilátory, které podporovaly rekurzi . Jejich instrukce podprogramu obvykle uloží aktuální umístění do adresy skoku a poté nastaví čítač programu na další adresu. I když je to jednodušší než udržovat zásobník, protože na sekci kódu podprogramu je pouze jedno místo návratu, nemůže dojít k rekurzi bez značné námahy programátora.

Stack Stroj má 2 nebo více zásobníku registry - jeden z nich udržuje v zásobníku volání , druhá (y) sledovat jiné stack (y).

Stack registry in x86

V roce 8086 se hlavní registr zásobníku nazývá zásobníkový ukazatel - SP. Registr segmentu zásobníku (SS) se obvykle používá k ukládání informací o segmentu paměti, který ukládá zásobník volání aktuálně spuštěného programu. SP ukazuje na aktuální vrchol zásobníku. Ve výchozím nastavení zásobník roste směrem dolů v paměti, takže novější hodnoty jsou umístěny na nižších adresách paměti. K odeslání hodnoty do zásobníku se použije PUSHinstrukce. K vyskakování hodnoty ze zásobníku POPse používá instrukce.

Příklad : Za předpokladu, že SS = 1000 ha SP = 0xF820. To znamená, že aktuální horní část zásobníku je fyzická adresa 0x1F820 (je to kvůli segmentaci paměti v 8086 ). Další dva strojové pokyny programu jsou:

PUSH AX
PUSH BX
  • Tato první instrukce vloží hodnotu uloženou v AX (16bitový registr) do zásobníku. To se provádí odečtením hodnoty 2 (2 bajty) od SP.
  • Nová hodnota SP se stává 0xF81E. CPU poté zkopíruje hodnotu AX do paměťového slova, jehož fyzická adresa je 0x1F81E.
  • Když je spuštěno "PUSH BX", SP je nastaveno na 0xF81C a BX je zkopírováno do 0x1F81C.

To ukazuje, jak funguje PUSH. Spuštěný program obvykle tlačí registry do zásobníku, aby využil registry pro jiné účely, jako je volání rutiny, která může změnit aktuální hodnoty registrů. Pro obnovení hodnot uložených v zásobníku musí program obsahovat strojové instrukce, jako je tento:

POP BX
POP AX
  • POP BX zkopíruje slovo na 0x1F81C (což je stará hodnota BX) do BX, poté zvýší SP o 2. SP je nyní 0xF81E.
  • POP AX zkopíruje slovo na 0x1F81E do AX a poté nastaví SP na 0xF820.

Hromadný motor

Jednodušší procesory ukládají ukazatel zásobníku do běžného hardwarového registru a k manipulaci s jeho hodnotou používají aritmetickou logickou jednotku (ALU). Typicky push a pop jsou přeloženy do několika mikrooperací , aby se samostatně přidal / odečetl ukazatel zásobníku a provedlo se načtení / uložení do paměti.

Novější procesory obsahují vyhrazený modul zásobníku, který optimalizuje operace zásobníku. Pentium M byl prvním procesorem x86, který představil stack engine. Ve své implementaci je ukazatel zásobníku rozdělen mezi dva registry: ESP O , což je 32bitový registr, a ESP d , 8bitová delta hodnota, která je aktualizována přímo pomocí operací zásobníku. Opcody PUSH, POP, CALL a RET fungují přímo s registrem ESP d . Pokud je ESP d blízko přetečení nebo je registr ESP odkazován z jiných pokynů (když ESP d ≠ 0), je vložen synchronizační mikroop, který aktualizuje ESP O pomocí ALU a resetuje ESP d na 0. Tento design zůstal z velké části nezměněno v pozdějších procesorech Intel, ačkoli ESP O byl rozšířen na 64 bitů.

V mikroarchitektuře AMD K8 byl rovněž použit zásobník podobný procesoru Intel . V Bulldozeru byla odstraněna potřeba synchronizačních mikrooperací, ale vnitřní design zásobníku motoru není znám.

Poznámky

Reference