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

What is the encoding format for unconditional Jumps on SPARC/SPARC64?

我正在尝试找出 SPARC 上无条件 JMP 的编码,即 JMP。反汇编几个二进制文件后。

在我的 IDA 反汇编中,JMP %g1 的编码是:

81 c0 40 00 

jmp %g4 的编码是:

81 c1 00 00

翻阅 spark 手册,我似乎无法找到有关其编码方式的记录。我也很困惑为什么 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 有何影响?

注意:这是逆向工程堆栈交换的报告,我会先删除哪个回答好的。我最近在 SO 上遇到这种问题时运气更好。

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 字段。