2017-05-30 5 views
0

J'essaye de comprendre l'encodage pour des JMP inconditionnels sur SPARC, c'est-à-dire le JMP. Après avoir démonté quelques binaires.Quel est le format d'encodage pour les sauts inconditionnels sur SPARC/SPARC64?

Dans mon IDA Démonter le codage pour JMP% g1 est:

81 c0 40 00 

Et le codage pour g4 JMP% est:

81 c1 00 00 

En fouillant dans les manuels d'allumage, je ne peux pas sembler pour trouver un enregistrement de la façon dont cela est codé. Je suis également confus quant à la raison pour laquelle l'IDA se réfère à un "JMP" par opposition à la "JMPL" dans les docs.

Les recommandations de codage JMPL données dans le manuel de SPARC9 me sont un peu Arcane et je lutte avec ce qu'ils obtiennent à:

10-RD-OP3-RS1-i-[-]-rs2 

ou

10-RD-OP3-RS1-i-siMM3 

« Si l'un des bas -order deux bits de l'adresse de saut est différent de zéro, une exception de mem_address_not_aligned se produit "

Eh bien, je ne suis pas sûr de savoir comment cela équivaut à L'instruction que l'IDA a trouvée. Est-ce que quelqu'un peut décomposer comment cela correspond à JMP% g1? Comment cela changerait-il pour JMP% g2?

Note: Ceci est un rapport d'échange de pile de reverse engineering, je vais supprimer celui qui obtient une bonne réponse en premier. J'ai eu plus de chance avec ce genre de question sur SO dernièrement.

Répondre

1

jmp est un alias pour jmpl avec un registre de destination de %g0, c.-à-d. adresse rejetée. Le manuel spécifie que OP3 est fixé à 11 1000. Le bit i sélectionne entre les deux variantes de codage. L'opérande de registre unique peut être codée dans les deux cas, votre exemple utilise i=0 ce qui signifie que c'est le formulaire jmpl %rs1+%rs2, %g0. Nous pouvons maintenant produire facilement le code de la machine:

10 (fixed) 
00000 (rd=%g0) 
11 1000 (OP3, fixed) 
00001 (rs1=%g1) 
0 (i) 
00000000 (ignored) 
00000 (rs2=%g0) 

Concaténation tous ces donne 1000 0001 1100 0000 0100 0000 0000 0000 = 81 C0 40 00

Vous pouvez également encoder jmp %g1 comme jmp %g1+0 qui utiliserait l'autre variante, avec i=1, et produit 81 C0 60 00. Une autre possibilité est jmp %g0+%g1 qui donne 81 C0 00 01.

Pour obtenir jmp %g2 vous modifiez évidemment le champ rs1.

+0

Les valeurs rs1 successives sont-elles RS1 00010 et ainsi de suite? (édité) – baordog

+0

'00011' est'% g3' ... 'rs2' est l'espace réservé pour l'autre registre. – Jester

+0

^ouais j'ai édité ce que je voulais dire là. Merci de revenir à moi! – baordog