Skip to content

Intel 8087 的 FXCH 指令怎麼交換暫存器?從 14 條微指令看懂浮點微碼設計

原文連結:https://www.righto.com/2026/05/microcode-inside-intel-8087-floating.html

文章說明

這篇文章是 Ken Shirriff 的晶片逆向系列之一,主題是 Intel 8087 浮點協同處理器裡的 FXCH 指令。表面上,FXCH 只是交換兩個浮點堆疊暫存器,但作者透過實體拆解、顯微影像與微碼還原,展示這個看似簡單的動作,在硬體內部其實涉及不少狀態處理與例外控制。

內容介紹

文章先交代 8087 的背景。這顆 1980 年推出的浮點處理器,將浮點運算速度提升到當時相當驚人的程度,也奠定了後來 x87 浮點架構的基礎。它內部以 80-bit 格式保存數值,使用八個 stack register 搭配 tag bits 追蹤每個值是一般值、零、特殊值還是空值。這種堆疊式設計雖然對編譯器與函式呼叫有其歷史理由,但也使得像 FXCH 這種「交換頂端與某個 ST(i)」的操作變得值得仔細研究。

作者利用顯微鏡取得晶片高解析影像,定位出微碼 ROM、資料路徑與暫存器區塊,並和 Opcode Collective 一起逆向 8087 的微指令系統。文章的主角 FXCH 共有 14 條微指令,流程不是直接把兩個堆疊位置互換,而是先把 ST(0) 讀到 tmpA、再把目標 ST(i) 讀到 tmpB,確認兩者是否為空,再視情況寫回相反位置。

最精彩的是例外路徑處理。若任一暫存器為空,8087 會觸發 invalid operation 例外。如果該例外未被 mask,微碼會提前結束並交由主 CPU 處理中斷;若例外被 mask,則會把空值替換為特殊的 NaN,再繼續完成交換。這說明 8087 的微碼並不只是搬資料,也要與控制暫存器、狀態旗標與例外機制合作。

文章還解釋了為什麼微碼中會穿插 nop。這些 nop 顯示暫存器讀寫之間存在時序限制,某些 bus 或內部儲存結構需要一個 cycle 緩衝。也就是說,即使邏輯上只是 swap,硬體層仍必須配合資料通路的節奏安排。這種細節讓人看見早期浮點硬體設計的工程味。

更廣義地看,文章示範了如何從晶片影像一路推回微架構與指令語意。它不只是介紹一條指令,而是在示範逆向工程如何把抽象 ISA 與實體電路接起來。對理解電腦體系結構的人而言,這種文章非常有教育價值。

你可以帶走的重點

  1. 看似簡單的 FXCH 指令,在 8087 內部其實要靠 14 條微指令完成。

  2. 8087 的 tag bits 與例外機制,使得「交換」同時也是一次資料有效性檢查。

  3. 微碼設計不只描述演算法,也要配合資料通路與時序限制。

  4. 逆向晶片微碼能幫助我們更具體地理解早期處理器是如何把 ISA 落到硬體上的。

適合誰閱讀

  • 對 CPU 微架構、x87 歷史與晶片逆向有興趣的工程師與學生
  • 想理解微碼如何處理例外、堆疊暫存器與資料搬移的人
  • 喜歡 Ken Shirriff 這類硬體考古與低層技術文章的讀者

由 Wo9Fei 製作