为什么在Intel x86程序集上将nop
分配给0x90
?
凭直觉,我希望0x00
会映射到nop
(在intel x86上也是xchg eax, eax
),就像ARM A32
和其他一些体系结构一样。
最佳答案
0x00000000实际上在ARM A32上不是NOP,尽管它的行为类似于1。它实际上是andeq r0, r0, r0
,而真正的NOP是0xe1a00000
(移动r0,r0)。将NUL字节设置为NOP是一个相当糟糕的主意,因为这会使每个空内存区域成为空闲的NOP幻灯片,从而大大增加了遭受攻击的风险。现代体系结构通常会尝试使所有零成为中断指令或类似指令,以避免此攻击向量。例如,ARM A64使0x00000000
成为永久未定义的指令udf 0
。0x90
实际上只是0x90 + r
操作码系列xchg r32, eax
的一条指令。 eax
是寄存器0,因此0x90
代表xchg eax, eax
,它是NOP。在长模式下,对0x90
进行特殊处理时,请勿将rax
的高32位清零,以保持其作为单字节NOP的功能。
关于assembly - 为什么在x86汇编中将NOP分配给0x90?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55941924/