首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SPARC/SPARC 64上无条件跳转的编码格式是什么?

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

Stack Overflow用户
提问于 2017-05-30 19:41:52
回答 1查看 56关注 0票数 0

我试图找出在SPARC上无条件的JMPs的编码,即JMP。在拆卸了几个二进制文件之后。

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

代码语言:javascript
复制
81 c0 40 00 

jmp %g4的编码是:

代码语言:javascript
复制
81 c1 00 00

通过火花手册,我似乎找不到这是如何编码的记录。对于IDA为什么在文档中引用"JMP“而不是"JMPL”,我也感到困惑。

在SPARC9手册中给出的JMPL编码建议对我来说有点神秘,我很难理解它们得到了什么:

代码语言:javascript
复制
10-RD-OP3-RS1-i-[-]-rs2 

代码语言:javascript
复制
10-RD-OP3-RS1-i-siMM3

如果跳转地址的低阶两位中的任一位为非零,则会发生mem_address_not_aligned异常

嗯,我不知道这和IDA发现的指令有什么关系。有人能把这个映射到JMP %g1吗?JMP %g2将如何改变?

注:这是反向工程堆栈交换报告,我要删除任何一个得到一个好的答案首先。最近这类问题我还真走运。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-30 20:37:08

jmpjmpl的别名,目标寄存器为%g0,即。地址被丢弃。手册指定OP3固定在11 1000上。i位在这两个编码变体之间进行选择。可以用任何一种方式对单个寄存器操作数进行编码,您的示例使用i=0表示它是jmpl %rs1+%rs2, %g0表单。我们现在可以轻松地生成机器代码:

代码语言:javascript
复制
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字段。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44270639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档