Dans le cadre de la x86-64 Visite des manuels d'Intel Je lis
Le fait le plus surprenant est peut-être qu'une instruction telle que
MOV EAX, EBX
met automatiquement à zéro les 32 bits supérieurs deRAX
registre.
La documentation d'Intel (3.4.1.1 General-Purpose Registers in 64-Bit Mode dans le manuel Basic Architecture) citée à la même source nous indique :
- Les opérandes de 64 bits génèrent un résultat de 64 bits dans le registre polyvalent de destination.
- Les opérandes de 32 bits génèrent un résultat de 32 bits, étendu à zéro pour obtenir un résultat de 64 bits dans le registre polyvalent de destination.
- Les opérandes de 8 et 16 bits génèrent un résultat de 8 ou 16 bits. Les 56 bits ou 48 bits supérieurs (respectivement) du registre polyvalent de destination ne sont pas modifiés par l'opération. Si le résultat d'une opération sur 8 ou 16 bits est destiné à un calcul d'adresse sur 64 bits, il faut explicitement étendre le registre en signe à l'ensemble des 64 bits.
Dans l'assemblage x86-32 et x86-64, les instructions à 16 bits telles que
mov ax, bx
ne montrent pas ce genre de comportement "étrange" selon lequel le mot supérieur de eax est mis à zéro.
Par conséquent, 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).