Je viens de poser une question à laquelle je n'arrivais pas à trouver une réponse décente.
Je me donne ce code:x86 Registres d'assemblage et instruction mov, et décalage de saut
0020 mov eax, [ebp+0x0c]; value inside = 0x000000ff
0023 mov cl, [ebp+ox08]; value inside- 0x82
0026 cmp al, cl
0028 jl label ;label is at address 003c, jl is signed
002a nop
002b
...
003c label:sub al,cl
Si la valeur [ebp+0x08]
est 0x82 et ecx
est 0xabcd1234 avant d'exécuter ce code, quelle est la valeur de eax
après l'exécution de ce code?
Est-ce que cela effacerait les bits supérieurs de sorte que ecx
soit 0x00000082 ou ecx
soit 0xabcd1282?
Quelle est l'adresse à partir de laquelle l'offset de l'instruction jl
est calculé?
Et comment détermineriez-vous la valeur du décalage pour l'instruction jl
? La valeur de al
n'est pas supérieure à cl
? Donc, ne serait pas jl
pas sauter?
merci à l'avance
'jl' est un * signé * inférieur à. Vous devez interpréter vos numéros en tant que complément signé 2. c'est-à-dire '0xff - 256' et' 0x82 - 256', parce qu'ils ont tous deux leur bit de signe défini. –
L'écriture de registres low8/low16 ne modifie pas les octets supérieurs. Ceci est différent de l'écriture du registre 32 bits, qui met à zéro le registre complet de 64 bits. https://stackoverflow.com/questions/11177137/why-do-most-x64-instructions-zero-the-upper-part-of-a-32-bit-register –
Vous avez au moins 3 questions totalement distinctes ici. S'il vous plaît ne faites pas cela, voir [demander]. Si vous voulez voir comment l'assembleur calcule le déplacement jmp à partir de la fin de l'instruction, assemblez ce code puis regardez le désassemblage + hexdump des octets de code machine. Voir aussi https://stackoverflow.com/tags/x86/info pour les liens vers des manuels et des guides. Les manuels x86 d'Intel couvrent tous les détails de l'encodage des instructions. –