movzbw 和 movzbl 的操作码均为OF B6
。我不明白如何通过观察 ModR / M 字节来区分它们。来自Intel 80386 Programmer's Reference Manual (1986):
MOVZX ── Move with Zero-Extend Opcode Instruction Clocks Description 0F B6 /r MOVZX r16,r/m8 3/6 Move byte to word with zero-extend 0F B6 /r MOVZX r32,r/m8 3/6 Move byte to dword, zero-extend 0F B7 /r MOVZX r32,r/m16 3/6 Move word to dword, zero-extend
处理器如何区分 movzbw 和 movzbl ?
答案 0 :(得分:4)
看起来它使用前缀字节:
66 0f b6 c0 movzx ax,al
0f b6 c0 movzx eax,al
0f b7 c0 movzx eax,ax
编辑:注意,在64位模式下,上面是相同的,但还有另一个前缀:
48 0f b6 c0 movzx rax,al
48 0f b7 c0 movzx rax,ax
请注意,没有movzx rax, eax
指令。
(我这是一个非常新手,所以我无法解释原因,我只是在编译器中抛出代码并查看它是否已被接受)。
答案 1 :(得分:3)
查看操作数大小前缀66H。它将操作数大小切换为16到32位。