我有一个小的源文件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的地址,该数组必须放在数据区域中,因为它是可写的。

07-24 09:45
查看更多