为什么我们要将 0x0 复制到 Stack pointer Register?
Why do we copy 0x0 to Stack pointer Register?
我有一个小源文件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 [=11=]xfffffff0,%esp
6: 83 ec 10 sub [=11=]x10,%esp
static char string[] = "Hello, world!\n";
a(string);
9: c7 04 24 00 00 00 00 movl [=11=]x0,(%esp)
10: e8 fc ff ff ff call 11 <main+0x11>
}
15: c9 leave
16: c3 ret
我有两个问题:
既然有一个静态变量保存字符串,为什么我在反汇编代码中看不到 .data
部分。
这条指令的目的是什么:movl [=14=]x0,(%esp)
。为什么我们在调用 a
之前将堆栈指针清零?
它没有放入 0 int esp
。它将看起来像 0 的内容放入 esp
指向的位置。这是函数 a
的第一个参数。在link时,0将被替换为字符串数组的地址main::string
,它必须放在数据区,因为它是可写的。
我有一个小源文件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 [=11=]xfffffff0,%esp
6: 83 ec 10 sub [=11=]x10,%esp
static char string[] = "Hello, world!\n";
a(string);
9: c7 04 24 00 00 00 00 movl [=11=]x0,(%esp)
10: e8 fc ff ff ff call 11 <main+0x11>
}
15: c9 leave
16: c3 ret
我有两个问题:
既然有一个静态变量保存字符串,为什么我在反汇编代码中看不到
.data
部分。这条指令的目的是什么:
movl [=14=]x0,(%esp)
。为什么我们在调用a
之前将堆栈指针清零?
它没有放入 0 int esp
。它将看起来像 0 的内容放入 esp
指向的位置。这是函数 a
的第一个参数。在link时,0将被替换为字符串数组的地址main::string
,它必须放在数据区,因为它是可写的。