通常,堆棧數據通過stack pointer
,這是一個CPU寄存器相對訪問的指向存儲在堆棧上的最後一個元素。您可以將其視爲仿真CPU內存索引。每次你將一些東西壓入堆棧時,堆棧指針的大小會減少一些,並且在減少之後,某些東西會被存儲在模擬內存中的地址中。每當你從堆棧中彈出某些東西時,該值將從存儲在堆棧指針中的地址中獲取,然後堆棧指針會增加該東西的大小。這就是CPU堆棧在許多不同CPU中的工作方式。
如果您正在實現CPU模擬器或CPU指令模擬器/解釋器,則不需要太多變量。你關心的是操作CPU寄存器和內存的CPU指令,因爲你的程序是用CPU指令表示的。他們(指令)必須跟蹤存儲在堆棧上的所有loacal變量,即它們相對於堆棧指針當前值的位置。例如,如果您考慮一個簡單的子例程,它在堆棧上添加傳遞給它的兩個16位整數值,它可能看起來像這樣。 16位x86彙編:
myadd:
push bp ; we'll be accessing stack through bp (can't do that through sp because there's no sp-relative memory addressing in 16-bit mode), so, let's save bp first
mov bp, sp ; bp is equal to the stack pointer
mov ax, dword ptr [bp + 4] ; load ax with 1st parameter stored at bp+4 (sp+4)
add ax, dword ptr [bp + 6] ; add to ax 2nd parameter stored at bp+6 (sp+6)
pop bp ; restore bp
ret ; near return to the caller at address stored at sp (address after call myadd), the result/sum is in ax
,主叫方可以是這樣的:
push word 2 ; prepare/store 2nd parameter on the stack
push word 1 ; prepare/store 1st parameter on the stack
call myadd ; near call, pushes address of next instruction (add), jumps to myadd
add sp, 4 ; remove myadd's parameters (1 and 2) from the stack
; ax should now contain 3
感謝這就是我一直在尋找的。 – 2011-12-25 11:54:36