使用内存覆盖前缀但所有操作数都是寄存器时会发生什么?

mat*_*ix2 3 memory x86 assembly overriding cpu-architecture

使用内存覆盖前缀但所有操作数都是寄存器时会发生什么?

所以,让我们说你的代码mov eax, ebxadd eax, ebx默认是32位,但你使用67h覆盖.

处理器如何处理这种情况?

prl*_*prl 5

英特尔软件开发人员手册*,第2卷,第2.1节详细介绍了每个指令前缀的行为.它表示使用地址大小前缀(67h)和没有内存操作数的指令是保留的,可能会导致不可预测的行为.

操作数大小前缀(66h)可用于在16位和32位操作数大小之间切换,也可用作某些SSE2/SSE3/SSSE3/SSE4指令的强制前缀.其他用途是保留的,可能会导致不可预测的行为.

段覆盖前缀保留在任何分支指令中.

*https://software.intel.com/en-us/articles/intel-sdm

  • 在真实硬件上,不适用的前缀将被忽略。这就是为什么它们被“保留”而不是“导致#UD”的原因。除了 `lock`,它在不适用时执行 `#UD`。 (2认同)