c - x86 程序集 : What's the main prologue and epilogue?

标签 c assembly x86 nasm

我正在关注 this tutorial在 x86 汇编上。到目前为止,每个示例都使用作者称之为“c-driver”的程序,用汇编模块编译,用于某种“初始化”。像这样的东西:

int main(void) {
  int ret = asm_main();
  return ret;
}

然后使用 C 调用约定正常编写 asm_main 函数。我想知道 C 编译器生成的所需初始化究竟是什么,以及它是否可以以可移植的方式完成。

信息:我在 Windows XP,32 位机器上,使用 NASM 汇编程序和 mingw32-gcc 进行链接。

最佳答案

初始化不是由 c 编译器生成的,它是 c 库的一部分(这使得为每个操作系统/处理器定制更容易)。

有问题的代码在 windows/unixy 系统上通常非常简单 - 通常会进行一些库初始化(打开 STDIN、STDOUT、STDERR、设置时区等)、设置环境、处理传递给 main 的命令行;捕获 main() 的返回并调用 exit 等。

大多数 c 库中的启动代码位于名为 crt0.c、crt1.c 或类似文件(crt = c 运行时)的文件中。

在更原始或裸系统上,它还会设置堆栈和其他寄存器并清除 BSS 数据区域 - 在这种情况下,它通常在汇编程序中(通常是 crt0.S)。

这是 BSD c 启动代码的链接 - link text

mingw for windows 的启动代码在 crt1.c 中 - http://mingw.cvs.sourceforge.net/viewvc/mingw/runtime/

关于c - x86 程序集 : What's the main prologue and epilogue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1724594/

相关文章:

c++ - 当我创建一个 int 指针并实例化一个数组时,该数组在内存中发生了什么?

c - 我的内存泄漏在哪里?

assembly - intel x86 中的 REP stosl 相当于什么

assembly - 如何在 GDB 控制台中设置 "info registers"中的变量 rip?

assembly - 主要发现 - 一些数组值被覆盖?

assembly - 浮点程序给出无效结果

我可以在VS2013中正式使用free()吗?

c - uint32_t * uint32_t = uint64_t vector 与 gcc 相乘

linux - 我创建的文件名末尾的额外字符

delphi - 调用汇编语言函数导致 "floating point stack check"异常