我的第一个汇编程序出错(GCC 内联汇编)
经过大量的互联网研究后,我在 C++ 程序中实现了一个小型汇编程序例程,以使用 cpuid 获取 CPU 的 L1 缓存大小。
int CPUID_getL1CacheSize() {
int l1CacheSize = -1;
asm ( "mov $5, %%eax\n\t" // EAX=80000005h: L1 Cache and TLB Identifiers
"cpuid\n\t"
"mov %%eax, %0" // eax into l1CacheSize
: "=r"(l1CacheSize) // output
: // no input
: "%eax" // clobbered register
);
return l1CacheSize;
}
它可以在带有 MinGW(GCC、G++)的 Windows 7 64 位上完美运行。接下来,我使用 GCC 4.0 在 Mac 计算机上尝试了此操作,并且某处一定有错误,因为我的程序在组合框中显示奇怪的字符串,并且某些信号无法连接(Qt GUI)。
这是我的第一个汇编程序,希望有人能给我提示,谢谢!
After a lot of internet research I implemented a small assembler routine in my C++ program to get the CPU's L1 cache size using cpuid.
int CPUID_getL1CacheSize() {
int l1CacheSize = -1;
asm ( "mov $5, %%eax\n\t" // EAX=80000005h: L1 Cache and TLB Identifiers
"cpuid\n\t"
"mov %%eax, %0" // eax into l1CacheSize
: "=r"(l1CacheSize) // output
: // no input
: "%eax" // clobbered register
);
return l1CacheSize;
}
It works perfectly on Windows 7 64 bit with MinGW (GCC, G++). Next I tried this on my Mac computer using GCC 4.0 and there must be an error somewhere because my program shows strange strings in the ComboBoxes and some signals cannot be connected (Qt GUI).
This is my first assembler program, I hope someone can give me a hint, Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我认为 CPUID 实际上破坏了 EAX、EBX、ECX、EDX,所以这可能只是一个寄存器垃圾问题。以下代码似乎可以在 Mac OS X 上的 gcc 4.0.1 和 4.2.1 中正常工作:
请注意,您需要使用
-fno-pic
进行编译,因为启用 PIC 时会保留 EBX。 (要么您需要采取措施保存和恢复 EBX)。I think that CPUID actually clobbers EAX, EBX, ECX, EDX, so it's probably just a register trashing problem. The following code appears to work OK with gcc 4.0.1 and 4.2.1 on Mac OS X:
Note that you need to compile with
-fno-pic
as EBX is reserved when PIC is enabled. (Either that or you need to take steps to save and restore EBX).我终于解决了这个问题。我在玩游戏时遇到编译器错误:“错误:PIC 寄存器 '%ebx' 在 'asm' 中被破坏”,经过一些互联网研究后,我将代码修改为:
int CPUID_getL1CacheSize() {
}
谢谢 Paul,编译器选项 -fno- pic 也是一个不错的解决方案。
问候
I finally resolved the problem. I got a compiler error while playing around: "error: PIC register '%ebx' clobbered in 'asm'" and after some internet research I modified my code to:
int CPUID_getL1CacheSize() {
}
Thanks Paul, The compiler option -fno-pic is a nice solution too.
Greetings