SPARC / SPARC64上无条件跳转的编码格式是什么?

时间:2017-05-30 19:41:53

标签: assembly encoding compiler-construction sparc

我试图找出SPARC上无条件JMP的编码,即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有何影响?

注意:这是逆向工程堆栈交换的报告,我将删除任何一个获得良好答案的报告。我最近在这个问题上运气好了。

1 个答案:

答案 0 :(得分:1)

jmpjmpl的别名,其目标寄存器为%g0,即。地址丢弃。该手册指定OP3固定为11 1000i位在两种编码变体之间进行选择。单个寄存器操作数可以以任何一种方式编码,您的示例使用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字段。