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进行链接.
初始化不是由c编译器生成的,它是c库的一部分(这使得为每个OS /处理器定制更容易).
有问题的代码通常在windows/unixy系统上非常简单 - 通常会进行一些库初始化(打开STDIN,STDOUT,STDERR,设置时区等),设置环境,处理命令行以传递给main; 从main()获取返回并调用exit等.
大多数c库中的启动代码位于一个名为crt0.c,crt1.c或类似文件的文件中(crt = c运行时).
在更原始或裸系统上,它还将设置堆栈和其他寄存器并清除BSS数据区域 - 在这种情况下,它通常是汇编程序(通常是crt0.S).
mingw for windows的启动代码在crt1.c中 - http://mingw.cvs.sourceforge.net/viewvc/mingw/runtime/