我的第一个装配程序出错(GCC内联装配)

Lin*_*umz 5 assembly gcc g++ inline-assembly

经过大量的互联网研究,我在我的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;
}
Run Code Online (Sandbox Code Playgroud)

它适用于带有MinGW(GCC,G ++)的Windows 7 64位.接下来我在Mac计算机上使用GCC 4.0尝试了这个,因为我的程序在ComboBox中显示奇怪的字符串并且某些信号无法连接(Qt GUI),因此必定存在错误.

这是我的第一个汇编程序,希望有人能给我一个提示,谢谢!

Pau*_*l R 5

我认为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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,需要编译,-fno-pic因为启用PIC时保留EBX.(或者您需要采取措施来保存和恢复EBX).

$ 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
$ 
Run Code Online (Sandbox Code Playgroud)