x86大会:主要的序幕和结语是什么?

Giu*_*ela 0 c x86 assembly nasm

我正在关注x86程序集的本教程.到目前为止,每个例子都使用作者称为"c-driver"程序,用汇编模块编译,用于某些"初始化".就像是:

int main(void) {
  int ret = asm_main();
  return ret;
}
Run Code Online (Sandbox Code Playgroud)

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

信息:我在Windows XP,32位盒子上,使用NASM汇编器和mingw32-gcc进行链接.

Dip*_*ick 5

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

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

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

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

这是BSD c启动代码的链接 - 链接文本

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

  • 在C项目中,您所讨论的所有这些设置都会在调用main之前自动处理(并且在主要返回后退出事件会自动发生).现在你可能会问,"什么是C项目?".好吧,这是一个棘手的问题,但基本上如果你有一个"主"函数并与libc(-lc)链接,即使你的代码中的每个函数都是用asm编写的,你也可以作为一个C项目工作. (2认同)