Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的第一个汇编程序(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 - Fatal编程技术网

我的第一个汇编程序(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内联汇编)中出错 在大量的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

它可以在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>

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;