没有合适的资源?快使用搜索试试~ 我知道了~
Dalvik虚拟机操作码pdf Dalvik虚拟机操作码pdf Dalvik虚拟机操作码pdf
资源推荐
资源详情
资源评论
Dalvik 虚拟机操作码
作者:Gabor Paller 翻译:YULIANGMAX
v1.0
表中的 vx、vy、vz 表示某个 Dalvik 寄存器。根据不同指令可以访问 16、256 或 64K 寄存器。
表中 lit4、lit8、lit16、lit32、lit64 表示字面值(直接赋值),数字是值所占用位的长度。
long 和 double 型的值占用两个寄存器,例:一个在 v0 寄存器的 double 值实际占用 v0,v1 两个寄存器。
boolean 值的存储实际是 1 和 0,1 为真、0 为假;boolean 型的值实际是转成 int 型的值进行操作。
所有例子的字节序都采用高位存储格式,例:0F00 0A00 的编译为 0F, 00, 0A, 00 存储。
有一些指令没有说明和例子,因为我没有在正常使用中看到过这些指令,它们的存在是从这里知道的:Android o
pcode constant list。
Opcode
操作码(hex)
Opcode name
操作码名称
Explanation
说明
Example
示例
00
nop
无操作
0000 - nop
01
move vx, vy
移动 vy 的内容到 vx。两个寄存器
都必须在最初的 256 寄存器范围
以内。
0110 - move v0, v1
移动 v1 寄存器中的内容到 v0。
02
move/from16 v
x, vy
移动 vy 的内容到 vx。vy 可能在 6
4K 寄存器范围以内,而 vx 则是在
最初的 256 寄存器范围以内。
0200 1900 - move/from16 v0, v25
移动 v25 寄存器中的内容到 v0。
03
move/16
未知
注
4
04
move-wide
未知
注
4
05
move-wide/from
16 vx, vy
移动一个 long/double 值,从 v
y 到 vx。vy 可能在 64K 寄存器范
围以内,而 vx 则是在最初的 256
寄存器范围以内。
0516 0000 - move-wide/from16 v22, v0
移动 v0,v1 寄存器中的内容到 v22,v23。
06
move-wide/16
未知
注
4
07
move-object v
x, vy
移动对象引用,从 vy 到 vx。
0781 - move-object v1, v8
移动 v8 寄存器中的对象引用到 v1。
08
move-object/fr
om16 vx, vy
移动对象引用,从 vy 到 vx。vy
可以处理 64K 寄存器地址,vx 可
以处理 256 寄存器地址。
0801 1500 - move-object/from16 v1, v21
移动 v21 寄存器中的对象引用到 v1。
09
move-object/16
未知
注
4
0A
move-result vx
移动上一次方法调用的返回值到
vx。
0A00 - move-result v0
移动上一次方法调用的返回值到 v0。
0B
move-result-wi
de vx
移动上一次方法调用的 long/dou
ble 型返回值到 vx,vx+1。
0B02 - move-result-wide v2
移动上一次方法调用的 long/double 型返回值
到 v2,v3。
0C
move-result-ob
ject vx
移动上一次方法调用的对象引用
返回值到 vx。
0C00 - move-result-object v0
移动上一次方法调用的对象引用返回值到 v0。
0D
move-exception
vx
当方法调用抛出异常时移动异常
对象引用到 vx。
0D19 - move-exception v25
当方法调用抛出异常时移动异常对象引用到 v2
5。
0E
return-void
返回空值。
0E00 - return-void
返回值为 void,即无返回值,并非返回 null。
0F
return vx
返回在 vx 寄存器的值。
0F00 - return v0
返回 v0 寄存器中的值。
10
return-wide vx
返回在 vx,vx+1 寄存器的 doubl
e/long 值。
1000 - return-wide v0
返回 v0,v1 寄存器中的 double/long 值。
11
return-object
vx
返回在 vx 寄存器的对象引用。
1100 - return-object v0
返回 v0 寄存器中的对象引用。
12
const/4 vx, li
t4
存入 4 位常量到 vx。
1221 - const/4 v1, #int 2
存入 int 型常量 2 到 v1。目的寄存器在第二个
字节的低 4 位,常量 2 在更高的 4 位。
13
const/16 vx, l
it16
存入 16 位常量到 vx。
1300 0A00 - const/16 v0, #int 10
存入 int 型常量 10 到 v0。
14
const vx, lit3
2
存入 int 型常量到 vx。
1400 4E61 BC00 - const v0, #12345678 /
/ #00BC614E
存入常量 12345678 到 v0。
15
const/high16 v
0, lit16
存入 16 位常量到最高位寄存器,
用于初始化 float 值。
1500 2041 - const/high16 v0, #float 1
0.0 // #41200000
存入 float 常量 10.0 到 v0。该指令最高支持 1
6 位浮点数。
16
const-wide/16
vx, lit16
存入 int 常量到 vx,vx+1 寄存器,
扩展 int 型常量为 long 常量。
1600 0A00 - const-wide/16 v0, #long 10
存入 long 常量 10 到 v0,v1 寄存器。
17
const-wide/32
vx, lit32
存入 32 位常量到 vx,vx+1 寄存
器,扩展 int 型常量到 long 常量。
1702 4e61 bc00 - const-wide/32 v2, #lo
ng 12345678 // #00bc614e
存入 long 常量 12345678 到 v2,v3 寄存器。
18
const-wide vx,
lit64
存入 64 位常量到 vx,vx+1 寄存
器。
1802 874b 6b5d 54dc 2b00- const-wide v
2, #long 12345678901234567 // #002bdc5
45d6b4b87
存入 long 常量 12345678901234567 到 v2,v3
寄存器。
19
const-wide/hig
h16 vx, lit16
存入 16 位常量到最高 16 位的 vx,
vx+1 寄存器,用于初始化 doubl
e 值。
1900 2440 - const-wide/high16 v0, #dou
ble 10.0 // #402400000
存入 double 常量 10.0 到 v0,v1。
1A
const-string v
x,
字符串
ID
存入字符串常量引用到 vx,通过
字符串
ID 或
字符串
。
1A08 0000 - const-string v8, "" // str
ing@0000
存入 string@0000(字符串表#0 条目)的引用
到 v8。
1B
const-string-j
umbo
未知
注
4
1C
const-class v
x,
类型
ID
存入类对象常量到 vx,通过
类型
ID 或
类型
(如 Object.class)。
1C00 0100 - const-class v0, Test3 // t
ype@0001
存入 Test3.class(类型 ID 表#1 条目)的引用
到 v0。
1D
monitor-enter
vx
获得 vx 寄存器中的对象引用的监
视器。
1D03 - monitor-enter v3
获得 v3 寄存器中的对象引用的监视器。
1E
monitor-exit
释放 vx 寄存器中的对象引用的监
视器。
1E03 - monitor-exit v3
释放 v3 寄存器中的对象引用的监视器。
1F
check-cast vx,
类型
ID
检查 vx 寄存器中的对象引用是否
可以转换成
类型
ID 对应类型的实
例。如不可转换,抛出 ClassCas
tException 异常,否则继续执
行。
1F04 0100 - check-cast v4, Test3 // ty
pe@0001
检查 v4 寄存器中的对象引用是否可以转换成 Te
st3(类型 ID 表#1 条目)的实例。
20
instance-of v
x, vy,
类型
ID
检查 vy 寄存器中的对象引用是否
是
类型
ID 对应类型的实例,如果
是,vx 存入非 0 值,否则 vx 存入
0。
2040 0100 - instance-of v0, v4, Test3
// type@0001
检查 v4 寄存器中的对象引用是否是 Test3(类
型 ID 表#1 条目)的实例。如果是,v0 存入非 0
值,否则 v0 存入 0。
21
array-length v
x, vy
计算 vy 寄存器中数组引用的元素
长度并将长度存入 vx。
2111 - array-length v0, v1
计算 v1 寄存器中数组引用的元素长度并将长度
存入 v0。
22
new-instance v
x,
类型
ID
根据
类型
ID 或
类型
新建一个对象
实例,并将新建的对象的引用存入
vx。
2200 1500 - new-instance v0, java.io.F
ileInputStream // type@0015
实例化 java.io.FileInputStream(类型 ID
表#15H 条目)类型,并将其对象引用存入 v0。
23
new-array vx,
vy,
类型
ID
根据
类型
ID 或
类型
新建一个数
组,vy 存入数组的长度,vx 存入
数组的引用。
2312 2500 - new-array v2, v1, char[] /
/ type@0025
新建一个 char(类型 ID 表#25H 条目)数组,v
1 存入数组的长度,v2 存入数组的引用。
24
filled-new-arr
ay {
参数
},
类型
ID
根据
类型
ID 或
类型
新建一个数组
并通过
参数
填充
注
5
。新的数组引用
可以得到一个 move-result-obj
ect 指令,前提是执行过 filled
-new-array 指令。
2420 530D 0000 - filled-new-array {v0,
v0},[I // type@0D53
新建一个 int(类型 ID 表#D53H 条目)数组,
长度将为 2 并且 2 个元素将填充到 v0 寄存器。
25
filled-new-arr
ay-range {vx..
vy},
类型
ID
根据
类型
ID 或
类型
新建一个数组
并以寄存器范围为参数填充。新的
数组引用可以得到一个 move-res
ult-object 指令,前提是执行过
filled-new-array 指令。
2503 0600 1300 - filled-new-array/rang
e {v19..v21}, [B // type@0006
新建一个 byte(类型 ID 表#6 条目)数组,长
度将为 3 并且 3 个元素将填充到 v19,v20,v21
寄存器
注
4
。
26
fill-array-dat
a vx,
偏移量
用 vx 的静态数据填充数组引用。
静态数据的位址是当前指令位置
加
偏移量
的和。
2606 2500 0000 - fill-array-data v6, 0
0e6 // +0025
用当前指令位置+25H 的静态数据填充 v6 寄存器
的数组引用。偏移量是 32 位的数字,静态数据
的存储格式如下:
0003 // 表类型:静态数组数据
0400 // 每个元素的字节数(这个例子是 4 字
节的 int 型)
0300 0000 // 元素个数
0100 0000 // 元素 #0:int 1
0200 0000 // 元素 #1:int 2
0300 0000 // 元素 #2:int 3
27
throw vx
抛出异常对象,异常对象的引用在
vx 寄存器。
2700 - throw v0
抛出异常对象,异常对象的引用在 v0 寄存器。
28
goto
目标
通过短偏移量
注
2
无条件跳转到
目
标
。
28F0 - goto 0005 // -0010
跳转到当前位置-16(hex 10)的位置,0005
是目标指令标签。
29
goto/16
目标
通过 16 位偏移量
注
2
无条件跳转到
目标
。
2900 0FFE - goto/16 002f // -01f1
跳转到当前位置-1F1H 的位置,002f 是目标指
令标签。
2A
goto/32
目标
通过 32 位偏移量
注
2
无条件跳转到
目标
。
2B
packed-switch
vx,
索引表偏移
量
实现一个 switch 语句,case 常
量是连续的。这个指令使用
索引
表
,vx 是在表中找到具体 case
的指令偏移量的索引,如果无法在
表中找到 vx 对应的索引将继续执
行下一个指令(即 default cas
e)。
2B02 0C00 0000 - packed-switch v2, 000
c // +000c
根据 v2 寄存器中的值执行 packed switch,索
引表的位置是当前指令位置+0CH,表如下所示:
0001 // 表类型:packed switch 表
0300 // 元素个数
0000 0000 // 基础元素
0500 0000 0: 00000005 // case 0: +0000
0005
0700 0000 1: 00000007 // case 1: +0000
0007
0900 0000 2: 00000009 // case 2: +0000
0009
2C
sparse-switch
vx,
查询表偏移
量
实现一个 switch 语句,case 常
量是非连续的。这个指令使用
查询
表
,用于表示 case 常量和每个 c
ase 常量的偏移量。如果 vx 无法
在表中匹配将继续执行下一个指
令(即 default case)。
2C02 0c00 0000 - sparse-switch v2, 000
c // +000c
根据 v2 寄存器中的值执行 sparse switch ,
查询表的位置是当前指令位置+0CH,表如下所
示:
0002 // 表类型:sparse switch 表
0300 // 元素个数
9cff ffff // 第一个 case 常量: -100
fa00 0000 // 第二个 case 常量: 250
e803 0000 // 第三个 case 常量: 1000
0500 0000 // 第一个 case 常量的偏移量: +5
0700 0000 // 第二个 case 常量的偏移量: +7
0900 0000 // 第三个 case 常量的偏移量: +9
2D
cmpl-float vx,
vy, vz
比较 vy 和 vz 的 float 值并在 vx
存入 int 型返回值
注
3
。
2D00 0607 - cmpl-float v0, v6, v7
比较 v6 和 v7 的 float 值并在 v0 存入 int 型返
回值。非数值默认为小于。如果参数为非数值将
返回-1。
2E
cmpg-float vx,
vy, vz
比较 vy 和 vz 的 float 值并在 vx
存入 int 型返回值
注
3
。
2E00 0607 - cmpg-float v0, v6, v7
比较 v6 和 v7 的 float 值并在 v0 存入 int 型返
回值。非数值默认为大于。如果参数为非数值将
返回 1。
2F
cmpl-double v
x, vy, vz
比较 vy 和 vz
注
2
的 double 值并
在 vx 存入 int 型返回值
注
3
。
2F19 0608 - cmpl-double v25, v6, v8
比较 v6,v7 和 v8,v9 的 double 值并在 v25 存
入 int 型返回值。非数值默认为小于。如果参数
为非数值将返回-1。
30
cmpg-double v
x, vy, vz
比较 vy 和 vz
注
2
的 double 值并
在 vx 存入 int 型返回值
注
3
。
3000 080A - cmpg-double v0, v8, v10
比较 v8,v9 和 v10,v11 的 double 值并在 v0 存
入 int 型返回值。非数值默认为大于。如果参数
剩余17页未读,继续阅读
资源评论
HLQ_Struggle
- 粉丝: 330
- 资源: 33
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功