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