操作码前缀可以重复。例如,让我们采用带有操作数大小覆盖前缀的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本身不允许这样做?
答案 0 :(得分:1)
似乎VS根本不支持这一点。使用ndisasm(nasm的反汇编程序),它运行良好,它被反汇编为:
6767668B00 mov ax,[eax]
然而,问题是,在正常的64位环境中,通常不能使用低32位进行寻址。
但我测试了:
67674889D8 mov rax,rbx
并且CPU(i7-4770)毫无例外地执行了它。