通常、スタックデータは、CPUレジスタがあるstack pointer
を通じて比較的アクセスされていますスタックに格納されている最後の要素を指します。エミュレートされたCPUのメモリへのインデックスとして考えることができます。何かをスタックにプッシュするたびに、スタックポインタは何かのサイズだけ減分され、何かが減算後のアドレスのエミュレートされたメモリに格納されます。スタックから何かをポップすると、その値はスタックポインタに格納されているアドレスから取得され、スタックポインタは何かのサイズだけインクリメントされます。これは、CPUスタックが多くの異なるCPUでどのように動作するかを示しています。
CPUエミュレータまたはCPU命令エミュレータ/インタプリタを実装している場合は、変数はあまり気にしません。あなたのプログラムがCPU命令の観点から表現されているので、CPUレジスタとメモリを操作するCPU命令が気になります。これらの命令(命令)は、スタックに格納されているすべての変数、つまりスタックポインタの現在の値に対する相対的な位置を追跡する必要があります。
たとえば、スタックに渡された2つの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
これは私が探していたものです。 –