为什么nop
被分配到intel x86汇编的0x90
?
直觉上我会期望0x00
将映射到nop
(在intel x86上也是xchg eax, eax
),就像ARM A32
和其他一些架构一样。
0x00000000实际上不是ARM A32上的NOP,尽管它表现得像一个;它实际上是andeq r0, r0, r0
而真正的NOP是0xe1a00000
(mov r0,r0)。将NUL字节设为NOP是一个相当糟糕的主意,因为这会使每个空的内存区域成为免费的NOP幻灯片,从而大大增加了攻击的风险。现代架构通常试图使所有零都是中断指令或类似的以避免这种攻击向量。例如,ARM A64使0x00000000
成为永久未定义的指令udf 0
。
0x90
实际上只是0x90 + r
操作码系列的一个指令,代表xchg r32, eax
。 eax
是0,所以0x90
代表xchg eax, eax
,这是一个NOP。在长模式下,0x90
是特殊的,它不会将高32位的rax
归零,以保持其单字节NOP的功能。