Страницы

Поиск по вопросам

среда, 22 мая 2019 г.

Как вытаскивать из стека нужные значения?

Я сначала сохраняю 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

Комментариев нет:

Отправить комментарий