risc - RISC - 禁止指令序列
问题描述
计算机系统介绍书显示了CISC和RISC之间的区别如下。
CISC:隐藏在机器级程序中的实现工件。ISA 在程序及其执行方式之间提供了清晰的抽象。
RISC:暴露于机器级程序的实现工件。一些 RISC 机器禁止特定的指令序列,并且在执行以下指令之前不会生效的跳转。编译器的任务是在这些约束内优化性能。
我想知道禁止哪些“特定指令序列”,为什么?
解决方案
作者试图传达的是 CISC ISA 在向程序员隐藏微架构细节方面比 RISC 更好。CISC ISA 公开表示特定操作的指令,该特定操作不一定与微架构实现可能执行该操作的方式相关联。
假设我们想要将数据从内存位置 A 移动到另一个 B - CISC 架构会将该操作公开为类似于以下的指令:“mov B, A”(宏操作)。现在,在微架构级别实现这一点的一种方法是分两步完成,即执行两条指令(微操作)——将数据从 A 加载到寄存器,然后从该寄存器存储到内存位置 B . 另一种方法是将数据移动卸载到协处理器,这可能更有效地在内存中移动数据(DMA引擎)。无论哪种方式,程序员都将操作编码为一条指令(“mov”
另一方面,RISC ISA 倾向于(尽管并非总是)在处理器中实际执行时公开操作(即以微操作的形式),程序员的工作是将这些操作组合成更复杂的操作程序员希望程序做什么。上述作为示例的移动操作必须明确编码为两条指令或使用 DMA。
作者给出的 RISC ISA 公开实现细节(“工件”)的示例是关于分支延迟槽,其中分支之后的指令将始终独立执行,无论是否采用分支。这是由于指令流水线化,这是一种用于加速执行的微架构技术。在这种情况下,ISA 暴露了程序员需要注意的微架构细节,以保证程序的正确性。流水线指令还可以创建其他流水线危害,我认为作者的意思是“禁止的指令序列”。这些指令序列本身并没有被禁止,您可以执行它们,但它们会产生错误的结果。
希望这可以帮助。
推荐阅读
- matlab - 在 Matlab 或 Mathematica 中处理未知数量的变量
- javascript - 试图通过 API 导航,无法通过第一层
- python - 脚本不会将标题写入 csv
- java - 使用@Mock 注释的对象是否应该设置详细值?
- pysimplegui - PysimpleGUI while 真正循环?
- r - 如何在 R 的团队云端硬盘中读取 Google 电子表格?
- amazon-web-services - Dynomodb 的 Amazon Api Gateway 服务代理
- java - 编写正则表达式模式以便于理解/维护?
- jquery - 对特定列进行排序不起作用 - jquery Datatables
- react-native - 打开另一个屏幕 React-navigation 3.. flatlist