Какие признаки 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 в параметр. Если бы вы дали больше контекста, я, вероятно, мог бы рассказать вам, что происходит во всей процедуре.