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

逆向工程 编码 斯帕克 汇编
2021-07-06 08:49:26

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

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

81 c0 40 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 有何变化?

1个回答

81 c0 40 00 可分解如下

    
10 00000 111000 00001 0 0000000000000

^--op1
   ^--rd
         ^--op3
                ^--rs1
                      ^--i
                         ^--rs2/simmm13

要将目标从 %g1 更改为 %g2,只需将 rs1 字段从 00001 更改为 00010。

'L' 只是 at&t 语法与 intel 语法的产物。在 at&t 语法中,指令名称对有关参数大小的信息进行编码。在英特尔语法中,这是通过装饰参数来完成的。