Jon*_*ein 4 x86 assembly machine-code opcode nop
为什么要nop
分配给0x90
intel x86组件?
凭直觉,我希望它0x00
会映射到nop
(也xchg eax, eax
位于intel x86上),这ARM A32
和其他一些体系结构一样。
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, eax
。 eax
是寄存器0,因此0x90
代表xchg eax, eax
NOP。在长模式下,0x90
特殊情况下不要将高32位清零rax
以保持其作为单字节NOP的功能。