Что делает 0x4 в "movl $ 0x2d, 0x4 (% ESP)"?
Вопрос
Я смотрю в сборки код, сгенерированный 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 в параметр. Если вы дали больше контекста, я, вероятно, мог сказать вам, что происходит во всей процедуре.