由于操作系统是扩展或虚拟机,同学问我提出的问题,编译器在生成C程序的汇编代码时需要知道寄存器的数量或处理器的指令。
我花了一段时间在网上搜索,这就是我的想法......
它不需要知道寄存器的数量,因为作为一个虚拟机,它在内存中拥有无限的资源。
但是,它确实需要知道处理器的指令,以了解它何时能够在特定时间执行特定功能。
我想知道是否有人可以为我澄清这一点,因为我对我的答案不太自信。
答案 0 :(得分:5)
实际上,编译器正在编译(进入object code,通常通过一些汇编程序文件),不仅针对目标processor(特别是instruction set架构 - ISA),而且针对a目标application binary interface - ABI,它定义了一些关于register用法的约定(以及如何制作system calls)& calling conventions
操作系统(由kernel提供)是 - 或者给应用程序和进程 - 非常靠近处理器的虚拟机; VM是(用户模式,非特权)机器指令+指令(SYSENTER
)切换到内核或supervisor mode进行系统调用。
另见this& that。关于compilers,请阅读register allocation,instruction scheduling,optimizing compilers。
如果您的计算机上有GCC,请尝试使用gcc -fverbose-asm -O -S hello.c
编译一个hello-world程序(可能在新目录中),然后查看生成的汇编程序代码hello.s
;添加-fdump-tree-gimple
并查看其他编译器转储文件[s](其中更多的是-fdump-tree-all
)
PS。一些编译器编译为内存中的机器代码(例如SBCL)。另请阅读JIT compilers。其他编译器compile到C code。
答案 1 :(得分:1)
编译有几个阶段,从不同的抽象到目标机器,这取决于编译器架构。
在某些阶段,寄存器不是很有限,但在某些阶段后,映射就完成了。有关详细信息,请参阅register allocation。我还建议您查看有关编译器架构的Appel's book。