Почему push EBX приводит к популярности ESI - PullRequest
0 голосов
/ 21 января 2019

Я взял книгу «Практический реверс-инжиниринг», и у меня есть следующий пример на странице 14 (сборка x86):

mov eax, 0AAAAAAAh
mov ebx, 0BBBBBBBh
push eax
push ebx
pop esi
pop edi

Теперь я вставляю eax и ebx в стек, но я высовываю esi и edi из стека. Это почему? Я думал, что нажму и вытолкну те же регистры.

Ответы [ 3 ]

0 голосов
/ 21 января 2019

Вы не нажимаете регистры , вы нажимаете значения , хранящиеся в этих регистрах. В этом случае значения поступают из регистров eax и ebx. Сами регистры остаются там, где они были (где-то внутри процессора).

Вы можете вставить эти значения в любые регистры, например esi и edi здесь. Это просто зависит от того, где в вашем коде и в каких регистрах вам нужны эти значения.

Иногда вам нужно очистить только несколько значений из стека. Тогда вы могли бы сделать

pop esi   ; or whatever register is not in use at the moment
pop esi    

Это не повлияет на другие регистры. (Конечно, вы также можете просто изменить указатель стека, но это уже другая тема.)

0 голосов
/ 21 января 2019

Когда вы pop стек, операнд регистра просто получает значение, которое было на вершине стека. До тех пор, пока одинаковое количество байтов выдвигается и выталкивается, стек сбалансирован, независимо от того, куда идут байты. Вам не обязательно pop возвращаться в то же место, где был источник вашего ранее push ed значения.

Например, этот код загружает регистр ecx с тем, что было в данный момент в eax, без смещения стека:

push eax
pop ecx

Вы также можете выполнить эффективный «безоперандный» pop, вручную настроив указатель стека:

push eax
...
add esp, 4 ; Discard 32-bits on top of stack 
; Stack is now balanced (assuming the intermediate instructions did not misalign the stack)
0 голосов
/ 21 января 2019

push - Push на стеке

Команда push помещает свой операнд в верхнюю часть поддерживаемого аппаратным обеспечением стека в памяти.В частности, push сначала уменьшает ESP на 4, а затем помещает его операнд в содержимое 32-разрядного расположения по адресу (% esp).ESP (указатель стека) уменьшается нажатием, так как стек x86 уменьшается - то есть стек увеличивается от старших адресов к младшим.

pop - извлечение из стека

Инструкция pop удаляет4-байтовый элемент данных из верхней части поддерживаемого аппаратным обеспечением стека в указанный операнд (т. Е. Регистр или ячейка памяти).Сначала он перемещает 4 байта, расположенные в ячейке памяти (% esp), в указанный регистр или ячейку памяти, а затем увеличивает ESP на 4.

ищите более подробную информацию: объяснение push / pop

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...