J'ai déjà posé une question similaire ici, mais j'ai quand même quelques erreurs, alors j'espère que vous pourriez me dire ce que je fais de mal. Il suffit de savoir que je connais assembleur, et j'ai fait plusieurs projets en 8051 assembleur, et même ce n'est pas la même, est proche de x86 asm.Quelques questions de l'assembleur en ligne
Il y a bloc de code que j'ai essayé en VC 2010 Express (je suis en train d'obtenir des informations d'instruction CPUID): `
int main()
{
char a[17]; //containing array for the CPUID string
a[16] = '\0'; //null termination for the std::cout
void *b=&a[0];
int c=0; //predefined value which need to be loaded into eax before cpuid
_asm
{
mov eax,c;
cpuid;
mov [b],eax;
mov [b+4],ebx;
mov [b+8],ecx;
mov [b+12],edx;
}
std::cout<<a;
}`
Donc, pour résumer rapidement, j'ai essayé de créer pointeur vide au premier élément de tableau, et que d'utiliser l'adressage indirect juste déplacer des valeurs de registres. Mais cette approche me donne "stack around b variable est une erreur d'exécution corrompue" mais je ne sais pas pourquoi.
Aidez-nous s'il vous plaît. Merci. Et c'est juste à des fins d'étude, je sais qu'il ya des fonctions pour CPUID ....
EDIT: Aussi, comment pouvez-vous utiliser l'adressage direct dans l'assembleur en ligne x86 VC++ 2010? Je veux dire la syntaxe commune pour la charge de nombre immédiate dans 8051 est mov src,#number
mais dans VC++ asm son mov dest,number
sans # signe. Alors, comment dire au compilateur que vous voulez accéder à l'adresse de la cellule de mémoire x directement?
Vous n'avez pas besoin de c du tout. Utilisez simplement 'xor eax, eax' pour définir eax = 0. – TonyK