2010-03-10 7 views
2

J'ai essayé de lire CPUID en utilisant l'assembleur en C++. Je sais qu'il y a une fonction pour cela, mais je veux la voie asm. Donc, après que CPUID est exécuté, il doit remplir les registres eax, ebx, ecx avec une chaîne codée ASCII. Mais mon problème est, puisque je peux dans asm adresse seulement plein, ou moitié registre eax, comment briser ce 32 bits en 4 octets. J'ai utilisé ceci: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

Cette question telle quelle peut être mal interprétée comme "Comment puis-je programmer dans l'assemblage sans apprendre l'assemblage?" en fonction de ce que vous avez demandé. La réponse évidente est pour vous d'apprendre à faire _x86 inline assembly_ pour votre environnement préféré (Visual C++, GCC sur x86 Linux, etc.). – mctylr

+0

Pourquoi? Je connais mieux l'assemblage que C. Cette implémentation _asm {} fonctionne bien dans Visual C++. Je ne sais pas comment diviser ces 4 octets en 4 caractères en utilisant C++. – Vit

Répondre

2

La source du noyau Linux x86 shows how pour exécuter cpuid en utilisant l'assembleur en ligne. La syntaxe est spécifique à GCC; Si vous utilisez Windows, ce n'est probablement pas utile.

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)); 
} 

Une fois que vous avez une fonction dans ce format (notez que EAX, ECX sont entrées, alors que les quatre sont des sorties), vous pouvez facilement briser les bits/octets individuels dans l'appelant.

0

Je ne comprends pas pourquoi ne pas utiliser la fonction fournie de toute façon

+0

Becouse J'adore écrire des fonctions simples moi-même :) – Vit

+0

Moi aussi, as-tu regardé le premier lien et vu ce qu'il y a dedans pour toi? – stacker

+0

Bien sûr que j'ai. Mais j'ai peur que ce soit trop pour moi pour le moment. Vous savez, j'ai appris l'ASM de base sur des processeurs compatibles 8051, donc x86 est un chalange. Mais, pourriez-vous s'il vous plaît me dire une chose? Quand j'écris asm en ligne dans le code C, sans directives de préprocesseur, je crois que tout est défini par le code C, non? Vous savez, je suis nouveau au jeu :) – Vit