80386 - cpu如何在movzbw和movzbl之间进行选择

时间:2015-10-11 03:11:53

标签: assembly x86

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

2 个答案:

答案 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位。