2010-03-10 4 views
2

Я попытался прочитать CPUID с помощью ассемблера на C++. Я знаю, что для этого есть функция, но мне нужен способ asm. Итак, после выполнения CPUID, он должен заполнить регистры eax, ebx, ecx с помощью кодированной строки ASCII. Но моя проблема в том, что я могу в asm-адресе только полный или половинный eax-регистр, как разбить эти 32 бита на 4 байта. Я использовал это:C++ word to bytes

#include <iostream> 
#include <stdlib.h> 

int main() 
{ 
_asm 
{ 
cpuid 
/*There I need to mov values from eax,ebx and ecx to some propriate variables*/ 
} 
system("PAUSE"); 
return(0); 
} 
+0

Этот вопрос as-is может быть неправильно прочитан как «Как я могу программировать в сборке без обучения?» основываясь на том, что вы просили. Очевидным ответом является то, что вы узнаете, как сделать встроенную сборку _x86 для вашей предпочтительной среды (Visual C++, GCC на x86 Linux и т. Д.). – mctylr

+0

Почему? Я на самом деле знаю сборку лучше, чем C. Эта реализация _asm {} хорошо работает в Visual C++. Я просто не знаю, как разделить эти 4 байта на 4 символа с помощью C++. – Vit

ответ

2

Исходные тексты ядра Linux shows how выполнить x86 CPUID, используя встроенный ассемблер. Синтаксис специфичен для GCC; если вы в Windows, это, вероятно, не помогает.

static inline void native_cpuid(unsigned int *eax, unsigned int *ebx, 
           unsigned int *ecx, unsigned int *edx) 
{ 
     /* ecx is often an input as well as an output. */ 
     asm volatile("cpuid" 
      : "=a" (*eax), 
       "=b" (*ebx), 
       "=c" (*ecx), 
       "=d" (*edx) 
      : "0" (*eax), "2" (*ecx)); 
} 

После того, как у вас есть функция в этом формате (обратите внимание, что EAX, ECX входы, в то время как все четыре выхода), вы можете легко вспыхивают отдельные биты/байты в вызывающей программе.

0

Я не понимаю, почему вы не использовать предоставленную функцию в любом случае

  • Либо ссылка real assembly code путь настоящий мужчина идти ;-)

  • Или использовать common way

+0

Becouse Я люблю писать простые функции самостоятельно :) – Vit

+0

Так ли я, посмотрел ли вы первую ссылку и увидел, что там для вас? – stacker

+0

Конечно, у меня есть. Но я боюсь, что его слишком много для меня сейчас. Вы знаете, я изучил базовый asm на 8051 совместимых процессорах, поэтому x86 - это chalange. Но, пожалуйста, скажите мне одну вещь? Когда я пишу inline asm в C-код, без директив препроцессора, я считаю, что его все установлено кодом C, правильно? Знаешь, я новичок в игре :) – Vit