我有一个小的源文件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 int esp
。它将看起来像 0 的内容放入 esp
指向的位置。这是函数 a
的第一个参数。在链接时,0 将替换为字符串数组 main::string
的地址,该数组必须放在数据区中,因为它是可写的。
关于c - 为什么我们要将 0x0 复制到 Stack pointer Register?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57540167/