【发布时间】:2015-06-05 10:12:24
【问题描述】:
操作码前缀可以重复。例如,让我们以 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 不能重复。是 Visual Studio 特定的处理与硬件语义不匹配还是 cpu 本身不允许这样做?
【问题讨论】:
-
复制前缀是未定义的行为。也就是说,我不知道为什么 VS 反汇编会这样做。例如,
ndisasm和objdump按预期解码。 -
"You could only form an infinitely long instruction by using redundant prefixes in front on the opcodes"。 "例如,您可以将看似无害的指令:
89 E5 mov %sp,%bp变成一个非常长的指令:66 66 66 66 … 66 66 89 E5 mov %sp,%bp" -
@LưuVĩnhPhúc 你不能有无限的前缀。虽然我不相信重复的“经典”前缀会导致未定义的行为,但 gas 将它们用于长 NOP,总指令长度大于 15。
标签: assembly cpu disassembly