4

Здравствуйте! Как можно с помощью ассемблерных вставок получить сведения о процессоре?

Дополнено.

Вот нашел команду cpuid и код:

mov ЕАХ,О
cpuid ;EAX=0001h
mov mem, ЕВХ
mov mem+4, EDX
mov mem+8, ECX ;mem='Genuinelntel'
cpuid EAX=543h (например) ,EDX = lBFh

Но как это сделать вставкой на том же C?

Nicolas Chabanovsky
  • 51,426
  • 87
  • 267
  • 507
KoCaTKo
  • 875

2 Answers2

2

Инструкция cpuid предназначена для получения информации о процессоре. Для некоторых компиляторов она доступна как расширение языка __cpuid. Пример использования

int main()
{
    int a, b;
for (a = 0; a < 3; a++) {
  __asm("cpuid":"=a"(b)           // EAX - в b (вывод)
  :      "a"(a)                   // a - в EAX (ввод)
  :      "%ebx", "%ecx", "%edx"); // cpuid всегда задействует их

    printf("Этот код %i дает %i\n", a, b);
}

return 0;

}

stanislav
  • 34,518
  • 27
  • 98
  • 214
0

Если не получается сделать это inline-ассемблером в C, то попробуй написать на чистом ассемблере функции, возвращающие тебе нужную информацию, и собрать их в obj-файл. Этот obj файл подключи к компоновке, и в C можно будет использовать нужные функции, объявив их прототипы.

devoln
  • 5,441
  • да здесь нет привязки именно к си, можно и на delphi (не в этом вопрос). я просто не понимаю, как можно реализовать данную задачу. может быть так (на Delphi): var b,d,c: string;

    begin

    asm

    mov eax,1
    
    cpuid
    
    mov b,ebx
    
    mov d,edx
    
    mov c,ecx
    

    end

    – KoCaTKo May 13 '12 at 08:55
  • и потом уже проверять по это табличке http://ru.wikipedia.org/wiki/Cpuid#EAX – KoCaTKo May 13 '12 at 08:56
  • 2
    @Константин25, нехорошо, Дельфи использует некоторые регистры, в ассемблерной вставке, их нужно сохранять/восстанавливать:

    An asm statement must preserve the EDI, ESI, ESP, EBP, and EBX registers, but can freely modify the EAX, ECX, and EDX registers.

    В частности в вашем коде cpuid перепишет ebx, а там хранится Self.

    И, судя по вашему комментарию выше, вам нужен Vendor ID, для этого в eax занесите нуль. Здесь у вас единица - вы получаете Feature Information.

    – northerner May 13 '12 at 09:15
  • что то у меня ничего не выходит ( – KoCaTKo May 13 '12 at 09:25
  • вы мне хоть скажите, вот то что я написал выше

    mov eax,1

    cpuid

    mov b,ebx

    mov d,edx

    mov c,ecx хотя бы похоже на правду ?

    – KoCaTKo May 13 '12 at 09:34