Как правило, данные стека доступны относительно через stack pointer
, который является регистром ЦП, который указывает на последний элемент, сохраненный в стеке. Вы можете думать об этом как об индексе в памяти эмулируемого процессора. Каждый раз, когда вы помещаете что-то в стек, указатель стека уменьшается на размер этого чего-то, и это что-то сохраняется в эмулируемой памяти по адресу после уменьшения. Всякий раз, когда вы извлекаете что-либо из стека, значение берется из адреса, хранящегося в указателе стека, а затем указатель стека увеличивается на размер этого чего-либо. Вот так стеки ЦП работают во многих разных ЦП.
Если вы реализуете эмулятор ЦП или эмулятор / интерпретатор команд ЦП, вас не волнует большая часть переменных. Что вас волнует, так это инструкции процессора, которые управляют регистрами процессора и памятью, потому что ваша программа выражается в терминах инструкций процессора. Они (инструкции) должны отслеживать все локальные переменные, хранящиеся в стеке, то есть их расположение относительно текущего значения указателя стека.
Например, если вы рассматриваете простую подпрограмму, которая добавляет в стек два 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