Вопрос

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

movl $0x2d, 0x4(%esp)

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

Это было полезно?

Решение

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-Type. Первые четыре из них в указанном списке также могут быть доступны как 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 Во втором операнде является компенсирование от стоимости реестра в Parens. EAX является регистром общего назначения, используемого для кодирования сборки (вычисления, хранения временных значений и т. Д.) Формально его называют «Регистр аккумулятора», но это более исторический, чем актуален.

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

Опеканки GCC Assember следуют байту (B), Word (W), длинным (L) и так на таком, как:

movb movw movl.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top