Страницы

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

суббота, 7 марта 2020 г.

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

#ассемблер #stack


Я сначала сохраняю PUSH EAX, потом PUSH EAX, то есть значения двух регистров. Возможно,
есть специальная инструкция, которая позволяет взять самое нижнее значение стэка? Вершиной
стэка - значение EAX, дно стэка значение ECX. Как взять значение из "дна", изменить
его и положить обратно на дно?
Благодарю за ответы!
    


Ответы

Ответ 1



Машинный стек - это просто участок памяти, с ним можно работать как с любым другим участком памяти, например с помощью команды 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

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

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