當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. 什麼使基於堆的方案比基於堆棧的方案慢?
- 5. 基本的FPU指令/堆棧概述?
- 6. 什麼是堆棧用於?他們爲什麼使用C++?
- 7. 爲什麼指針不在堆棧上?
- 8. 爲什麼基指針值存儲在堆棧
- 9. 爲什麼是基於堆棧的字節碼IL
- 10. 爲什麼JVM是基於堆棧的虛擬機?
- 11. 爲什麼作爲指針的類實例使用堆而不是堆棧?
- 12. 基於陣列的堆棧使用C#
- 13. 堆棧爲空...爲什麼?
- 14. 爲什麼CLR和JVM使用基於堆棧的體系結構?
- 15. 爲什麼堆棧溢出?
- 16. 爲什麼堆棧有界?
- 17. 爲什麼堆棧炸燬
- 18. CIL堆棧交換指令
- 19. DCD指令和IRQ堆棧
- 20. 返回指令堆棧中的指針
- 21. 使用dwarf2獲取堆棧指針的堆棧指針值
- 22. 使用2條指令設計指令集
- 23. 基於圖而不是基於堆棧
- 24. 爲什麼要使用堆棧?爲什麼不只是堆? - C/C++
- 25. JMP做什麼堆棧和幀指針?
- 26. 爲什麼堆棧地址低於Visual C++中的堆棧地址?
- 27. 基指針和堆棧指針
- 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