2017-03-01 278 views
2

大部分歷史感興趣,如果我要爲彙編程序實現8086兼容性,什麼操作數被認爲對ESC指令有效?什麼是8086 ESC指令操作碼

ESC opcode, source

從8086編程人員手冊我知道,opcode是在範圍0立即到63和source是寄存器或存儲器。但是什麼寄存器可以被編碼? reg8reg16或只有reg16?如果source是內存,操作數大小(mem8mem16)是否重要?

基本上,以上兩者並不真正從指令編碼的角度關係(如,例如,既esc 0x01, chesc 0x01, bp會產生相同的結果),但也許裝配強迫限制

而且,最後,但並非最不重要,哪裏可以找到ESC操作碼的說明?

回答

5

8086有一個統一指定爲ESC(轉義到協處理器)的操作碼空間。它佔用範圍d8df。在這個指令空間中的每條指令之後都有一個modr/m字節,並且取決於mod-field,零到兩個處理字節。當8086遇到帶有兩個寄存器操作數(即mod = 11)的ESC指令時,它執行一個nop。當處理器遇到帶有內存操作數的ESC指令時,將從內存操作數指示的地址開始執行讀週期,並且結果將被丟棄。

使用兩個專用的信號線,一個協處理器可以區分數據獲取從指令獲取,允許它在指令流中平行於8086

此機制所使用的8087解碼掛接到的指令流:操作碼字節中的三個可用位以及modr/m字節中reg字段的三位形成一個六位操作碼。 modr/m字節的r/m字段用於指定FPU寄存器堆棧上的位置(如果mod = 11,表示兩個寄存器操作數)或內存操作數。一些操作碼根據r/m字段的內容對各種指令進行編碼。在所有這些情況下,一個指令被編碼用於存儲器操作數,而另外八個指令被編碼用於每個可能的寄存器操作數。

當8086在獲取指令並記住地址後立即執行僞提取時,8087寄存器被註冊。在從存儲器加載的指令的情況下,它加載存儲器操作數的附加字並執行其功能。在商店的情況下,它會忽略提取的結果並將其值存儲到8086指示的地址。

8087執行與8086異步的操作。8086在嘗試分派浮點時停止指令正在進行中。但是,不存在其他隱式同步。在執行操作時,8087斷言它的BUSY引腳(連接到8086的TEST引腳),編程器可以發出wait指令(9b,等待協處理器就緒),直到8087結束操作並因此釋放WAIT行。這通常在嘗試從8086讀取由8087寫入的存儲器操作數之前完成。然而,通常取而代之的是手動計算8087對於某個指令要花費多長時間,並且在確保負載發生時省略wait FPU操作完成後。

+0

「當8086在取出指令並記住地址後立即執行僞提取時,8087寄存器」我花了一些時間來理解這句話!我一直在閱讀「8087寄存器」作爲名詞,你一定是指動詞。我可以建議「8087記錄什麼時候......」或「8086記錄什麼時候......」其他人可能有同樣的困難或根本不在乎。 –