如何复制寄存器CR3的值

问题描述

我很困惑。看看下面的代码片段。

#pragma warning(2:4235)
int main()
{
       uint32_t cr3;
        __asm(
            "mov %%cr3,%%eax\n\t"
            "mov %%eax,%2\n\t"
            :"=m" (cr3)
            : /* no input */
            : "%eax"
        );
}

编译后看到错误

错误C2059语法错误::va2pa C:\ Users \ usr \ source \ repos \ 1.cpp 80

如何将CR3的值复制到变量cr3中?

解决方法

MSVC具有所有对象的内在函数,因此他们可以编写没有内联asm的64位内核。 (因为MSVC在64位模式下不支持内联汇编)。

使用__readcr3()docs。当编译为32位或64位模式时,内在函数显然起作用。


MSVC不支持GNU C内联汇编语法。在 Visual Studio 中,您可以使用clang代替MSVC; clang支持GNU扩展。

如果要这样做,只需使用"=r"输出即可直接mov到输出操作数;如果您的asm模板中的第一条或最后一条指令是正常的mov(而不是到/来自控制寄存器的指令),则通常是错误的。使用更好的约束条件来告诉编译器放置或查找数据的位置。

当然可以为此使用MSVC内联asm语法,但不要这样做。它的效率低下,并且对于可移植性(到其他编译器和x86-64)来说是死胡同。