好的,所以我正在閱讀 AMD64 手冊,知道這nop
確實是一個xchg eax, eax
,我查看了xchg
並發現了一些有趣的東西,似乎可以將一個字節編碼到指定寄存器的指令中(抱歉我在我的 iPod 上) :圖片。
所以我想知道的是處理器如何知道後面是否有一個位元組可以使用,或者該額外的暫存器必須是某種類型,rAX
導致它實際上仍然是一個位元組0x90
答案1
我查看了 xchg 並發現了一些有趣的東西,似乎可以將一個位元組編碼到用於指定寄存器的指令中
是的,這就是大多數 x86 指令的工作方式。指令一次取得 32 或 64 位元(機器的字長),而不是一次取得位元組。
指定XCHG
of rAX
with rAX
(其中rAX
isEAX
在 32 位元機器上,RAX
在 64 位元機器上)將為,因為is0x90
的暫存器復用器代碼(實際上是一個不執行任何操作的單週期操作)。類似地,該指令將彙編為(存在的複用器程式碼)。rAX
0x00
XCHG rBX, rAX
0x93
rBX
0b011
操作碼編碼應該在手冊的其他地方列出,或者您可以查看 x86 操作碼映射(這有助於理解所有內容如何混合在一起)。您可以在Intel 64 與 IA-32 架構軟體開發人員手冊(第 2 卷,附錄 A.3)。
所以我想知道的是處理器如何知道後面是否有一個位元組可以使用,或者那個額外的暫存器必須是 rAX 類型,導致它實際上仍然是一個位元組 0x90
在這裡,情況恰恰相反。對於 64 位元模式,實際上有一個字首在指令字本身中指示(REX
前綴)。處理器知道根據前綴的存在或不存在要查找什麼REX
- 並且在不存在的情況下,指令仍然只是0x90
。