2017-09-22 5 views
1

Quelqu'un peut-il m'aider à comprendre le comportement de x64 asm? Je ne peux trouver aucun type de documentation pour cela.x64 asm comportement étrange

Donc, en gros, nous avons:

  • registre x64 RAX.
  • x32 registre EAX.
  • x16 registre AX.
  • x8 registre AL.

et maintenant le code:

mov rax, -1 (0xFFFFFFFFFFFFFFFF) 
add al, 1 

résultat sera 0xFFFFFFFFFFFFFF00 (correct, al débordement de registre, mais on change seulement AL 1 octet)

mov rax, -1 (0xFFFFFFFFFFFFFFFF) 
add ax, 1 

résultat sera 0xFFFFFFFFFFFF0000 (correct, ax débordement d'enregistrement, mais nous changeons seulement AX 2 octets)

résultat
mov rax, -1 (0xFFFFFFFFFFFFFFFF) 
add eax, 1 

sera 0x0000000000000000 (wtf ?, eax débordement de registre, mais résultat changer les 8 octets au lieu de 4. Pourquoi est-il 0x0000000000000000 mais pas 0xFFFFFFFF00000000)

+0

Voir: https://stackoverflow.com/questions/11177137/why-do-most-x64-instructions-zero-the-upper-part-of -a-32-bit-register –

+0

Notez que 'ajouter eax, 0' effacera également la moitié la plus significative de' RAX'. –

+0

Btw il y a seulement moitié moins d'octets que vous avez écrit, 'al' est 1 octet,' ax' est deux octets, etc. – harold

Répondre

1

opérandes 32 bits génèrent un 32 bits résultat, étendu à zéro à un 64 bits dans le registre général de destination.

Ceci est. Merci!

mov rax, 0x6666666666666666 
add eax, 1 

résultat confirme cela et sera 0x0000000066666667