为什么在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/

10-13 01:47