Какие признаки 0x4 сделать в "мовл $0x2d, признаки 0x4(%ESP) в"?

Я изучаю код сборки, сгенерированный GCC. Но я не понимаю:--3-->

movl x2d, 0x4(%esp)

во втором операнде, что значит 0x4 расшифровывается? адрес смещения? И что использование регистра EAX?

5 ответов


movl x2d, 0x4(%esp) означает принять текущее значение указателя стека (%esp), добавить 4 (0x4) затем сохраните длинное (32-разрядное) значение 0x2d в этом месте.

на eax register является одним из 32-разрядных регистров общего назначения. архитектура x86 задает следующие 32-разрядные регистры:

eax  Accumulator Register
ebx  Base Register
ecx  Counter Register
edx  Data Register
esi  Source Index
edi  Destination Index
ebp  Base Pointer
esp  Stack Pointer

и имена и цели некоторых из тогдашних харкен еще во времена Intel 8080.

на этой странице дает хороший обзор Регистры типа Intel. Первые четыре из них в приведенном выше списке также могут быть доступны как 16-разрядные или два 8-разрядных значения. Например:

3322222222221111111111
10987654321098765432109876543210
<-             eax            ->
                <-     ax     ->
                <- ah -><- al ->

регистры указателя и индекса не позволяют использовать 8-битные части, но вы можете иметь, например, 16-битный bp.


0x4(%esp) означает *(%esp + 4) здесь * означает разыменование.

оператор означает сохранение непосредственного значения 0x2d в некоторую локальную переменную, занимающую 4-е смещение в стеке.

(код, который вы показали, находится в синтаксисе AT&T. В синтаксисе Intel это будет mov [esp, 4], 2dh)


0x4 во второй операнд-смещение от значения регистра в скобки. EAX - регистр общего назначения, используемый для кодирования сборки(вычисления, хранение временных значений и т. д.) формально это называется "регистр аккумуляторов", но это скорее историческое, чем актуальное.

Вы можете узнать на этой странице об архитектуре x86. Наиболее актуальными для вашего вопроса являются разделы на режимы адресации и общего назначения регистры


операнды сборки GCC следуют за байтом (b), словом (w), длинным (l) и так далее, например :

movb
movw
movl

регистры имеют префикс со знаком процента (%).

константы имеют префикс со знаком доллара ($).

в приведенном выше примере в вашем вопросе это означает 4-е смещение от указателя стека (esp).

надеюсь, это поможет, С уважением, Том.


вы получаете доступ к чему-то четыре байта удалены от того, где находится указатель стека. В GCC это указывает на параметр ( я думаю -- positive offset-это параметры, а negative-локальные переменные, если я правильно помню). Другими словами, вы записываете значение 0x2D в параметр. Если бы вы дали больше контекста, я, вероятно, мог бы рассказать вам, что происходит во всей процедуре.