我正在尝试找出SPARC上无条件JMP的编码,即JMP。拆卸一些二进制文件后。

在我的IDA拆卸中,JMP%g1的编码为:

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

评论

我怀疑它会将'L'视为实现细节-通常您只是编写JMP并将其留给汇编器,无论它会产生短跳转还是长跳转(但我的SPARC都是生锈的)。 %g2-您可能应该掌握SPARC汇编程序和实验,例如GNU binutils易于针对任何芯片进行构建-如果您至少可以在Linux VM或Mac上构建它,或者Cygwin如今也可以使用。或者,您可以十六进制编辑SPARC二进制文件,然后再次通过IDA再次运行它,以查看是否可以自己将其更改为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语法中,指令名称编码有关参数大小的信息。在intel语法中,这是通过修饰参数来实现的。