AMD64 — nopw instructions de montage?

Dans cette sortie du compilateur, j'essaie de comprendre comment le code machine de codage de la nopw instruction fonctionne:

00000000004004d0 <main>:
  4004d0:       eb fe                   jmp    4004d0 <main>
  4004d2:       66 66 66 66 66 2e 0f    nopw   %cs:0x0(%rax,%rax,1)
  4004d9:       1f 84 00 00 00 00 00

Il y a une discussion sur la "nopw" à http://john.freml.in/amd64-nopl. Quelqu'un peut-il expliquer le sens de 4004d2-4004e0? En regardant l'opcode liste, il semble que 66 .. codes sont multi-octets expansions. Je sens que je pourrais probablement obtenir une meilleure réponse à ce que je voudrais, à moins que j'ai essayé d'analyser l'opcode liste de quelques heures.


Que l'asm de sortie est la suivante (fou) de code en C, ce qui optimise les réduire à une simple boucle infinie:

long i = 0;

main() {
    recurse();
}

recurse() {
    i++;
    recurse();
}

Lorsqu'il est compilé avec gcc -O2, le compilateur reconnaît la récursivité infinie et il tourne dans une boucle infinie; il le fait si bien, en fait, qu'il fait des boucles dans le main() sans appel de la recurse() fonction.


note de l'éditeur: les fonctions de remplissage avec des Opr n'est pas spécifique à une boucle infini. Voici un ensemble de fonctions avec une gamme de longueurs d'Opr, sur le Godbolt compilateur explorer.

  • Sommes-nous simplement en regardant aléatoire indésirable rembourrage ici?
  • Peut-être! Je ne sais pas vraiment! C'est la beauté de tout cela! WHEEE. Vraiment, si, je reçois de la liés que le processeur SERAIT le chargement d'un bloc comme une instruction pour l'optimisation de la vitesse, mais grâce à la jmp, il ne le fait pas. Je viens d'obtenir le sens de l'il. Je sais ce que 0x90, mais je ne sais pas ce qu'il se passe avec 66 .. .., ou pourquoi il est de 72 bits.
  • Ce n'est pas la raison ici, mais vous pouvez trouver Mon, quelle étrange Opr, vous avez! - Le Vieux Chose de Nouveau une lecture intéressante.
  • nopl: stackoverflow.com/questions/12559475/...
InformationsquelleAutor Jeff Ferland | 2011-01-25