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 上遇到这种问题时运气更好。
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
字段。
我正在尝试找出 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 上遇到这种问题时运气更好。
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
字段。