【问题标题】:x86 long mode specific instructions available on protected mode?x86 长模式特定指令可用于保护模式?
【发布时间】:2021-09-15 19:16:23
【问题描述】:

嘿,我想知道一些只能在长模式下有效的指令。

例如0f 20 55 - mov rbp, cr2

我引用的是 ref.x86asm.net xml mapping
根据xml,这条指令的操作模式是e,意思是:

e 适用于 64 位模式。不考虑 SMM。 63 MOVSXD

现在,如果我查看诸如 GCCcapstone 之类的反汇编程序,则字节流 0f 20 55 在受保护模式下被解码为 mov ebp, cr2,即使参考资料说它不应该在其他模式下可用比 x64。

所以我想知道是我不理解某些东西还是这些反汇编程序有问题?

【问题讨论】:

    标签: assembly x86 disassembly protected-mode


    【解决方案1】:

    在保护模式和长模式下可以使用相同的编码,但具有不同的含义,可以在控制寄存器中进行移入和移出。 mov rbp, cr2 仅在长模式下可用(显然,它写入仅在长模式下存在的 64 位 GPR),mov ebp, cr2 仅在保护模式下可用(在长模式下并非天生不可能,但它的编码被重用对于mov rbp, cr2,就像push eax 的编码被重用于表示push rax)。反汇编程序根据模式正确解释相同的机器代码。

    【讨论】:

    • @Jorayen 我认为最一致的解释是“如果您将其编码为 64 位代码,然后将其解码为 32 位代码,您将得到具有不同含义的东西”。在mov rbp, cr2的情况下意义差异很小,在其他情况下可能很大,例如movsxd变成arpl
    • @Jorayen:关键是,你必须知道你在什么模式下解释任何操作码。
    • @Jorayen:英特尔的手册说这种编码是“不鼓励的”:felixcloutier.com/x86/movsx:movsxd。据我所知,它应该被反汇编为movsxd esi, dword ptr [rbx],即它将一个 32 位值“符号扩展”为一个 32 位值,实际上根本没有扩展。我希望rsi 的上半部分无条件归零。但我没有测试过。
    • @Jorayen 我相信 GCC 和 capstone 是错误的(并且 Visual Studio 中的反汇编程序不同意它们)。不管你是否感到气馁,movsxd 的版本存在 32 位目标寄存器,movsxd 默认没有 64 位操作数大小。在我的 PC 上,使用负源执行 32 位 movsxd 会清除目标的高 32 位,因此它被解释为 32 位指令。但不要相信我的话,这是一个奇怪的边缘案例。
    • @Jorayen:现在我已经对其进行了测试,是的,它就是这样做的。所以这可以说是那些反汇编程序中的一个错误。 gdb 说 movslq (%rbx),%esi 我认为是对的。
    猜你喜欢
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 2016-04-06
    • 2019-07-06
    • 1970-01-01
    • 2012-07-14
    • 2021-10-01
    • 1970-01-01
    相关资源
    最近更新 更多