Je suis tombé sur ce code et j'ai besoin de comprendre ce que ça fait. Il semble juste de déclarer deux octets puis de ne rien faire ... merci! P> p>
4 Réponses :
Ceci génère deux octets (0F 31) directement dans le flux de code. Il s'agit d'une instruction RDTSC, qui lit le compteur de time-timbre dans EDX: EAX, qui sera ensuite copié sur la variable 'X' par la contrainte de sortie "= A" (x) p>
Ah ok!! Et la syntaxe "= a" (x) (J'utilise GCC4.1) pour utiliser% EAX et% EDX ensemble - fonctionnera-t-il sur x86_64 arc? Je pense que ça, mais je ne sais pas beaucoup sur l'assemblée.
Oui - la contrainte «A» désigne une valeur de 64 bits dans l'EDX: paire de registres EAX dans les descriptions de la machine I386 et X86_64 GCC
@Mk. et chris: non, dans le code 64 bits A uint64_t code> donné un
"= a" code> contrainte choisira simplement l'un des
RAX code> ou
rdx code>, comme si vous aviez utilisé
"= ad" code>. Il ne divise pas les valeurs en deux moitiés égales pour vous :( Cette version qui assemble la moitié basse et élevée A> compile au code optimal pour -M32 et -M64, car dans le code 32 bits le ou optimise.
@Petercordes: il travaillait dans des versions plus anciennes de GCC, mais je suppose qu'ils ont cassé la contrainte a code> dans des versions plus récentes.
0f 31 est l'opcode X86 pour l'instruction RDTSC (Lecture Time Counter); Il place la valeur lue dans les registres EDX et EAX. P>
La directive _ _ _ ASM__ ne fait que déclarer deux octets, il placera l'assemblage en ligne dans le code C. Vraisemblablement, le programme a une manière d'utiliser la valeur dans ces registres immédiatement après. P>
Il insère un opcode 0F 31, qui selon Ce site est: < Pré> xxx pré>
puis il stocke le résultat dans la variable x p> p> p>
Il est inline ASM pour rdtsc code>
, avec la machine -code coding écrit pour soutenir des assembleurs vraiment anciens qui ne connaissent pas le mnémonique.
Malheureusement, cela ne fonctionne malheureusement pas correctement dans le code 32bit car Le moyen sûr d'écrire ceci, qui compile le code optimal avec GCC -M32 ou -M64, est le suivant: p> En code 32bit, il s'agit juste de voir sur le Godbolt Compiler Explorer . P > p> "= a" code> ne divise pas 64 bits d'opérandes de 64 bits en deux dans le code 64 bits. (Le manuel GCC utilise même
RDTSC code> un exemple pour illustrer Ce
) p> rdtsc code> /
ret code>, mais dans le code 64 bits, le décalage / ou pour obtenir les deux moitiés dans
RAX code> pour le Valeur de retour. P>
Intéressant. Cela fait si longtemps que je n'ai jamais regardé cela, je ne suis pas sûr. Vous pouvez spécifier ce que vous utilisez l'assembleur. Je ne sais pas si cela règle le contenu, l'adresse ou les deux (!) De "x". Cela ne me surprendrait pas si X pointe sur un port mappé de mémoire, mis à jour par un périphérique asynchrone et donc le mot clé "volatil". Quelqu'un qui fait ce genre de choses se retournera bientôt, je suppose.
Je parie que vous souhaitez que le programmeur d'origine utilise des commentaires!
Le moyen le plus simple: il suffit de la compiler puis de la désassembler.