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)
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)
Voir: https://stackoverflow.com/questions/11177137/why-do-most-x64-instructions-zero-the-upper-part-of -a-32-bit-register –
Notez que 'ajouter eax, 0' effacera également la moitié la plus significative de' RAX'. –
Btw il y a seulement moitié moins d'octets que vous avez écrit, 'al' est 1 octet,' ax' est deux octets, etc. – harold