我试图找出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有何影响?
注意:这是逆向工程堆栈交换的报告,我将删除任何一个获得良好答案的报告。我最近在这个问题上运气好了。
答案 0 :(得分:1)
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
字段。