这与内存模型无关。
在气体语法中mov ecx, hello_world
means 从内存地址读取 hello_world
,可以通过检查用 ndisasm 完成的反汇编来确认:
00000000 BB01000000 mov ebx,0x1
00000005 8B0C25D4104000 mov ecx,[0x4010d4]
0000000C BA0D000000 mov edx,0xd
00000011 B804000000 mov eax,0x4
00000016 CD80 int 0x80
你想要的是存储内存地址 of hello_world
。在天然气中,实现这一目标的方法是mov ecx, offset hello_world
,从反汇编中可以确认:
00000000 BB01000000 mov ebx,0x1
00000005 B9D4104000 mov ecx,0x4010d4
0000000A BA0D000000 mov edx,0xd
0000000F B804000000 mov eax,0x4
00000014 CD80 int 0x80
顺便说一句,将内存地址加载到寄存器中的另一种方法是leaecx, hello_world
.
其他一些汇编器(例如 NASM 和 YASM)具有不同的语法,这种差异可能会导致混乱,可以用一个小表来说明:
gas NASM/YASM ndisasm disassembly
mov ecx,hello_world mov ecx,[hello_world] mov ecx,[0x4010d4]
mov ecx,[hello_world] mov ecx,[hello_world] mov ecx,[0x4010d4]
mov ecx,offset hello_world mov ecx,hello_world mov ecx,0x4010d4