Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 0x4在“中的作用是什么?”;movl$0x2d,0x4(%esp)“;?_C_Assembly_X86_Gnu Assembler - Fatal编程技术网

C 0x4在“中的作用是什么?”;movl$0x2d,0x4(%esp)“;?

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 莫夫 莫沃 莫维尔

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

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;