如何解决如何复制寄存器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)来说是死胡同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。