C 0x4在“中的作用是什么?”;movl$0x2d,0x4(%esp)“;?
我正在研究GCC生成的汇编代码。但我不明白:C 0x4在“中的作用是什么?”;movl$0x2d,0x4(%esp)“;?,c,assembly,x86,gnu-assembler,C,Assembly,X86,Gnu Assembler,我正在研究GCC生成的汇编代码。但我不明白: movl $0x2d, 0x4(%esp) 在第二个操作数中,0x4代表什么?偏移地址?寄存器EAX的用途是什么?第二个操作数中的寄存器EAX的值的偏移量EAX是一个通用寄存器,用于汇编编码(计算、存储临时值等),正式称为“累加器寄存器”,但它更具历史意义 您可以阅读有关x86体系结构的内容。与您的问题最相关的部分是寻址模式和通用寄存器,GCC汇编操作数后跟字节(b)、字(w)、长(l)等,例如: movb movw movl 莫夫 莫沃 莫维尔
movl $0x2d, 0x4(%esp)
在第二个操作数中,
0x4
代表什么?偏移地址?寄存器EAX的用途是什么?第二个操作数中的寄存器EAX的值的偏移量EAX
是一个通用寄存器,用于汇编编码(计算、存储临时值等),正式称为“累加器寄存器”,但它更具历史意义
您可以阅读有关x86体系结构的内容。与您的问题最相关的部分是寻址模式和通用寄存器,GCC汇编操作数后跟字节(b)、字(w)、长(l)等,例如: movb movw movl 莫夫 莫沃 莫维尔 寄存器的前缀为百分号(%) 常量的前缀是美元符号($) 在您问题的上述示例中,这意味着堆栈指针(esp)的第四个偏移量 希望这有帮助, 顺致敬意, 汤姆。
0x4(%esp)
表示*(%esp+4)
其中*
表示取消引用
该语句意味着将立即数值0x2d存储到占用堆栈上第四个偏移量的某个局部变量中
(您显示的代码是AT&T语法。在英特尔语法中,它将是
mov[esp,4],2dh
)您正在访问从堆栈指针所在位置删除的四个字节的内容。在GCC中,这表示一个参数(如果我没记错的话,我认为正偏移量是参数,负偏移量是局部变量)。换句话说,您正在将值0x2D写入参数。如果您提供更多的上下文,我可能会告诉您整个过程中发生了什么。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的时代
很好地概述了英特尔类型寄存器。上述列表中的前四个值也可以作为16位或两个8位值访问。例如:
3322222222221111111111
10987654321098765432109876543210
<- eax ->
<- ax ->
<- ah -><- al ->
3322111111111
10987654321098765432109876543210
指针和索引寄存器不允许使用8位部分,但您可以使用,例如,16位
bp
+1-它是“AT&T”表示法,而不是英特尔表示法,这是gcc输出的内容,即源和目标从英特尔表示法交换过来,英特尔表示法不要求运算符上的字段长度,即mov,不是movl。但是,非常有用的答案-+1。它意味着内存[ESP_REG+4]=0x2d;