0x4在"movl $ 0x2d,0x4(%esp)"中做了什么?

mar*_*tin 10 c x86 assembly gnu-assembler

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

movl $0x2d, 0x4(%esp)
Run Code Online (Sandbox Code Playgroud)

在第二个操作数中,0x4代表什么?偏移地址?注册EAX有什么用?

pax*_*blo 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
Run Code Online (Sandbox Code Playgroud)

并且有些人的名字和目的可以追溯到英特尔8080的时代.

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

3322222222221111111111
10987654321098765432109876543210
<-             eax            ->
                <-     ax     ->
                <- ah -><- al ->
Run Code Online (Sandbox Code Playgroud)

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