fpu以基于堆栈的方式实现寄存器的动机是什么?

时间:2012-02-14 06:22:50

标签: assembly stack fpu

fpu以基于堆栈的方式实现寄存器的动机是什么?据我所知,其他指令集如x86 / sse使用命名寄存器。我可以想象基于堆栈的属性通常与我们的函数思想相对应,从而为汇编程序员提供了更直观的设计。

然而,我很好奇是否有一些更有形的动机,即技术优势。

3 个答案:

答案 0 :(得分:5)

现在,这些架构在现场不再常见。尽管如此,寄存器和程序代码空间的硅空间都是稀有资源(现在在嵌入式环境中仍然如此)。这几乎总结了这种架构背后的两个动机:

  • ISA更加苗条
    • 需要更少的寄存器编码空间
    • 关于堆栈处理(显然)等事情的指示较少
  • 更简单的硬件设计
    • 减少寄存器解码逻辑
    • 非常确定且数学上易于理解的行为(像Java虚拟机这样的虚拟架构仍然使用它的原因)

答案 1 :(得分:3)

这个问题只能由最初的8087本人W Kahan的设计师真实地回答,他在一篇名为"On the Advantages of the 8087's Stack"的短篇论文中写过这篇文章。

从那里:

  • 8087堆栈实际上不是“经典堆栈”,您可以访问任何寄存器,而不仅仅是前两个/三个寄存器。
  • 使用两个操作数/指令设置的平面寄存器是不切实际的:协处理器指令缺少编码空间,这使得单操作数指令成为首选(并且堆栈擅长),以及它可以的寄存器数量已经有(显然8个是不可能的,似乎只有4个寄存器有足够的空间)被认为不足以有效计算某些常见的浮点运算。
  • 堆栈溢出/下溢应该不经常发生,并且用软件处理,给出了更大堆栈的错觉。

答案 2 :(得分:1)

这主要仅适用于x86,因为ARM和PowerPC以及MIPS和Sparc都不会将其FPU实现为基于堆栈的计算机。

现在我们已将其缩小到x86,原因很明显。像计算中的许多其他东西一样归结为历史原因(有些人称之为歇斯底里的葡萄干,因为真正的原因并没有真正意义)。

历史原因是x86架构没有FPU。现在,我知道你会说“但看看Pentiums!”。是的,他们有FPU,但IBM选择构建他们的PC的原始8086没有FPU - 这是一个像许多低端微控制器这样的严格整数机器。

这不是太大的问题,因为它主要是低端终端和文本处理器。但它的廉价和普及突然看到它被用于科学和工程应用。所以人们想出了带有FPU芯片的附加扩展卡,以加快速度。最受欢迎的这些卡恰好使用基于堆栈的芯片,该芯片也是由英特尔制造的。这一小事实使英特尔更容易将芯片集成到未来的几代CPU中。

此时,英特尔仍然可以设计一个不基于附加芯片的指令集。但发生了两件事。许多应用程序(主要是游戏和电子表格)开始使用附加FPU,这些应用程序变得非常非常受欢迎。此外,其他芯片供应商也看到了PC市场正在发生的事情,并希望采取行动。因此,由于向后兼容并且需要快速添加此功能,英特尔做了最明智的事情(在业务管理方面,不一定在工程方面):他们只是将协处理器芯片包含在他们的下一个版本的x86中,以便营销部门可以说他们有一个FPU。

长话短说:歇斯底里的葡萄干!