C语言 操作系统:编译器混淆


一位

同学向我提出了一个问题,问既然操作系统是扩展机器还是虚拟机,编译器在生成 C 程序的汇编代码时是否需要知道寄存器的数量或处理器的指令。

花了一段时间在互联网上搜索,这就是我的想法......

不需要知道寄存器的数量,因为作为虚拟机,它每次在内存中都有无限的资源。

但是,它确实需要知道处理器的指令,以了解何时能够在特定时间执行特定功能。

想知道是否有人可以为我澄清这一点,因为我对自己的答案不是很有信心。

在实践中,编译器不仅为目标处理器(特别是指令集架构 - ISA(编译(通常通过一些汇编器文件(编译(转换为目标代码(,而且为目标应用程序二进制接口 - ABI,它定义了有关寄存器使用(以及如何进行系统调用(和调用约定的一些约定

操作系统(由内核提供(是 - 或提供给应用程序和进程 - 非常接近处理器的虚拟机;虚拟机是(用户模式,无特权(机器指令+切换到内核或主管模式进行系统调用的指令(SYSENTER(。

另请参阅这个和那个。关于编译器,请阅读寄存器分配、指令调度、优化编译器。

如果您的计算机上有GCC,请尝试使用gcc -fverbose-asm -O -S hello.c编译hello-world程序(可能在一个新目录中(,然后查看生成的汇编代码hello.s;添加-fdump-tree-gimple并查看其他编译器转储文件(甚至更多带有-fdump-tree-all(

附言。一些编译器编译为内存中的机器代码(例如SBCL(。另请阅读有关 JIT 编译器的信息。其他编译器编译为 C 代码。

编译有几个阶段,从不同的抽象到目标机器,这取决于编译器架构。

在某些阶段,

寄存器不是很受限制,但在某些阶段,稍后会完成映射。您可以阅读有关寄存器分配的信息以获取更多详细信息。我也可以建议你看看Appel关于编译器架构的书。

最新更新