我目前正在调查不同编程语言的运行时在幕后看起来如何。对于像C这样的编译语言,人们通常会给出“将代码编译为汇编程序并将其链接到二进制可执行文件中的解释”,然后将可执行文件加载到内存中,并由CPU解释它。我的问题是CPU如何知道在哪里寻找下一条执行指令?它是存储在其中一个寄存器中的内存地址吗?机器代码指令如何传输到CPU?
回答
程序计数器或指令指针保存下一行的地址。
还有一个指令高速缓存,用于保存可能很快被执行的操作码(内存),因此可以避免直接内存访问。
在大多数较新的处理器上,指令实际上并不是按顺序执行的,而是处理器只是模拟一系列操作码的结果是否按顺序执行。可以从优化手册中收集很多有关这种工作原理的信息。如果您想了解更多关于如何完成这项工作的信息,我强烈建议您使用http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-optimization-manual.html的手册而学习实用的技能。
为了澄清,史蒂夫考克斯给出了正确的答案。感谢史蒂夫的及时回应。我的下一个问题是“我如何将指令指针(Intel x86上的EIP寄存器)更改为任意地址?”这可以使用'JMP','CALL'或'RET'完成,就像这个堆栈溢出文章中所解释的那样:http://stackoverflow.com/questions/8333413/why-cant-you-set-the-instruction-指针直接 – Colton
第一个指令位置在CPU数据表中指定。机器制造商确保那里有一些有效的指令(通常在ROM中)。然后执行第一个程序。 CPU知道指令的长度,所以它可以自己到达下一个位置(将当前指令的长度加到当前指令位置)。 CALL和JMP指令例外,该指令指向另一个位置。但是这些指令本身包含计算分支位置所需的数据。
谢谢fjardon!这也是一个正确的答案,并且您对CPU数据表指定要执行的第一条指令的说明确实很有帮助! – Colton
CPU不“解释”机器代码 - 它直接执行 - 这就是为什么它被称为机器代码。
处理器通常具有寄存器称为程序计数器(PC),这将启动复位在通常被称为复位向量其或者固定为所述处理器的位置,或者是从一个固定的位置加载并在每个非分支顺序指令执行后递增到下一条指令。分支和直接跳转指令可能会导致PC被设置为除下一个指令顺序地址之外的其他值。
您可以通过在调试器中逐个汇编程序代码(调试器应该有能力观察CPU寄存器)来观察这种行为。请注意,汇编程序是机器代码的人类可读(或多或少)表示形式,调试器显示实际机器代码的反汇编,而不是编译器生成的汇编程序 - 在调试器中,汇编程序指令==一台机器指令。大多数汇编程序支持可能并不总是具有相同一对一关系的宏和指令,因此即使对于原始汇编代码的代码,反汇编也可能并不总是与源代码相同。
进程被称为指令周期或读取/执行周期详细here进行说明。
- 1. 组装指令到机器代码
- 2. CPU与GPU之间的指令传输
- 3. MIPS对机器代码的指令
- 4. 为什么GCC输出的机器代码有NOP指令
- 5. 多物理cpu机器上的CPU指令
- 6. 我在哪里可以找到代码的机器指令
- 7. 如果汇编代码指令与机器代码指令相同,我不理解这些汇编代码和机器代码区别
- 8. 指令代码控制器代码
- 9. arm movw指令如何映射到机器码?
- 10. 我如何使这个代码cuda(cpu代码到cuda代码)
- 11. 将Python代码传输到另一台机器 - 停止工作
- 12. 如何输出Magento的传送指令?
- 13. 如何传递给AngularJS指令一些将被该指令使用的代码?
- 14. 分机Js如何将参数传递到服务器代码
- 15. 如何将FTP文件从Windows机器传输到Linux机器
- 16. 如何将源代码从XCode传输到服务器?
- 17. CPU指令每秒
- 18. CPU如何重新排序指令
- 19. 在哪里添加CPU指令从源代码安装Tensorflow?
- 20. 从托管代码执行CPU/GPU指令
- 21. 一个程序的机器码指令
- 22. 机器周期中的x86 CPU的汇编指令后
- 23. 如何将Xcode 4代码片段从一台机器传输到另一台机器
- 24. 微指令从机器指令解码后存储在哪里?
- 25. magento如何理解指令代码
- 26. 你能告诉机器代码指令是否可重定位?
- 27. 将PIC汇编指令转换为机器代码
- 28. LLVM:在生成机器代码时禁用某些指令
- 29. 使用机器代码指令是Go中的math.bits?
- 30. 将mips伪指令转换为机器代码
肯定的,程序计数器或指令指针(在x86 EIP) –
有一个公知的入口点.... –
如果你有一个答案 - 张贴它作为答案,而不是评论。http://stackoverflow.com/help/privileges/comment – Clifford