操作系统:编译器混淆

时间:2016-02-03 17:46:48

标签: c assembly operating-system cpu-registers instructions

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

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

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

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

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

2 个答案:

答案 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 allocationinstruction schedulingoptimizing compilers

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

PS。一些编译器编译为内存中的机器代码(例如SBCL)。另请阅读JIT compilers。其他编译器compileC code

答案 1 :(得分:1)

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

在某些阶段,寄存器不是很有限,但在某些阶段后,映射就完成了。有关详细信息,请参阅register allocation。我还建议您查看有关编译器架构的Appel's book