Я не могу найти ответ. Из того, что я читал,% ebp имеет 32 бита, перемещая% esp в% ebp, у вас все равно будет 32 бита, затем вычтите 70 из 32, а остальное я не понимаю. Я новичок в этом, поэтому я не очень разбираюсь. Пожалуйста, дайте подробное объяснение. Спасибо!
Ниже приведен вопрос, с которым у меня возникли проблемы.
Сколько байтов отделяют esp от сохраненного адреса возврата в стеке программы в конце этой последовательности инструкций? Предположим, что мы вызвали эту функцию, используя стандартные 32-разрядные соглашения о вызовах x86.
804847c functioname:
804847c: push %ebp
804847d: mov %esp,%ebp
804847f: sub $0x70,%esp
8048482: movl $0x0,0x4(%esp)
804848a: movl $0x8048580,(%esp)
$0x70
в этой инструкцииsub $0x70,%esp
расширено знаком до 32 бит, поэтому оно также имеет 32 бита, как иesp
иebp
. (хотя внутренне значение0x70
закодировано в инструкциях только в 8 битах, но это не то, как оно используется, это только оптимизация хранения в данном конкретном случае). Количество используемых битов ограничивает количество различных значений, которые могут быть закодированы в этих битах, т.е. 8 битов можно интерпретировать как значения от 0 до 255, или от -128 до +127, или как восемь 1-битных флагов (вкл. / Выкл.). В вашем вопросе это не имеет большого значения, так как все задействованные значения - 32b. - person Ped7g   schedule 15.08.2017