了解 nop 位元組

了解 nop 位元組

好的,所以我正在閱讀 AMD64 手冊,知道這nop確實是一個xchg eax, eax,我查看了xchg並發現了一些有趣的東西,似乎可以將一個字節編碼到指定寄存器的指令中(抱歉我在我的 iPod 上) :圖片

所以我想知道的是處理器如何知道後面是否有一個位元組可以使用,或者該額外的暫存器必須是某種類型,rAX導致它實際上仍然是一個位元組0x90

答案1

我查看了 xchg 並發現了一些有趣的東西,似乎可以將一個位元組編碼到用於指定寄存器的指令中

是的,這就是大多數 x86 指令的工作方式。指令一次取得 32 或 64 位元(機器的字長),而不是一次取得位元組。

指定XCHGof rAXwith rAX(其中rAXisEAX在 32 位元機器上,RAX在 64 位元機器上)將為,因為is0x90的暫存器復用器代碼(實際上是一個不執行任何操作的單週期操作)。類似地,該指令將彙編為(存在的複用器程式碼)。rAX0x00XCHG rBX, rAX0x93rBX0b011

操作碼編碼應該在手冊的其他地方列出,或者您可以查看 x86 操作碼映射(這有助於理解所有內容如何混合在一起)。您可以在Intel 64 與 IA-32 架構軟體開發人員手冊(第 2 卷,附錄 A.3)。

所以我想知道的是處理器如何知道後面是否有一個位元組可以使用,或者那個額外的暫存器必須是 rAX 類型,導致它實際上仍然是一個位元組 0x90

在這裡,情況恰恰相反。對於 64 位元模式,實際上有一個字首在指令字本身中指示(REX前綴)。處理器知道根據前綴的存在或不存在要查找什麼REX- 並且在不存在的情況下,指令仍然只是0x90

相關內容