2014-10-18 66 views
0

當Intel首次設計8087時,他們爲什麼選擇將浮點寄存器組織爲堆棧?從這樣的設計中可以獲得什麼樣的優勢?與允許任意寄存器用作源操作數和目標操作數相比,它看起來更不靈活和難以操作。爲什麼80x87指令集使用「基於堆棧」的設計?

+1

我建議你在[電氣工程](http://electronics.stackexchange.com/)堆棧上詢問這個問題,但我相信它會歸結爲有限的晶體管數量。根據[Wikipedia](http://en.wikipedia.org/wiki/Transistor_count)8080有4500個晶體管。到8088年時,它達到29000個晶體管,但我不知道它是否與你的問題直接相關。 – 2014-10-18 20:36:32

+0

@ElliottFrisch,這不是關於IC設計的問題,而是關於指令集設計。但是,如果答案是「因爲它更容易在硅片中實現」,請繼續並將其作爲答案。不過,我不明白爲什麼會出現這種情況。 – 2014-10-18 20:42:02

+2

參見[本文檔](http://www.cims.nyu.edu/~dbindel/class/cs279/87stack.pdf)(通過[wikipedia]找到(http://en.wikipedia.org/wiki/) X87))。 – Jester 2014-10-18 23:31:50

回答

1

文章"On the Advantages of the 8087's Stack"在@Jester的評論中共享,解釋了設計師的想法。爲什麼他們組織了浮點寄存器作爲堆棧摘要:

  1. 潛在的,它可以做出過程調用更有效,因爲(在理論上)既不呼叫者也不是被調用者就必須明確地保存和恢復FP寄存器。需要進行FP計算的被調用者只需將它們的操作數推入寄存器堆棧,進行計算,並在完成時將結果從堆棧中彈出,自動恢復調用者的x87狀態。 (這與機器堆棧用於函數參數,返回值和局部變量的方式基本相同。)

  2. 考慮到8086/8088上已經編碼了指令,並且已經使用了操作碼的數量,他們只能爲8087而不是2操作數提供1操作數指令。這對於平面寄存器文件來說效果不佳。他們認爲提供FXCH指令會使其足夠簡單,可以隨意重新排列x87寄存器堆棧(以便任意的值對可以在需要時用作操作數)。此外,FXCH操作便宜。

+0

我是唯一一個認爲80x87是一個好建築的人,但卻是一些相當不好的編譯器的受害者?如果編譯器不允許聲明擴展精度變量,並且有時會在寄存器中留下80位值,但有時會將它們「溢出」爲32位或64位,則產生的語義會變得很糟糕,但8x87設計者並不會不要責怪。當人們詛咒8x87這個事實時,我感到很難過,因爲這兩個產品經常浮動,但並不總是表現爲擴展,而不是詛咒那些不讓它們一貫使用擴展的語言。 – supercat 2014-10-19 18:36:11

+0

@supercat,非常有趣,我不知道存在這樣的問題。我不認爲C標準指定應該存儲多少位「float」和「double」,或者甚至它們必須使用IEEE格式,所以似乎兼容的C編譯器*可能會使用80位'double's。如我錯了請糾正我。 – 2014-10-19 19:48:01

+0

無論出於何種原因,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