c - 为什么我们要将 0x0 复制到 Stack pointer Register?

标签 c linux assembly att objdump

我有一个小的源文件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

我有两个问题:

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

  2. 这条指令的目的是什么: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/

相关文章:

c - 动态制作结构数组

mysql - 加密 MySQL 中所有数据的最佳方法是什么

linux - 搜索字符串的标准命令

php - 如何在 Ubuntu 14.04 上更改 php-cli 版本?

c - 从函数外部访问标签

汇编比较两个数字

c - 在一台机器上构建 opencv exe 并在另一台没有安装 opencv 的机器上运行?

c++ - 通过指针访问 C 中 4d 数组中的元素

比较内联 c 汇编中的数字

c - 一行输入多个int,返回int的个数