【发布时间】:2011-01-24 02:34:56
【问题描述】:
我正在研究 GCC 生成的汇编代码。但我不明白:
movl $0x2d, 0x4(%esp)
在第二个操作数中,0x4 代表什么?偏移地址?以及寄存器EAX有什么用?
【问题讨论】:
-
表示内存[ESP_REG + 4] = 0x2d;
标签: c assembly x86 gnu-assembler
我正在研究 GCC 生成的汇编代码。但我不明白:
movl $0x2d, 0x4(%esp)
在第二个操作数中,0x4 代表什么?偏移地址?以及寄存器EAX有什么用?
【问题讨论】:
标签: c assembly x86 gnu-assembler
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 的时代。
This page 很好地概述了 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 是用于汇编编码(计算、存储临时值等)的通用寄存器。正式名称为“累加器寄存器”,但它的历史意义大于相关性。
您可以阅读this page 关于 x86 架构的信息。与您的问题最相关的是关于寻址模式和通用寄存器
的部分【讨论】:
GCC 汇编操作数跟在字节 (b)、字 (w)、长 (l) 等之后,例如:
移动 电影 移动寄存器以百分号 (%) 为前缀。
常量以美元符号 ($) 为前缀。
在您问题的上述示例中,这意味着距堆栈指针 (esp) 的第四个偏移量。
希望这会有所帮助, 最好的祝福, 汤姆。
【讨论】:
您正在访问从堆栈指针所在的位置删除四个字节的内容。在 GCC 中,这表示一个参数(如果我没记错的话,我认为正偏移是参数,负是局部变量)。换句话说,您正在将值 0x2D 写入参数。如果您提供更多上下文,我可能会告诉您整个过程中发生了什么。
【讨论】: