Язык ассемблера + перемещение значений в регистры и из них - PullRequest
0 голосов
/ 15 декабря 2011

У меня есть вопрос о ассемблере X-86 или IA32 (я не уверен, что мой учебник использует их взаимозаменяемо). У меня есть следующий код, который должен выполнить следующую операцию

Переместите текущее значение (адрес стека) %ebp в регистр, добавьте к нему 0x20 и сохраните результат «внутри» текущего значения %ebp.Это код, который у меня есть, в основном он вычисляет указатель кадра предыдущего стекового кадра, который по фактическим вычислениям с использованием GDB равен %ebp + 0x20.Может кто-нибудь сказать, что мне не хватает?

movl %ebp, %edx   //move the "stack address" of %ebp into the register
addl $0x20, %edx  // add 0x20 to the value in %edx which is actually the address of the stack of %ebp
movl %edx, (%ebp) //overwrite the contents of %ebp with our calculated values from the previous 2 steps

Также, когда я говорю «адрес стека», я не имею в виду %esp указатель стека.Я имею в виду адрес памяти этого расположения в стеке вместо значения, содержащегося в нем (если это имеет смысл).

1 Ответ

1 голос
/ 26 июля 2016
movl %ebp, %edx   
addl $0x20, %edx  
movl %edx, (%ebp) 

первая строка, перемещает 32-битное значение ebp в edx, вы указали, что это адрес стека, это не так, но это может означать, что ebp может указывать на адрес стека, только если вы поставитезначение esp в него,

вторая строка добавляет 0x20 к edx, и edx перезаписывается суммой, больше похоже на edx = edx + 0x20 в C

Третья строка перемещает сумму из предыдущейстрока к 32-битному адресу памяти, на который указывает EBP, поэтому, имея в виду любое значение ячейки памяти, на которое указывает EBP, оно перезаписывается 32-битным значением EDX.Итак, это все.

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