assembly - 为什么80x87指令集采用 "stack-based"设计?

标签 assembly x86 cpu-architecture instruction-set x87

回到 Intel 最初设计 8087 时,他们为什么选择将浮点寄存器组织为堆栈?从这样的设计中可以获得什么可能的优势?与允许将任意寄存器用作源和目标操作数相比,它似乎更不灵活且更难使用。

最佳答案

文章"On the Advantages of the 8087's Stack" ,在@Jester 的评论中分享,解释了设计师的想法。他们为什么将浮点寄存器组织为堆栈的摘要:

  • 潜在地,它可以使过程调用更有效,因为(理论上)调用者和被调用者都不必显式保存和恢复 FP 寄存器。需要进行 FP 计算的被调用者只需将他们的操作数压入寄存器堆栈,进行计算,并在计算完成后将结果从堆栈中弹出,自动恢复调用者的 x87 状态。 (这与机器堆栈用于函数参数、返回值和局部变量的方式基本相同。)
  • 鉴于指令已经在 8086/8088 上编码的方式,以及已经使用的操作码的数量,它们只能为 8087 提供 1 操作数指令,而不是 2 操作数指令。对于平面寄存器文件,这不会很好地工作。
  • 他们认为提供 FXCH 指令将使随意重新排列 x87 寄存器堆栈变得足够简单(以便在需要时可以将任意值对用作操作数)。此外,FXCH 操作便宜。
  • 关于assembly - 为什么80x87指令集采用 "stack-based"设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26444243/

    相关文章:

    c - 为什么在 MASM Assembly 中使用 FPU x87 指令集执行操作时会得到无意义的数字?

    c - 在应用加载和运行程序中

    c - Linux 内核 0.11 中的进程 0 堆栈

    c++ - 具有可变长度写入的多生产者多消费者无锁非阻塞环形缓冲区

    assembly - .double 类型的变量是否存储在两个寄存器中?

    assembly - 二进制文件未在 debian wheezy 上运行

    c++ - 即使从未取消引用指针,三后指针中的硬件陷阱如何发生?

    c - 新手 asm : where is the call code?

    linux - NASM 获取参数并调用 sys_execve

    linux - 递归斐波那契组装