为什么我们要将 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

我有两个问题:

  1. 既然有一个静态变量保存字符串,为什么我在反汇编代码中看不到 .data 部分。

  2. 这条指令的目的是什么:movl [=14=]x0,(%esp)。为什么我们在调用 a 之前将堆栈指针清零?

它没有放入 0 int esp。它将看起来像 0 的内容放入 esp 指向的位置。这是函数 a 的第一个参数。在link时,0将被替换为字符串数组的地址main::string,它必须放在数据区,因为它是可写的。