当Intel首次设计8087时,他们为什么选择将浮点寄存器组织为堆栈?从这样的设计中可以获得什么样的优势?与允许任意寄存器用作源操作数和目标操作数相比,它看起来更不灵活和难以操作。为什么80x87指令集使用“基于堆栈”的设计?
回答
文章"On the Advantages of the 8087's Stack"在@Jester的评论中共享,解释了设计师的想法。为什么他们组织了浮点寄存器作为堆栈摘要:
潜在的,它可以做出过程调用更有效,因为(在理论上)既不呼叫者也不是被调用者就必须明确地保存和恢复FP寄存器。需要进行FP计算的被调用者只需将它们的操作数推入寄存器堆栈,进行计算,并在完成时将结果从堆栈中弹出,自动恢复调用者的x87状态。 (这与机器堆栈用于函数参数,返回值和局部变量的方式基本相同。)
考虑到8086/8088上已经编码了指令,并且已经使用了操作码的数量,他们只能为8087而不是2操作数提供1操作数指令。这对于平面寄存器文件来说效果不佳。他们认为提供FXCH指令会使其足够简单,可以随意重新排列x87寄存器堆栈(以便任意的值对可以在需要时用作操作数)。此外,FXCH操作便宜。
我是唯一一个认为80x87是一个好建筑的人,但却是一些相当不好的编译器的受害者?如果编译器不允许声明扩展精度变量,并且有时会在寄存器中留下80位值,但有时会将它们“溢出”为32位或64位,则产生的语义会变得很糟糕,但8x87设计者并不会不要责怪。当人们诅咒8x87这个事实时,我感到很难过,因为这两个产品经常浮动,但并不总是表现为扩展,而不是诅咒那些不让它们一贯使用扩展的语言。 – supercat 2014-10-19 18:36:11
@supercat,非常有趣,我不知道存在这样的问题。我不认为C标准指定应该存储多少位“float”和“double”,或者甚至它们必须使用IEEE格式,所以似乎兼容的C编译器*可能会使用80位'double's。如我错了请纠正我。 – 2014-10-19 19:48:01
无论出于何种原因,x86的许多C编译器都将64位用于'double'和'long double'类型,但未能提供任何80位数据类型;这意味着如果例如一个想要计算'x = sin(a)+ b; y = sin(a)+ c;'要么必须计算sin(a)两次,否则在将其存储到临时变量时会失去精度。更糟糕的是,即使'sin(a)'操作出现两次,如上所示,一些优化编译器会将中间计算保存为64位值,在计算x时使用80位值,并使用64计算y的位值。 – supercat 2014-10-19 20:04:09
- 1. 什么是基于堆栈的引用?
- 2. 什么是基于堆栈的类?
- 3. 什么使基于堆的方案比基于堆栈的方案慢?
- 4. 什么是堆栈用于?他们为什么使用C++?
- 5. 为什么指针不在堆栈上?
- 6. 为什么基指针值存储在堆栈
- 7. 为什么JVM是基于堆栈的虚拟机?
- 8. 为什么作为指针的类实例使用堆而不是堆栈?
- 9. 基于阵列的堆栈使用C#
- 10. 堆栈为空...为什么?
- 11. CIL堆栈交换指令
- 12. 为什么堆栈有界?
- 13. 返回指令堆栈中的指针
- 14. 使用dwarf2获取堆栈指针的堆栈指针值
- 15. 为什么会有堆栈和堆?
- 16. JMP做什么堆栈和帧指针?
- 17. 基指针和堆栈指针
- 18. 有关设计堆栈
- 19. 程序集中的堆栈/基址指针
- 20. 什么设置堆栈大小?
- 21. 两个进程具有相同的堆栈指针。为什么?
- 22. 为什么堆栈结束为空?
- 23. 什么时候在C#中使用堆栈<T>集合?
- 24. C++堆栈/堆栈。为什么只有一个新操作员?
- 25. 为什么块被设计为在堆栈上分配,除非被复制?
- 26. 什么“堆栈无效,堆栈只支持堆栈1和堆栈5”是什么意思?
- 27. 为什么在FreeBSD中重置堆栈指针寄存器?
- 28. 为什么本地变量不改变堆栈指针?
- 29. 为什么基于寄存器的虚拟机比基于堆栈的虚拟机更好?
- 30. 为什么堆栈低于内存中的文本?
我建议你在[电气工程](http://electronics.stackexchange.com/)堆栈上询问这个问题,但我相信它会归结为有限的晶体管数量。根据[Wikipedia](http://en.wikipedia.org/wiki/Transistor_count)8080有4500个晶体管。到8088年时,它达到29000个晶体管,但我不知道它是否与你的问题直接相关。 – 2014-10-18 20:36:32
@ElliottFrisch,这不是关于IC设计的问题,而是关于指令集设计。但是,如果答案是“因为它更容易在硅片中实现”,请继续并将其作为答案。不过,我不明白为什么会出现这种情况。 – 2014-10-18 20:42:02
参见[本文档](http://www.cims.nyu.edu/~dbindel/class/cs279/87stack.pdf)(通过[wikipedia]找到(http://en.wikipedia.org/wiki/) X87))。 – Jester 2014-10-18 23:31:50