Вы не «снимаете» параметры из стека, в том смысле, что вы их не выталкиваете. Вы обычно назначаете регистр кадра, чтобы он указывал на вершину стека в точке входа в процедуру, и обращаетесь к параметрам с постоянными, известными смещениями из указателя кадра. Тогда ваш индекс просто «пропускает» обратный адрес, который, как вы знаете, есть.
например. в какой-то гипотетической сборке, когда вы находитесь в процедуре. Предположим, стек растет:
...
argument2
argument1
ret addr <---- stack pointer
Так что просто получите argument1
со смещением sp+4
(при условии 32-битного), argument2
со смещением sp+8
и т. Д. Поскольку эти соглашения о вызовах известны, эти смещения жестко закодированы в вашем коде и являются эффективно вычислять.
Указатель кадра очень полезен, поскольку вы также помещаете локальные переменные в стек и не хотите, чтобы индексирование параметров изменялось в разных местах, поэтому указатель кадра обеспечивает стабильную привязку на протяжении всего выполнения процедуры.