Dalvik汇编指令集(I)
指令格式
- 每16位的字采用空格分隔开
- 每个字母表示四位,每个字母按照顺序从高字节开始,排列到低字节,每四位之间可能使用竖线“|”来表示不同的内容
- 顺序采用A~Z的单个大写字母作为一个4位的操作码,op表示一个8位的操作码
- “
∅ ”来表示这字段所有位为0值
实例
A|G|op BBBB F|E|D|C
位数 | 内容 | 含义 |
---|---|---|
16位 | A|G|op | 高8位由A和G组成,低8位由操作码op组成 |
16位 | BBBB | 一个16位的偏移量 |
16位 | F|E|D|C | 寄存器参数 |
指令格式标识:
1:指令格式大多是时3个字符,前两个是数字,最后一个是字母
2:第一个数字表示有多少个16位的字组成
3:第二个数字是表示指令最多使用的寄存器的个数,特殊标记“r”标识使用一定范围内的寄存器
4:第三个字母为类型码,表示指令用到的额外数据类型取值见下表
指令格式标识类型码
助记符 | 位大小 | 说明 |
---|---|---|
b | 8 | 8位有符号立即数 |
c | 16,32 | 常量池索引 |
f | 16 | 接口常量(仅对静态链接格式有效) |
h | 16 | 有符号立即数(32位或者64位的高值位,低值为0) |
i | 32 | 立即数,有符号整数或者32位浮点数 |
l | 64 | 立即数,有符号整数或者64位双精度浮点数 |
m | 16 | 方法常量(仅对静态链接格式有效) |
n | 4 | 4位的立即数 |
s | 16 | 短整型的立即数 |
t | 8,16,32 | 跳转,分支 |
x | 0 | 无额外数据 |
寄存器表示方法
V命名法和p命名法
V命名法 | p命名法 | 寄存器的含义 |
---|---|---|
v0 | v0 | 第一个局部变量寄存器 |
v1 | v1 | 第二个局部变量寄存器 |
|
|
中间的局部变量寄存器依次递减且名称相同 |
vM-N | p0 | 第一个参数寄存器 |
|
|
中间的参数寄存器分别依次递增 |
vM-1 | pN-1 | 第N个参数寄存器 |
Dalvik字节码的类型、方法与字段表示方法
类型
语法 | 含义 |
---|---|
V | void,只用于返回值类型 |
Z | boolean |
B | byte |
S | short |
C | char |
I | int |
J | long |
F | float |
D | double |
L | Java类类型 |
[ | 数组类型 |
方法
格式
Lpackage/name/ObjectName;->MethodName(III)Z
字段
Lpackage/name/ObjectName;->FieldName:Ljava/lang/String
Dalvik指令集
指令特点:
- 参数采用从目标(destination)到源(source)的方式
-
根据字节码的大小与类型的不同,一些字节码添加了后缀以消除歧义
- 32位常规类型的字节码未添加任何后缀
- 64位常规类型的字节码添加-wide后缀
- 特殊类型的字节码根据具体类型添加后缀(可以是:-boolean、-byte、-char、-short、-int、-long、-float、-double、-object、-string、-class、-void之一)
根据字节码的布局与选项不同,一些字节码添加了字节码后缀以消除歧义,这些后缀通过在字节码主名称后添加“/”来分隔
- 在指令集的描述中,宽度值中的每个字母表示宽度为4位
空操作指令
nop
作用通常被用来对齐代码,无实际操作。
数据操作指令
形式:move destination ,source
实例:move vA,vB;把vB寄存器的值赋值给vA寄存器
返回指令
基础字节码:return
形式 | 含义 |
---|---|
return-void | 函数从一个void方法返回 |
return vAA | 函数返回一个32位非类型对象的值,返回值寄存器为8位的寄存器vAA |
return-wide vAA | 函数返回一个64位非类型对象的值,返回值寄存器为8位的寄存器vAA |
return-object vAA | 函数返回一个对象类型的值 |
数据定义指令
const/4 vA,#+B
锁命令
锁命令一共有两条:
monitor-enter vAA 为指定对象获得锁
monitor-exit vAA 释放指定对象的锁