我试图找出在SPARC上无条件的JMPs的编码,即JMP。在拆卸了几个二进制文件之后。
在我的IDA反汇编中,JMP %g1的编码是:
81 c0 40 00 jmp %g4的编码是:
81 c1 00 00通过火花手册,我似乎找不到这是如何编码的记录。对于IDA为什么在文档中引用"JMP“而不是"JMPL”,我也感到困惑。
在SPARC9手册中给出的JMPL编码建议对我来说有点神秘,我很难理解它们得到了什么:
10-RD-OP3-RS1-i-[-]-rs2 或
10-RD-OP3-RS1-i-siMM3如果跳转地址的低阶两位中的任一位为非零,则会发生mem_address_not_aligned异常
嗯,我不知道这和IDA发现的指令有什么关系。有人能把这个映射到JMP %g1吗?JMP %g2将如何改变?
注:这是反向工程堆栈交换报告,我要删除任何一个得到一个好的答案首先。最近这类问题我还真走运。
发布于 2017-05-30 20:37:08
jmp是jmpl的别名,目标寄存器为%g0,即。地址被丢弃。手册指定OP3固定在11 1000上。i位在这两个编码变体之间进行选择。可以用任何一种方式对单个寄存器操作数进行编码,您的示例使用i=0表示它是jmpl %rs1+%rs2, %g0表单。我们现在可以轻松地生成机器代码:
10 (fixed)
00000 (rd=%g0)
11 1000 (OP3, fixed)
00001 (rs1=%g1)
0 (i)
00000000 (ignored)
00000 (rs2=%g0)所有这些都给出了1000 0001 1100 0000 0100 0000 0000 0000 = 81 C0 40 00
您还可以将jmp %g1编码为jmp %g1+0,这将使用另一个变体i=1,并生成81 C0 60 00。另一种可能是jmp %g0+%g1,它给了81 C0 00 01。
要获得jmp %g2,您显然需要更改rs1字段。
https://stackoverflow.com/questions/44270639
复制相似问题