0x4在“movl $ 0x2d,0x4(%esp)”中做了什么?

时间:2010-03-05 12:35:44

标签: c assembly x86 gas

我正在研究GCC生成的汇编代码。但我不明白:

movl $0x2d, 0x4(%esp)

在第二个操作数中,0x4代表什么?偏移地址?注册EAX的用途是什么?

5 个答案:

答案 0 :(得分:14)

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

并且其中一些人的名字和目的可以追溯到英特尔8080的时代。

This page概述了英特尔类型的寄存器。上面列表中的前四个也可以作为16位或两个8位值访问。例如:

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

指针和索引寄存器不允许使用8位部分,但您可以使用例如16位bp

答案 1 :(得分:4)

0x4(%esp)表示*(%esp + 4),其中*表示解除引用。

该语句表示将立即值0x2d存储到占用堆栈上第4个偏移量的某个局部变量中。

(您显示的代码采用AT&amp; T语法。在英特尔语法中,它将是mov [esp, 4], 2dh

答案 2 :(得分:1)

第二个操作数中的

0x4是与parens中寄存器值的偏移量。 EAX是一个通用寄存器,用于汇编编码(计算,存储临时值等),正式称为“累加器寄存器”,但它比相关的更具历史意义。

您可以阅读有关x86架构的this page。与您的问题最相关的是寻址模式通用寄存器

部分

答案 3 :(得分:1)

GCC汇编操作数遵循字节(b),字(w),long(l)等依次为:

movb
movw
movl

寄存器的前缀为百分号(%)。

常量以美元符号($)为前缀。

在您的问题的上述示例中,这意味着堆栈指针(esp)的第4个偏移量。

希望这有帮助, 最好的祝福, 汤姆。

答案 4 :(得分:1)

您正在访问从堆栈指针所在位置删除的四个字节。在GCC中,这表示一个参数(我认为 - 如果我没记错的话,正偏移是参数,负数是局部变量)。换句话说,您将值0x2D写入参数。如果你提供了更多的上下文,我可能会告诉你整个过程中发生了什么。