Доброго времени суток! Проблемка такая пишу прогу на c++ с вставками asm'a. Я не пониманию некоторых кривостей VC++ компилятора, а именно: void GetVendor(char Vendor[12]){ __asm{ xor eax,eax; cpuid; mov dword ptr[Vendor+4],ebx;//а должно быть // mov dword ptr{Vendor+0],ebx mov dword ptr[Vendor+8],edx; // mov dword ptr[Vendor+4],edx mov dword ptr[Vendor+12],ecx; // mov dword ptr[Vendor+8],ecx } } Значения подобраны в ручную, что бы строка выводимая на экран соответствовала должной. А конструкция mov byte ptr[StepID],al; вообще не пашет! Т.е переменная StepID не изменяется, какое значение задашь в программе такое и будет. Скажите как правильно надо писать?? Заранее спасибо!
А при чём тут invoke? И вообще код неправильный. Код (Text): void get_vendor(char* pVendor){ __asm{ xor eax,eax cpuid mov eax,pVendor mov [eax],ebx mov [eax+4],edx mov [eax+8],ecx } } void main() { char vendor[13]; vendor[12] = 0; get_vendor(vendor); printf("cpu vendor string: %s\n",vendor); }
IceStudent А разве не работает? Программа? Наверное, работает. Я по стилю. Зачем (char**)&? Посмотри любую подпрограмму, принимающую буфер для строки, обычно это выглядит так: Код (Text): foo(char *buf) { ... } ... //а обращение к ней char buf[13]; ... foo(buf);
Да, верно. Просто сбило то, что нужен указатель на буфер, а в сях имя массива - указатель на первый символ.
Не помню почему не стал использовать inline ф-цию, вместо этого написал такой макрос: Код (Text): #define GET_VENDOR_STRING(buffer) \ { \ __asm xor eax, eax \ __asm cpuid \ __asm mov dword ptr buffer[0], ebx \ __asm mov dword ptr buffer[4], edx \ __asm mov dword ptr buffer[8], ecx \ __asm mov byte ptr buffer[12], 0 \ } // использование char vendor_string[4*4]; GET_VENDOR_STRING(vendor_string); В новых MSVC есть: Код (Text): void __cpuid( int* CPUInfo, int InfoType ); Parameters [out] CPUInfo The information returned in an array of four integers. [in] InfoType A code indicating the type of information to be retrieved.