Dans la visite x86-64 des manuels Intel , j'ai lu
Le fait le plus surprenant est peut-être qu'une instruction telle que met
MOV EAX, EBX
automatiquement à zéro les 32 bits supérieurs duRAX
registre.
La documentation Intel (3.4.1.1 Registres à usage général en mode 64 bits en architecture de base manuelle) citée à la même source nous dit:
- Les opérandes 64 bits génèrent un résultat 64 bits dans le registre à usage général de destination.
- Les opérandes 32 bits génèrent un résultat 32 bits, étendu de zéro à un résultat 64 bits dans le registre général de destination.
- Les opérandes 8 bits et 16 bits génèrent un résultat 8 bits ou 16 bits. Les 56 bits ou 48 bits supérieurs (respectivement) du registre universel de destination ne sont pas modifiés par l'opération. Si le résultat d'une opération 8 bits ou 16 bits est destiné au calcul d'adresse 64 bits, étendez explicitement le registre à 64 bits.
Dans les assemblages x86-32 et x86-64, des instructions 16 bits telles que
mov ax, bx
ne montrez pas ce genre de comportement "étrange" que le mot supérieur de eax est mis à zéro.
Ainsi: quelle est la raison pour laquelle ce comportement a été introduit? À première vue, cela semble illogique (mais la raison pourrait être que je suis habitué aux bizarreries de l'assemblage x86-32).
r32
opérande de destination zéro le 32 haut, plutôt que de fusionner. Par exemple, certains assembleurs remplaceront pmovmskb r64, xmm
par pmovmskb r32, xmm
, en enregistrant un REX, car la version de destination 64 bits se comporte de la même manière. Même si la section Operation du manuel répertorie les 6 combinaisons de 32 / 64bit dest et 64/128 / 256b source séparément, l'extension zéro implicite du formulaire r32 duplique l'extension zéro explicite du formulaire r64. Je suis curieux de connaître la mise en œuvre de HW ...
xor eax,eax
ou xor r8d,r8d
est le meilleur moyen de mettre à zéro RAX ou R8 (l'enregistrement d'un préfixe REX pour RAX, et XOR 64 bits n'est même pas géré spécialement sur Silvermont). En relation: Comment fonctionnent exactement les registres partiels sur Haswell / Skylake? L'écriture d'AL semble avoir une fausse dépendance à RAX, et AH est incohérente