为什么在x86汇编中将NOP分配给0x90?

Jon*_*ein 4 x86 assembly machine-code opcode nop

为什么要nop分配给0x90intel x86组件?

凭直觉,我希望它0x00会映射到nop(也xchg eax, eax位于intel x86上),这ARM A32和其他一些体系结构一样。

fuz*_*fuz 8

0x00000000实际上在ARM A32上不是NOP,尽管其行为类似于1。实际上andeq r0, r0, r0,真正的NOP是0xe1a00000(mov r0,r0)。将NUL字节设置为NOP是一个相当糟糕的主意,因为这会使每个空内存区域成为空闲的NOP幻灯片,从而大大增加了遭受攻击的风险。现代架构通常会尝试使所有零成为中断指令或类似指令,以避免这种攻击向量。例如,ARM A64发出0x00000000永久未定义的指令udf 0

0x90实际上只是0x90 + r操作码系列的一条指令xchg r32, eaxeax是寄存器0,因此0x90代表xchg eax, eaxNOP。在长模式下,0x90特殊情况下不要将高32位清零rax以保持其作为单字节NOP的功能。