【发布时间】:2018-08-20 20:10:03
【问题描述】:
我在 Windows 上使用 Mingw32 并尝试读取 CPU 微码修订版。
我遇到了非法指令崩溃(通过 gdb 看到),但我无法确定是哪条指令导致它。
我如何找出哪条指令是非法的,以及我的程序出了什么问题?我正在尝试打印 EDX 寄存器。
#include<stdio.h>
int main(int argc, char *argv[])
{
int cookie = 42;
asm(
"MOVL $0x08, %%ecx\n\t"
"XOR %%eax, %%eax\n\t"
"XOR %%edx, %%edx\n\t"
"WRMSR\n\t"
"MOVL 1, %%EAX\n\t"
"cpuid\n\t"
"MOVL $0x08, %%ecx\n\t"
"rdmsr\n\t"
: "=rd"(cookie)
:
: "eax", "ecx", "edx"
);
printf("%d\n", cookie);
}
【问题讨论】:
-
您的问题几乎肯定是
WRMSR,因为(根据文档):此指令必须在权限级别 0 或实地址模式下执行。但是,如果你注释掉这个写,RDMSR会给你同样的问题(出于同样的原因)。要回答实际问题:您通常可以通过使用调试器单步执行代码来找到这一点。 -
另外,我相信
CPUID更改了 ebx 的值,但您没有将其列为已修改。这可能会导致后续代码中的其他崩溃。 -
您的调试器应该停止在出错的指令上。使用
disas或layout reg来查看是哪一个。顺便说一句,"=rd"意味着编译器可以选择任何寄存器或 RDX。对于该约束,您需要"=d",并且需要"ebx"clobber 而不是"edx"。 (输出不能是clobber。)
标签: gcc inline-assembly mingw32