我有一个小的源文件m.c
extern void a(char *);
int main(int ac, char **av)
{
static char string[] = "Hello, world!\n";
a(string);
}
a
是一个外部函数。当我转储上述代码的反汇编时,它会发出以下输出:m.o: file format elf32-i386
Disassembly of section .text:
00000000 <main>:
extern void a(char *);
int main(int ac, char **av)
{
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 e4 f0 and $0xfffffff0,%esp
6: 83 ec 10 sub $0x10,%esp
static char string[] = "Hello, world!\n";
a(string);
9: c7 04 24 00 00 00 00 movl $0x0,(%esp)
10: e8 fc ff ff ff call 11 <main+0x11>
}
15: c9 leave
16: c3 ret
我有两个问题:
因为有一个静态变量保存字符串,所以我在这个反汇编代码中看不到
.data
部分。这条指令的目的是什么:
movl $0x0,(%esp)
。为什么在调用a
之前要将堆栈指针归零? 最佳答案
它没有输入0 intesp
。它将0放入esp
指向的地方。这是函数a
的第一个参数。在链接时,0将替换为字符串数组main::string
的地址,该数组必须放在数据区域中,因为它是可写的。