Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Определить тип процессора


Автор: Князь 11.5.2008, 13:48
Помогите!Нужно написать прогу,которая должна определять тип процессора.Должна быть написана на С++ с ассемблерной вставкой, т.е. весь код асм,но в С++

Автор: W4FhLF 11.5.2008, 14:25
http://ru.wikipedia.org/wiki/Cpuid
http://www.codenet.ru/progr/other/cpuid.php
http://forum.vingrad.ru/forum/topic-111128/hl/cpuid/index.html
http://www.wasm.ru/print.php?article=hardzen

Ну и гугл в помощь, если это не поможет. 

Автор: Князь 12.5.2008, 12:50
написал вот что:
Код


#include<stdio.h>

#define REG_EAX reg[0]
#define REG_EBX reg[1]
#define REG_ECX reg[3]
#define REG_EDX reg[2]

void cpuid(void);
int reg[5];
char *vendor;

int main(int argc,char argv[])
{
 reg[5]=0;

 REG_EAX=0;
 cpuid();
 vendor=(char *)REG_EDX;
 printf("Vendor: %s\n",vendor);

 REG_EAX=1;
 cpuid();

 printf("Family: %i\n",(REG_EAX & 0xF00)>>8);  //EAX bits 11-8
 printf("Model: %i\n",(REG_EAX & 0xF0)>>4);    //EAX bits 7-4
 printf("Stepping: %i\n",(REG_EAX & 0xF));     //EAX bits 3-0

 printf("Type: ");

 switch((REG_EAX & 0x3000)>>12)
   {
   case 0:
     printf("OEM\n");
     break;

   case 1:
     printf("Overdrive\n");
     break;

   case 2:
     printf("Dual\n");
     break;
   }
}
void cpuid()
{
  asm{"cpuid":
    "=a"(REG_EAX),
    "=b"(REG_EBX),
    "=c"(REG_ECX),
    "=d"(REG_EDX):
    "a"(REG_EAX)}
}



выдает ошибку на cpuid что можно сделать с этим?

Автор: MAKCim 12.5.2008, 18:36
Князь, 
компилятор какой? что за ошибка?

Автор: Князь 13.5.2008, 09:38
пишет что не инициализированы a,b,c,d.Но если инициализировать их int либо char говорит Expresssion syntax в процедуре cpuid

Turbo C++ Version 3.0

Автор: MAKCim 14.5.2008, 11:56
Князь, 
синтаксис ассемблерной вставки напоминает тот, который применяется в GCC
пробуй так
Код

void cpuid()
{
  asm {
      mov eax, REG_EAX
      cpuid
      mov REG_EAX, eax
      mov REG_EBX, ebx
      mov REG_ECX, ecx
      mov REG_EDX, edx
  }
}

Автор: Князь 15.5.2008, 07:40
пишет Undefined symbol eax,ebx,ecx,edx

Такое ощущение что он вовсе не замечает asm

Автор: Князь 15.5.2008, 11:40
попробовал написать еще вот так

Код

#include<stdio.h>

#define REG_EAX reg[0]
#define REG_EBX reg[1]
#define REG_ECX reg[3]
#define REG_EDX reg[2]

void cpuid(void);
int reg[5];
char *vendor;

int main(int argc,char argv[])
{
 reg[5]=0;

 REG_EAX=0;
 cpuid();
 vendor=(char *)REG_EDX;
 printf("Vendor: %s\n",vendor);

 REG_EAX=1;
 cpuid();

 printf("Family: %i\n",(REG_EAX & 0xF00)>>8);  //EAX bits 11-8
 printf("Model: %i\n",(REG_EAX & 0xF0)>>4);    //EAX bits 7-4
 printf("Stepping: %i\n",(REG_EAX & 0xF));     //EAX bits 3-0

 printf("Type: ");

 switch((REG_EAX & 0x3000)>>12)
   {
   case 0:
     printf("OEM\n");
     break;

   case 1:
     printf("Overdrive\n");
     break;

   case 2:
     printf("Dual\n");
     break;
   }
}
void cpuid()
{
asm{mov ax,REG_EAX
       cpuid
       mov REG_EAX,ax
       mov REG_EBX,bx
       mov REG_ECX,cx
       mov REG_EDX,dx
       }
}


т.к. мне сказали что может не работать из-за несовпадения количества регистров,но в строке  asm{mov ax,REG_EAX выдает ошибку 

Invalid combination of opcode and operation

Автор: Князь 20.5.2008, 09:37
Что никто не знает?Очень нужно,помогите

Автор: MAKCim 20.5.2008, 09:43
Князь, 
посмотри в документации по Turbo C++,  как там нужно использовать ассемблерные вставки

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)