PUSH / POP指令是否被认为是RISC或CISC?

时间:2016-12-08 02:55:36

标签: assembly cpu-architecture instruction-set risc

我在接受采访时被问到PUSHPOP是RISC还是CISC的指示。我说他们是RISC,但他们告诉我他们实际上是CISC指令。我建议ARM(一种常见的RISC实现)有这些指令,但是他们指出ARM是混合的而不是纯粹的RISC。

我无法在网上找到任何明确的证据。 PUSHPOP指令是否真的被认为是CISC架构的标志,还是会在RISC系统上找到?为什么呢?

2 个答案:

答案 0 :(得分:7)

RISC意味着减少指令集" (通常为LOAD寄存器,STORE寄存器,ADD寄存器,CMP寄存器,Branch条件+其他几个)。

概念和经验是,复杂指令通常无法实现无法通过更简单的指令序列实现的有用效果,特别是如果用于实现此类复杂指令的额外逻辑反而投入到简单的指令中RISC指令运行得更快。

PUSH和POP基本上是STORE / LOAD间接的简单组合,并且向寄存器添加常量。因此,如果一个专用于堆栈指针的寄存器,则可以轻松模拟PUSH和POP,并且快速流水线机器可以执行PUSH和POP,速度与相应的RISC指令一样快。所以大多数人认为PUSH和POP是CISC指令;他们并没有真正为你买单。

如果考虑CALL(== PUSH PC + JMP)和RET(POP PC),生活会变得更有趣。这些也很容易在正确的RISC架构上进行模拟。然而,POP PC会引起管道泡沫,因为处理器很难预测新PC的位置,因此无法进行预取。由于内存距离时间很长,这可能是代码中的主要性能抑制因素,并且有很多子程序调用。

在这里,有一种想要进入CISC。你真正想要的是一些预测返回PC的方法。许多现代CPU通过保持一个"影子调用堆栈来实现这一点。在硬件中。每个CALL将PC推入内存堆栈,也推送到卷影堆栈;每个RET从内存堆栈中弹出一个PC值,但是使用影子堆栈的顶部条目来预测指令流,它基本上是零时间访问(当然,弹出阴影堆栈)。这样,指令流就不会被中断,因此CISC机器在性能上获胜。

(有人想知道一个带有大量寄存器的RISC机器,编译叶函数调用总是使用寄存器存储返回PC,可能不如影子堆栈那么有效.Sun Sparc有点用它的寄存器做这个窗口)。

这告诉我们RISC与CISC过度简化设计权衡。你想要的只是简单,除非更复杂的实际上给你带来了什么。例如,与使用RISC指令的任何模拟相比,硬件中的IEEE浮点数 lot 更快。

因此,大多数现代机器并不是整齐的RISC或CISC。性能分析选择。

答案 1 :(得分:1)

“RISC”对不同的人意味着不同的东西。我见过的定义包括:

  • 指令数量减少

  • 固定尺寸​​说明(可能很多)

  • 加载/存储架构(可能有很多可变大小的指令)

  • 不会将指令转换为微操作且没有“微代码”的 CPU(例如 8086、8088、80186 ……,但不是 80486、奔腾……)

  • 以上两项或多项的任意组合

  • 为了降低开发成本而牺牲性能的任何事情

<块引用>

PUSH/POP 指令是否被视为 RISC 或 CISC?

是(PUSH/POP 指令被认为是 RISC 或 CISC,或两者兼而有之;取决于何时应用 RISC 或 CISC 的哪个定义)。

问题本身大多是错误的二分法;比如问“灰色是黑色还是白色?”。