Dalvik指令格式

 Dalvik指令格式
一段Dalvik汇编代码由一系列Dalvik指令组成,指令语法由指令的位描述与指令格式标识来决定。位描述约定如下:
每16位的字采用空格分隔开来。
每个字母表示四位,每个字母按顺序从高字节开始,排列到低字节。每四位之间可能使用竖线“|”来表示不同的内容。
顺序采用A~Z的单个大写字母作为一个4位的操作码,op表示一个8位的操作码。
“Ø”来表示这字段所有位为0值。
以指令格式“A|G|op BBBB F|E|D|C”为例:
指令中间有两个空格,每个分开的部分大小为16位,所以这条指令由三个16位的字组成。第一个16位是“A|G|op”,高8位由A与G组成,低字节由操作码op组成。第二个16位由BBBB组成,它表示一个16位的偏移值。第三个16位分别由F、E、D、C共四个4字节组成,在这里它们表示寄存器参数。
单独使用位标识还无法确定一条指令,必须通过指令格式标识来指定指令的格式编码。它的约定如下:
指令格式标识是大多由三个字符组成,前两个是数字,最后一个是字母。
第一个数字是表示指令有多少个16位的字组成。
第二个数字是表示指令最多使用寄存器的个数。特殊标记“r”标识使用一定范围内的寄存器。
第三个字母为类型码,表示指令用到的额外数据的类型。取值见表3-1。
还有一种特殊的情况是末尾可能会多出另一个字母,如果是字母s表示指令采用静态链接,如果是字母i表示指令应该被内联处理。
助记符 位大小 说明
b 8 8位有符号立即数
c 16,32 常量池索引
f 16 接口常量(仅对静态链接格式有效)
h 16 有符号立即数(32位或64位数的高值位,低值位为0)
i 32 立即数,有符号整数或32位浮点数
l 64 立即数,有符号整数或64位双精度浮点数http://
m 16 方法常量(仅对静态链接格式有效)
n 4 4位的立即数
s 16 短整型立即数
t 8,16,32 跳转、分支
x 0 无额外数据
表3-1 指令格式标识的类型码
以指令格式标识22x为例:
第一个数字2表示指令有两个16位字组成,第二个数字2表示指令使用到2个寄存器,第三个字母x表示没有使用到额外的数据。
另外,Dalvik指令对语法做了一些说明,它约定如下:
每条指令从操作码开始,后面紧跟参数,参数个数不定,每个参数之间采用逗号分开。
每条指令的参数从指令第一部分开始,op位于低8位,高8位可以是一个8位的参数,也可以是两个4位的参数,或者为空,如果指令超过16位,则后面部分依次作为参数。
如果参数采用“vX”的方式表示,表明它是一个寄存器,如v0、v1等。这里采用v而不用r是为了避免与基于该虚拟机架构本身的寄存器命名产生冲突,如ARM架构寄存器命名采用r开头。
如果参数采用“#+X”的方式表示,表明它是一个常量数字。
如果参数采用“+X”的方式表示,表明它是一个相对指令的地址偏移。
如果参数采用“kind@X”的方式表示,表明它是一个常量池索引值。其中kind表示常量池类型,它可以是“string”(字符串常量池索引)、 “type”(类型常量池索引)、“field”(字段常量池索引)或者“meth”(方法常量池索引)。
以指令“op vAA, string@BBBB”为例:
指令用到了1个寄存器参数vAA,并且还附加了一个字符串常量池索引string@BBBB,其实这条指令格式代表着const-string指令。

在Android4.0源码Dalvik/docs目录下提供了一份文档instruction-formats.html,里面详细列举了Dalvik指令的所有格式。读者可以通过它了解Dalvik指令更加完整的信息

以上信息来源这里


关于Dalvik字节码解析可参考Bytecode for the Dalvik VMDalvik VM Instruction Formats,一个是指令的位描述表,一个是指令的语法格式表.

例如,假设现在有一段Dalvik字节码如下选中区域 :


1.第一个字节为 3902 (注 此处应是LittleEndian,也就是说低8位为39),所以op值为39 ,可通过位描述表查询结果如下


可看到Fortmat Id 是21t ,说明此条指令包含两个字节 : 3902 0500

其对应的语法格式:

翻译成对应指令: if-nez v2,+5(v2中的值不为0,則跳转5个字节的相对偏移,若此时地址为0x0001,則跳转后地址为0x0006)


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值