为什么将nop
分配给英特尔x86组装上的0x90
?
直觉上,我预计0x00
会映射到nop
(这也是英特尔x86的xchg eax, eax
),就像ARM A32
和其他一些架构一样。
发布于 2019-05-02 04:19:17
0x00000000在ARM A32上实际上不是NOP,尽管它的行为很像;它实际上是andeq r0, r0, r0
,而真正的NOP是0xe1a00000
(mov r0,r0)。将NUL字节设置为NOP是一个相当糟糕的想法,因为这会使每个空内存区域都成为一个空闲的NOP幻灯片,从而极大地增加被攻击的风险。现代体系结构通常会尝试将全零设置为中断指令或类似指令,以避免这种攻击向量。例如,ARM A64使0x00000000
成为永久未定义的指令udf 0
。
0x90
实际上只是代表xchg r32, eax
的0x90 + r
操作码家族中的一条指令。eax
是寄存器0,所以0x90
代表xchg eax, eax
,这是一个NOP。在长模式下,0x90
的特殊情况是不将rax
的高32位清零,以保持其作为单字节NOP的功能。
https://stackoverflow.com/questions/55941924
复制相似问题