【问题标题】:__asm__ in c++ error [duplicate]C++ 中的 __asm__ 错误 [重复]
【发布时间】:2014-08-02 04:38:17
【问题描述】:

我正在尝试使用以下 cod 读取 cpuid 信息,但它不起作用。我正在使用 Visual Studio 2010:

#include "stdafx.h"
#include <stdio.h>

int main()
{
  int a, b;

  for (a = 0; a < 5; a++)
  {
    __asm__("cpuid"
            :"=a"(b)                 // EAX into b (output)
            :"0"(a)                  // a into EAX (input)
            :"%ebx","%ecx","%edx");  // clobbered registers

    printf("The code %i gives %i\n", a, b);
  }

  return 0;
}

它是这样说的:

'project_scs.exe': Loaded 'C:\Users\rares992\Documents\Visual Studio 2010\Projects\project_scs\Debug\project_scs.exe', Symbols loaded.
'project_scs.exe': Loaded 'C:\Windows\SysWOW64\ntdll.dll', Symbols loaded (source information stripped).
'project_scs.exe': Loaded 'C:\Windows\SysWOW64\kernel32.dll', Symbols loaded (source information stripped).
'project_scs.exe': Loaded 'C:\Windows\SysWOW64\KernelBase.dll', Symbols loaded (source information stripped).
'project_scs.exe': Loaded 'C:\Windows\SysWOW64\msvcp100d.dll', Symbols loaded.
'project_scs.exe': Loaded 'C:\Windows\SysWOW64\msvcr100d.dll', Symbols loaded.
The thread 'Win32 Thread' (0x2190) has exited with code -1073741510 (0xc000013a).
The program '[8828] project_scs.exe: Native' has exited with code -1073741510 (0xc000013a).

谁能告诉我该怎么做才能让它运行?谢谢

【问题讨论】:

  • 该程序集块用于 gcc 编译器,而不是 Visual Studio。如果您需要 cpuid,请使用 intrinsic
  • Microsoft 的内联汇编语法与 GCC 的完全不同(这就是您所拥有的)。尝试安装和使用 GCC 的 MinGW 版本(nuwen.net/mingw.htmltdm-gcc.tdragon.net/download

标签: c++ visual-studio-2010 assembly cpuid


【解决方案1】:

主要问题是:您使用 AT&T 语法,因为它用于 GCC。但是,Visual Studio 需要 Intel 语法。看看我下面的例子,看看里面的链接:

#include <stdio.h>
#include <intrin.h>

#define EAX 0
#define EBX 1
#define ECX 2
#define EDX 3

int main ( void )
{
    int exx[4], a;

    // http://msdn.microsoft.com/en-us/library/4ks26t93%28v=vs.100%29.aspx
    puts ("Using VC inline assembler:");

    for (a = 0; a < 5; a++)
    {
        __asm
        {
            xor ecx, ecx            // needed for a=4
            mov eax, a
            cpuid
            mov exx[EAX], eax
        }
        printf("The code %i gives %08X\n", a, exx[EAX]);
    }

    // http://msdn.microsoft.com/en-us/library/vstudio/hskdteyh%28v=vs.100%29.aspx
    puts ("Using VC intrinsics:");

    for (a = 0; a < 5; a++)
    {
        __cpuid(exx, a);
         printf("The code %i gives %08X\n", a, exx[EAX]);
    }

    return 0;
}

【讨论】:

    【解决方案2】:

    这是我使用的。它应该适用于 MSVC、ICC、GCC 和 Clang。

    static inline void cpuid (int output[4], int functionnumber) {  
    #if defined (_MSC_VER) || defined (__INTEL_COMPILER)       // Microsoft or Intel compiler, intrin.h included
    
        __cpuidex(output, functionnumber, 0);                  // intrinsic function for CPUID
    
    #elif defined(__GNUC__) || defined(__clang__)              // use inline assembly, Gnu/AT&T syntax
    
       int a, b, c, d;
       __asm("cpuid" : "=a"(a),"=b"(b),"=c"(c),"=d"(d) : "a"(functionnumber),"c"(0) : );
       output[0] = a;
       output[1] = b;
       output[2] = c;
       output[3] = d;
    
    #else                                                      // unknown platform. try inline assembly with masm/intel syntax
    
        __asm {
            mov eax, functionnumber
            xor ecx, ecx
            cpuid;
            mov esi, output
            mov [esi],    eax
            mov [esi+4],  ebx
            mov [esi+8],  ecx
            mov [esi+12], edx
        }
    
    #endif
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 2016-03-30
      • 1970-01-01
      相关资源
      最近更新 更多