在英特爾64和IA-32指令集手冊3.1.1.5一節中,它在指令摘要表中引入了64/32-bit模式列。
對于64-bit模式支持,它說:
- I-不支持
- N.E.—表示指令語法在64-bit模式下不可編碼(它可能表示其他模式下有效指令序列的一部分)
在64-bit模式下不可編碼的指令和在64-bit模式下不支持的指令之間有什么區別?
在英特爾64和IA-32指令集手冊3.1.1.5一節中,它在指令摘要表中引入了64/32-bit模式列。
對于64-bit模式支持,它說:
- I-不支持
- N.E.—表示指令語法在64-bit模式下不可編碼(它可能表示其他模式下有效指令序列的一部分)
在64-bit模式下不可編碼的指令和在64-bit模式下不支持的指令之間有什么區別?
公眾號:1024技術圈
?? 提供互聯網知識和資訊,分享IT前沿技術,熱門資源,大廠面試題 ??
現在還不完全清楚英特爾到底在做什么。可能無效僅用于將#UD(非法指令錯誤)的操作碼,這就是為什么它們使用N.E.即使在沒有其他方法用operand-size編碼指令的情況下。
這將是有意義的,我認為匹配他們的文件,如果他們說“在這種模式”。e、 g.
0x1F
在64-bit模式中不是有效的操作碼或前綴,但在其他模式中表示pop ds
。Invalid的一個例子是64-bit模式下的
aam
(立即除法):在該模式下根本沒有指令編碼。N.E.的一個例子是
inc r32
縮寫0x40+rd,64-bit模式將其重新用作REX前綴(連同0x48+rddec
)。inc eax
是可編碼的,但不能使用該操作碼。類似地,
inc r/m64
對于compat/legacy模式被列為N.E;也就是說,它只在long模式下可用,通過REX前綴。pop
在一個表中有兩種類型的示例:pop ds
(或ES/SS),因此在64-bit模式下它是“無效的”。(pop-cs從來都不是有效的,除了一些沒有文檔記錄的/8086早期;只有像retf這樣的東西將cs:[ER]IP設置在一起,而不僅僅是cs。)pop fs
和GS可以用16-bit或64-bitoperand-size完成,但不能用32-bit,所以0F A1 POP FS
。。。將棧頂彈出到FS中;將棧指針遞增32位“表中的行具有N.E.64-bit模式,對compat/legacy有效。還有。。。乘64位行是相反的,對64有效,對32無效。(有趣的是,當RSP以字節計數時,他們寫的是“按64位”而不是“按8位”,而不是bits.)pop r32
和pop r/m32
都被列為64-bit模式的N.E.,不是無效的,盡管在該模式下無法對pop eax
或pop dword [rdi]
進行編碼。(對于默認值為64的操作碼,即使是REX.W=0也不會將操作數大小重寫為32-bit,但是
66
operand-size前綴會像往常一樣使push/pop16-bit。盡管“description”文本說operand-size可能被REX.W覆蓋,但這似乎是在討論一般的指令,正如當前的code-segment'sDflag.所暗示的那樣也許是因為64-bit模式仍然可以用相同的操作碼彈出其他2個大小(64或16-bit)?或者其他兩種尺寸的r/m和pop?e、 g.
pop ax
和pop word [rdi]
在64-bit模式下是有效的,當然還有pop rax
。這與他們列出
pop ds
的方式是一致的。我想知道
movsxd r64, r/m32
在16/32-bit模式下是無效的還是不正確的,因為相同的操作碼在64-bit模式之外有不同的含義(ARPL r,r/m16-http://ref.x86asm.net/coder32.html#x63).但是它只適用于32-bit模式,而且
movsxd r32, r/m32
對于這兩種模式都被列為“有效”!那肯定是個錯誤,因為它顯然是錯的。compat/legacy模式下的操作碼63
是ARPL。(列為N.E.(64)/Valid(32),其操作部分提到movsxd表示64-bitmode.),所以N.E.將匹配他們的模式,將其用于表示其他意思但沒有錯誤的事物。(Real-world匯編程序,如NASM和YASM,即使在64-bit模式下也拒絕
movsxd eax, ecx
;他們想要一個64-bit目的地,拒絕讓你把它當作一個更糟糕的mov eax, ecx
,盡管這在機器代碼中是可能的,但英特爾的手冊不鼓勵這樣做。movsxd
不幸的是,需要一個REX前綴來滿足它的唯一目的:sign-extend32到64。不是堆棧或分支操作,我猜AMD決定將operand-size默認為64-bit.更為一致)