x86-64重复指令前缀

时间:2015-06-05 10:12:24

标签: assembly cpu disassembly

操作码前缀可以重复。例如,让我们采用带有操作数大小覆盖前缀的8B操作码(mov):

66 66 66 66 66 8B 00

visual studio反汇编程序的输出(x64模式):

mov ax, word ptr [rax]

现在,让我们来看看这个:

66 66 66 66 67 8B 00

visual studio反汇编程序的输出:

mov ax, word ptr [eax]

这一个:

66 66 66 67 /*it throws away left side*/ 67 8B 00

visual studio反汇编程序的输出:

??
??
??
??
mov eax, dword ptr [eax]

所以,我想问为什么前缀67不能重复。是视觉工作室特定的处理与硬件语义不匹配还是cpu本身不允许这样做?

1 个答案:

答案 0 :(得分:1)

似乎VS根本不支持这一点。使用ndisasm(nasm的反汇编程序),它运行良好,它被反汇编为:

6767668B00        mov ax,[eax]

然而,问题是,在正常的64位环境中,通常不能使用低32位进行寻址。

但我测试了:

 67674889D8        mov rax,rbx

并且CPU(i7-4770)毫无例外地执行了它。