Что делает 0x4 в "movl $ 0x2d, 0x4 (% esp)"? - PullRequest
10 голосов
/ 05 марта 2010

Я смотрю на ассемблерный код, сгенерированный GCC.Но я не понимаю:

movl $0x2d, 0x4(%esp)

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

Ответы [ 5 ]

14 голосов
/ 05 марта 2010

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

Регистр eax является одним из 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.

4 голосов
/ 05 марта 2010

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

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

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

1 голос
/ 05 марта 2010

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

1 голос
/ 05 марта 2010

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

movb
movw
movl

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

Константы начинаются со знака доллара ($).

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

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

1 голос
/ 05 марта 2010

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

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

...