Я сначала сохраняю PUSH EAX, потом PUSH EAX, то есть значения двух регистров. Возможно, есть специальная инструкция, которая позволяет взять самое нижнее значение стэка? Вершиной стэка - значение EAX, дно стэка значение ECX. Как взять значение из "дна", изменить его и положить обратно на дно? Благодарю за ответы!
Ответ
Машинный стек - это просто участок памяти, с ним можно работать как с любым другим участком памяти, например с помощью команды mov можно обратиться к любому адресу выше текущей вершины (адреса, лежащего в esp).
Действия из вопроса можно выполнить так:
push eax
push ecx
mov edx, [esp+4] ; берем значение, которое было добавлено в стек предпоследним
... ; как-то меняем
mov [esp+4], edx ; кладем обратно
Дном стека для процедуры условно можно считать значение указателя стека, которое он имеет в момент входа в процедуру. Есть стандартный прием, когда это значение сохраняется в регистр ebp, потом в стеке выделяется память под локальные переменные (указатель стека просто уменьшается на размер локальных переменных), а потом в процессе работы процедуры от ebp в большую сторону ([ebp+N]) рассчитываются адреса аргументов процедуры, а в меньшую сторону ([ebp-N]) - адреса локальных переменных. При этом значение esp в процессе работы процедуры может меняться, а значение ebp остается одним и тем же. Код процедуры будет выглядеть примерно так:
; Стандартный пролог для создания стекового фрейма
push ebp
mov ebp, esp
sub esp, M ; M - размер локальных переменных
... ; основной код процедуры
; Стандартный эпилог
mov esp, ebp
pop ebp
ret
Комментариев нет:
Отправить комментарий