2017-10-06 8 views
2

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 jlpas sauter?

merci à l'avance

+0

'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. –

+1

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 –

+0

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. –

Répondre

3

La valeur ecx après le chargement cl est 0xabcd1282. (Signé -126/unsigned 130) est inférieur à al (signé -1/unsigned 255) qu'il soit traité comme signé ou non signé. (Dans ce cas, il est traité comme étant signé par jl.) Donc, le saut n'est pas pris. Puisque nous ne savons pas quelles instructions sont entre 0x2b et 0x3c, il n'y a aucun moyen de savoir quelles sont les valeurs finales de eax et ecx.

Le décalage pour le saut est 0x12 (0x3c - 0x2a, l'adresse de la destination moins l'adresse de l'instruction suivante).

+0

Super, merci beaucoup! – Monica