2014-06-05 49 views
2

我目前正在调查不同编程语言的运行时在幕后看起来如何。对于像C这样的编译语言,人们通常会给出“将代码编译为汇编程序并将其链接到二进制可执行文件中的解释”,然后将可执行文件加载到内存中,并由CPU解释它。我的问题是CPU如何知道在哪里寻找下一条执行指令?它是存储在其中一个寄存器中的内存地址吗?机器代码指令如何传输到CPU?

+4

肯定的,程序计数器或指令指针(在x86 EIP) –

+1

有一个公知的入口点.... –

+0

如果你有一个答案 - 张贴它作为答案,而不是评论。http://stackoverflow.com/help/privileges/comment – Clifford

回答

2

程序计数器或指令指针保存下一行的地址。

还有一个指令高速缓存,用于保存可能很快被执行的操作码(内存),因此可以避免直接内存访问。

在大多数较新的处理器上,指令实际上并不是按顺序执行的,而是处理器只是模拟一系列操作码的结果是否按顺序执行。可以从优化手册中收集很多有关这种工作原理的信息。如果您想了解更多关于如何完成这项工作的信息,我强烈建议您使用http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-optimization-manual.html的手册学习实用的技能。

+0

为了澄清,史蒂夫考克斯给出了正确的答案。感谢史蒂夫的及时回应。我的下一个问题是“我如何将指令指针(Intel x86上的EIP寄存器)更改为任意地址?”这可以使用'JMP','CALL'或'RET'完成,就像这个堆栈溢出文章中所解释的那样:http://stackoverflow.com/questions/8333413/why-cant-you-set-the-instruction-指针直接 – Colton

0

第一个指令位置在CPU数据表中指定。机器制造商确保那里有一些有效的指令(通常在ROM中)。然后执行第一个程序。 CPU知道指令的长度,所以它可以自己到达下一个位置(将当前指令的长度加到当前指令位置)。 CALL和JMP指令例外,该指令指向另一个位置。但是这些指令本身包含计算分支位置所需的数据。

+0

谢谢fjardon!这也是一个正确的答案,并且您对CPU数据表指定要执行的第一条指令的说明确实很有帮助! – Colton

4

CPU不“解释”机器代码 - 它直接执行 - 这就是为什么它被称为机器代码。

处理器通常具有寄存器称为程序计数器(PC),这将启动复位在通常被称为复位向量其或者固定为所述处理器的位置,或者是从一个固定的位置加载并在每个非分支顺序指令执行后递增到下一条指令。分支和直接跳转指令可能会导致PC被设置为除下一个指令顺序地址之外的其他值。

您可以通过在调试器中逐个汇编程序代码(调试器应该有能力观察CPU寄存器)来观察这种行为。请注意,汇编程序是机器代码的人类可读(或多或少)表示形式,调试器显示实际机器代码的反汇编,而不是编译器生成的汇编程序 - 在调试器中,汇编程序指令==一台机器指令。大多数汇编程序支持可能并不总是具有相同一对一关系的宏和指令,因此即使对于原始汇编代码的代码,反汇编也可能并不总是与源代码相同。

进程被称为指令周期读取/执行周期详细here进行说明。

+0

实际上大多数处理器“解释”机器代码并将一个机器代码指令转换为许多微操作:) www.agner.org/optimize/microarchitecture.pdf(2.1段) – fjardon

+0

@fjardon:我知道有人会把它,但这并不重要,所以我选择不提及它使问题复杂化。你是否称微码翻译“解释”是有争议的。它也适用于CISC处理器 - 我不确定它是否构成“大多数处理器”,尽管它适用于x86(标记) - 就用户而言,指令是由硬件自动执行的。 – Clifford

+1

“大多数处理器”完全不正确。大多数处理器不是微码,有的/很少。 –