10

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

movl $0x2d, 0x4(%esp)

在第二个操作数中,0x4代表什么?偏移地址?以及寄存器 EAX 有什么用?

4

5 回答 5

15

movl $0x2d, 0x4(%esp)表示获取堆栈指针的当前值 ( %esp),添加 4 ( 0x4),然后将 long(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 的时代。

此页面很好地概述了 Intel 类型的寄存器。上面列表中的前四个也可以作为 16 位或两个 8 位值访问。例如:

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

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

于 2010-03-05T12:44:17.737 回答
4

0x4(%esp)表示取消引用的意思*(%esp + 4)*

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

(您显示的代码采用 AT&T 语法。在 Intel 语法中它会是mov [esp, 4], 2dh

于 2010-03-05T12:40:36.183 回答
1

0x4第二个操作数中的值是括号中寄存器值的偏移量。EAX是用于汇编编码(计算、存储临时值等)的通用寄存器,正式名称为“累加器寄存器”,但它的历史意义大于相关性。

你可以阅读这个关于 x86 架构的页面。与您的问题最相关的是寻址模式通用寄存器部分

于 2010-03-05T12:37:46.730 回答
1

GCC 汇编操作数遵循字节 (b)、字 (w)、长 (l) 等,例如:

移动
电影
移动

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

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

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

希望这会有所帮助,最好的问候,汤姆。

于 2010-03-05T12:39:36.133 回答
1

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

于 2010-03-05T12:43:30.057 回答