gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:54:35 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com