8
votes

Quelle est cette 486 Assemblée en ligne?

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 ... xxx

merci!


3 commentaires

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.


4 Réponses :


12
votes

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)


4 commentaires

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 donné un "= a" contrainte choisira simplement l'un des RAX ou rdx , comme si vous aviez utilisé "= ad" . Il ne divise pas les valeurs en deux moitiés égales pour vous :( Cette version qui assemble la moitié basse et élevée 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 dans des versions plus récentes.




2
votes

Il insère un opcode 0F 31, qui selon Ce site est: < Pré> xxx

puis il stocke le résultat dans la variable x


0 commentaires

1
votes

Il est inline ASM pour rdtsc , 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 "= a" 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 un exemple pour illustrer Ce )

Le moyen sûr d'écrire ceci, qui compile le code optimal avec GCC -M32 ou -M64, est le suivant: xxx

En code 32bit, il s'agit juste de rdtsc / ret , mais dans le code 64 bits, le décalage / ou pour obtenir les deux moitiés dans RAX pour le Valeur de retour.

voir sur le Godbolt Compiler Explorer .


0 commentaires