我正在研究GCC生成的汇编代码。但我不明白:
movl $0x2d, 0x4(%esp)
在第二个操作数中,0x4
代表什么?偏移地址?注册EAX的用途是什么?
答案 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写入参数。如果你提供了更多的上下文,我可能会告诉你整个过程中发生了什么。