2009-11-12 1 views
0

par souci de simplicité ill coller juste un exemple au lieu de mon code entier qui est un peu énorme. tout en portant mon code sur VC++ au lieu d'utiliser GCC, j'ai besoin de réécrire quelques fonctions d'assemblage en ligne qui reçoivent des pointeurs et sauvegardent des valeurs sur ces pointeurs.enregistrer en ligne asm valeur de registre au pointeur C, peut l'obtenir sur GCC mais pas VC

imaginer cpuid par exemple:

void cpuid(int* peax, int* pebx, int* pecx, int* pedx, int what){ 
    __asm__ __volatile__("cpuid" : "=a" (*peax), "=b" (*pebx), "=c" (*pecx), "=d" (*pedx) : "a" (what)); 
} 

qui vient travailler, il permettra d'économiser les valeurs sur les registres « retournés » par CPUID sur les pointeurs que je Transmis à la fonction.

peut-il être fait avec l'assembleur en ligne pour VC? jusqu'à la signature même fonction exacte, mais avec:

mov eax, what; 
cpuid; 
mov dword ptr [peax], eax; 
etc 

ne fonctionnera pas, Peax auront la même valeur qu'il avait avant d'appeler la fonction.

merci d'avance.

Répondre

1

Difficile à voir parce que c'est juste un extrait, plus il pourrait être appelé à partir du code C++/thiscall.

Dans certains cas, il se peut qu'il doive être «nu» (__declspec (nu)).

Il ne sera pas porté pendant que VC est en train de supprimer x64 en ligne et supporte iirc.

Utilisez le __cpuid ou __cpuidex intrinsèque et appréciez.

0
mov eax, what; 
cpuid; 
mov ecx, dword ptr peax; 
mov [ecx], eax; 

fonctionnera.

Bonne chance!

Questions connexes