Блок __asm ​​вызывает сбой в Xcode 5

У меня есть небольшой класс для получения информации о CpuID. Внутри конструктора класса у меня есть встроенная функция, использующая код asm для получения информации cpuid. Он отлично работает в Windows и отлично работает в Xcode 3, но теперь сам класс уничтожается.

Вот начало функции:

inline void CCPUDetector::_DetectCPU()
{
    char lvendor[13] = "UnknownVendr";

    unsigned int lfamily;
    unsigned int lmodel;
    unsigned int lstepping;

    unsigned int lfeatures  = 0;
    unsigned int lBasicInfo = 0; 

    uint32_t cpu_cores = 0; 
    uint32_t cpu_count = 1;

    unsigned int signature = 0;

    // Step 1: check if a processor supports CPUID instruction
    // ============================================================
    try
    {
        __asm
        {
            // Reset all registers
            xor    eax, eax
            xor    ebx, ebx
            xor    ecx, ecx
            xor    edx, edx

            // Call CPUID with eax register == 0
            cpuid
        };
    }

    // Old processors that do not support cpuid will throw exception
    // which is caught in the command below "__except"
    catch(...)
    {
        return;
    }
}

После блока __asm ​​сам класс CPUDetector, тот, в котором я нахожусь в его конструкторе, становится недействительным (NULL). Я пытался отключить разные Xor или cpuid, но каждый раз получал одни и те же результаты.

Может кто-нибудь подсказать, что я делаю не так?


person Iron-Eagle    schedule 03.05.2015    source источник
comment
Откуда вы знаете, что этот код разрушает класс?   -  person Ross Ridge    schedule 03.05.2015
comment
Вероятно, вам следует использовать расширенный asm и сообщить компилятору, что вы уничтожили регистры eax, ebx, ecx и edx. В противном случае он может использовать один из них для чего-то самого важного ... См. Этот ответ с образцом кода.   -  person Jester    schedule 03.05.2015
comment
Росс, я вижу это в отладчике. этот указатель становится NULL, все члены - мусор.   -  person Iron-Eagle    schedule 05.05.2015
comment
Шут, не могли бы вы указать, как я могу сказать, что регистры компилятора уничтожены?   -  person Iron-Eagle    schedule 05.05.2015


Ответы (1)


Кажется, что clang не поддерживает такую ​​обработку ASM. В конце концов, я просто использовал нужный мне код из этих двух файлов.

http://www.opensource.apple.com/source/xnu/xnu-1228.5.20/osfmk/i386/cpuid.h http://www.opensource.apple.com/source/xnu/xnu-1228.5.20./osfmk/i386/cpuid.c

person Iron-Eagle    schedule 06.05.2015