我的第一个汇编程序(GCC内联汇编)中出错 在大量的Internet研究之后,我在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; }
它可以在64位Windows 7和MinGW(GCC,G++)上完美工作。接下来,我使用GCC4.0在我的Mac电脑上尝试了这一点,但肯定有错误,因为我的程序在组合框中显示奇怪的字符串,并且一些信号无法连接(QtGUI)我的第一个汇编程序(GCC内联汇编)中出错 在大量的Internet研究之后,我在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; },gcc,assembly,g++,inline-assembly,Gcc,Assembly,G++,Inline Assembly,它可以在64位Windows 7和MinGW(GCC,G++)上完美工作。接下来,我使用GCC4.0在我的Mac电脑上尝试了这一点,但肯定有错误,因为我的程序在组合框中显示奇怪的字符串,并且一些信号无法连接(QtGUI) 这是我的第一个汇编程序,希望有人能给我一个提示,谢谢 我认为CPUID实际上会破坏EAX、EBX、ECX、EDX,所以这可能只是一个寄存器损坏问题。在Mac OS X上,以下代码与gcc 4.0.1和4.2.1配合正常: #include <stdio.h> in
这是我的第一个汇编程序,希望有人能给我一个提示,谢谢 我认为CPUID实际上会破坏EAX、EBX、ECX、EDX,所以这可能只是一个寄存器损坏问题。在Mac OS X上,以下代码与gcc 4.0.1和4.2.1配合正常:
#include <stdio.h>
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", "%ebx", "%ecx", "%edx" // clobbered registers
);
return l1CacheSize;
}
int main(void)
{
printf("CPUID_getL1CacheSize = %d\n", CPUID_getL1CacheSize());
return 0;
}
我终于解决了这个问题。我在玩游戏时遇到了一个编译器错误:“错误:PIC寄存器“%ebx”在“asm”中发生了碰撞”,经过一些internet研究,我将代码修改为: int CPUID_getL1CacheSize(){ } 谢谢Paul,编译器选项-fno-pic也是一个很好的解决方案。
问候语如果你使用调试器进行调试,你会看到发生什么事?@user363778:也许你应该时不时地接受一个答案?这是如何做到的:如上所述,请小心使用此代码。如果没有额外的clobber,这是不正确的,并且您可能会在某些编译器优化级别上遇到麻烦(例如:特别是在发生过程间优化和内联时)。
$ gcc-4.0 -Wall -fno-pic cpuid2.c -o cpuid2
$ ./cpuid2
CPUID_getL1CacheSize = 64
$ gcc-4.2 -Wall -fno-pic cpuid2.c -o cpuid2
$ ./cpuid2
CPUID_getL1CacheSize = 64
$
int l1CacheSize = -1;
asm volatile ( "mov $5, %%eax\n\t"
"pushl %%ebx; cpuid; popl %%ebx\n\t"
"mov %%eax, %0"
: "=r"(l1CacheSize)
:
: "%eax"
);
return l1CacheSize;