我目前正在调查不同编程语言的运行时在幕后的样子。对于像C这样的编译语言,人们通常会给出“代码被编译成程序集的解释,这些代码被汇编并链接成二进制可执行文件。然后可执行文件被加载到内存中,CPU会解释它。”我的问题是CPU如何知道在哪里寻找下一条执行指令?它是存储在其中一个寄存器中的存储器地址吗?
答案 0 :(得分:4)
CPU没有“解释”机器代码 - 它直接执行它 - 这就是它被称为机器代码的原因。
处理器通常有一个名为程序计数器(PC)的寄存器,这个寄存器在通常称为复位向量的位置复位时启动,该位置固定为处理器,或从固定位置加载,并在执行每个非分支顺序指令后递增到下一条指令。分支和直接跳转指令可以将PC设置为除下一个指令顺序地址之外的其他内容。
您可以通过在调试器中的汇编程序级别单步执行代码来观察此行为(调试器应该具有监视CPU寄存器的能力)。请注意,汇编程序是人类可读(或多或少)的机器代码表示,调试器显示实际机器代码的反汇编而不是编译器生成的汇编程序 - 在调试器中有一个汇编程序指令==一台机器指令。大多数汇编程序都支持可能并不总是具有相同的一对一关系的宏和指令,因此即使对于最初为汇编代码的代码,反汇编也可能并不总是与源代码相同。
详细描述了here过程(称为指令周期或获取/执行周期。
答案 1 :(得分:2)
程序计数器或指令指针保存下一行的地址。
还有一个指令缓存,用于保存可能很快执行的操作码(内存),因此可以避免直接内存访问。
在大多数较新的处理器上,指令实际上并没有按顺序执行,而是处理器只是模拟一系列操作码的结果,如果它们按顺序执行的话。可以从优化手册中收集大量有关其工作原理的信息。如果您想了解更多关于如何完成这些工作而学习实用技能,我强烈推荐http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-optimization-manual.html上的手册。
答案 2 :(得分:0)
第一个指令位置在CPU数据表中指定。机器制造商确保那里有一些有效的指令(通常在ROM中)。然后执行该第一个程序。 CPU知道指令的长度,因此它可以自己转到下一个位置(将当前指令的长度添加到当前指令位置)。 CALL和JMP指令是一个例外,它指向另一个位置。但是这些指令本身包含了计算它们分支到的位置所需的数据。