嘿,我想知道一些只在长模式下有效的指令。
例如 0f 20 55 - mov rbp, cr2
。
我引用的是 ref.x86asm.net xml mapping .
根据 xml,该指令的操作模式是 e
,这意味着:
e applies for 64-bit mode. SMM is not taken into account. 63 MOVSXD
现在,如果我看一下反汇编程序,例如 GCC或 capstone ,字节流 0f 20 55
在保护模式下被解码为 mov ebp, cr2
,尽管引用资料说它不应该在 x64 以外的模式下可用。
所以我想知道是不是我没有理解某些东西,或者这些反汇编程序出了问题?
最佳答案
进出控制寄存器的移动在保护模式和长模式下可用,使用相同的编码,但具有不同的含义。 mov rbp, cr2
仅在长模式下可用(显然,它写入仅在长模式下存在的 64 位 GPR)并且 mov ebp, cr2
仅在 protected 模式下可用模式(在长模式中并非天生不可能,但它的编码被重用于 mov rbp, cr2
,就像 push eax
的编码被重用于表示 推送 rax
)。反汇编程序根据模式正确地解释了相同的机器代码。
关于assembly - x86 长模式特定指令在保护模式下可用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69198685/