全网最全 Dalvik 指令集解析 !
Posted u012551350
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全网最全 Dalvik 指令集解析 !相关的知识,希望对你有一定的参考价值。
本文作者: 秉心说
本文链接:
https://juejin.im/user/586eff908d6d81005879507d
文末有彩蛋
Dalvik 寄存器都是 32 位的,64 位数据使用相邻两个寄存器来存储
下表中提到的寄存器对均指相邻两个寄存器。如寄存器对 vAA,指寄存器 vAA,vAA+1
常规类型的 32 位运算码未做任何标记
64 位操作码以
-wide
作为后缀一般指令中目标寄存器在前,源寄存器在后
寄存器最大数量为
65536
个一个大写字母表示 4 位。如 vA 表示前 16 个寄存器之内,vBB 表示前 256 个寄存器之内,vCCCC 表示前 65536 个寄存器之内
下面解释一下表格中的每项内容。
操作码 :十六进制,范围 00 - ff
格式码 :一般三个字符,前两个为数字,最后为字母。第一个数字表示指令有多少个 16 位的字组成。第二个数字表示指令最多使用的寄存器个数。第三个字母是类型码,表示指令所使用的额外数据的类型。
语法 :助记符,smali 语法中就这么表示
说明 : 指令解释
下表为 00 - ff
的所有 Dalvik 指令 :
操作码 | 格式码 | 语法 | 说明 |
---|---|---|---|
00 | 10x | nop | 空指令 |
01 | 12x | move vA, vB | 将寄存器 vB 的内容赋给寄存器 vA |
02 | 22x | move/from16 vAA, vBBBB | 将寄存器 vBBBB 的内容赋给寄存器 vAA。vAA 范围是 0-255,vBBBB 范围是 0-65535 |
03 | 32x | move/16 vAAAA, vBBBB | 将寄存器 vBBBB 的内容赋给寄存器 vAAAA。两个寄存器范围都是 0-65535 |
04 | 12x | move-wide vA, vB | 将寄存器对 vB 的内容赋给寄存器对 vA |
05 | 22x | move-wide/from16 vAA, vBBBB | 将寄存器对 vBBBB 的内容赋给寄存器对 vAA |
06 | 32x | move-wide/16 vAAAA, vBBBB | 将寄存器对 vBBBB 的内容赋给寄存器对 vAAAA |
07 | 12x | move-object vA, vB | 将寄存器 vB 中的对象引用赋给寄存去 vA |
08 | 22x | move-object/from16 vAA, vBBBB | 将寄存器 vBBBB 中的对象引用赋给寄存对 vAA |
09 | 32x | move-object/16 vAAAA, vBBBB | 将寄存器 vBBBB 中的对象引用赋给寄存去 vAAAA |
0a | 11x | move-result vAA | 将上一个 invoke-kind 指令的单字非对象结果存入寄存器 vAA |
0b | 11x | move-result-wide vAA | 将上一个 invoke-kind 指令的双字非对象结果存入寄存器 vAA,vAA+1 |
0c | 11x | move-result-object vAA | 将上一个 invoke-kind 指令的对象结果存入寄存器 vAA |
0d | 11x | move-exception vAA | 将方法执行过程中抛出的异常存入寄存器 vAA |
0e | 10x | return-void | 返回 void |
0f | 11x | return vAA | 返回 32 位非对象值 |
10 | 11x | return-wide vAA | 返回 64 位非对象值 |
11 | 11x | return-object vAA | 返回对象引用 |
12 | 11n | const/4 vA, #+B | 将给定的 4 位字面值符号扩展为 32 位之后赋给寄存器 vA |
13 | 21s | const/16 vAA, #+BBBB | 将给定的 16 位字面值符号扩展为 32 位之后赋给寄存器 vAA |
14 | 31i | const vAA, #+BBBB | 将给定的字面值赋给寄存器 vAA |
15 | 21h | const/high16 vAA, #+BBBB0000 | 将给定的字面值右零扩展为 32 位之后赋给寄存器 vAA,vAA+1 |
16 | 21s | const-wide/16 vAA, #+BBBB | 将给定的 16 位字面值符号扩展为 64 位之后赋给寄存器 vAA,vAA+1 |
17 | 31i | const-wide/32 vAA, #+BBBBBBBB | 将给定的 32 位字面值符号扩展为 64 位之后赋给寄存器 vAA,vAA+1 |
18 | 51l | const-wide vAA, #+BBBBBBBBBBBBBBBB | 将给定的 64 位字面值赋给寄存器 vAA,vAA+1 |
19 | 21h | const-wide/high16 vAA, #+vBBBB000000000000 | 将给定的 16 位字面值右零扩展为 64 位之后赋给寄存器对 vAA |
1a | 21c | const-string vAA, string@BBBB | 将字符串索引 BBBB 指向的字符串引用赋给寄存器 vAA |
1b | 31c | const-string/jumbo vAA, string@BBBBBBBB | 将字符串索引 BBBBBBBB 指向的字符串引用赋给寄存器 vAA |
1c | 21c | const-class vAA, type@BBBB | 将类型索引 BBBB 指向的类引用赋给寄存器 vAA |
1d | 11x | monitor-enter vAA | 获取寄存器 vAA 中对象的监视锁 |
1e | 11x | monitor-exit vAA | 释放寄存器 vAA 中对象的监视锁 |
1f | 21c | check-cast vAA type@BBBB | 将寄存器 vAA 中的对象引用转化为 type@BBBB 指定的类型,若失败抛出 ClassCastException |
20 | 22c | instance-of vA, vB type@CCCC | 判断寄存器 vB 中的对象引用是否为类型 type@CCCC 的实例。如果是给寄存器 vA 赋值为 1,否则赋值为 0 |
21 | 12x | array-length vA, vB | 获取寄存器 vB 中的数组的长度并赋给寄存器 vA |
22 | 21c | new-instance vAA, type@vBBBB | 构建指定类型 type@BBBB 的实例对象,并将对象引用赋给寄存器 vAA |
23 | 22c | new-array vA, vB, type@CCCC | 构建指定类型 type@CCCC 和指定大小 vB 的数组,并将数组引用赋给寄存器 vA |
24 | 35c | filled-new-array vC,vD,vE,vF,vG type@vBBBB | 构建指定类型 type@BBBB 和指定大小的数组,并使用提供的内容 vC-vG 填充数组。由于数组内容是给定的,所以无需再使用一个寄存器 vA 指定数组大小 |
25 | 3rc | filled-new-array/range vCCCC..vNNNN type@BBBB | 同上,区别是使用一定范围内的寄存器内容来填充数组,数组大小为 N-C+1 |
26 | 31t | fill-array-data vAA, +BBBB | 使用给定数据 BBBB 填充寄存器 vAA 存储的数组,只能是基本类型数组。BBBB 有特定的格式 |
27 | 11x | throw vAA | 抛出寄存器 vAA 指定的异常 |
28 | 10t | goto +AA | 无条件跳转至指定偏移处,偏移量 AA 为 8 位 |
29 | 20t | goto/16 +AAAA | 无条件跳转至指定偏移处,偏移量 AAAA 为 16 位 |
2a | 30t | goto/32 +AAAAAAAA | 无条件跳转至指定偏移处,偏移量 AAAAAAAA 为 32 位 |
2b | 31t | packed-switch vAA, +BBBBBBBB | 寄存器 vAA 存储的是是希望跳转的偏移量,BBBBBBBB 是一个偏移量表。基于偏移量表查找匹配项,如果存在则跳转,不存在跳转到下一指令 |
2c | 31t | sparse-switch vAA, +BBBBBBBB | |
2d | 23x | cmpl-float vAA, vBB, vCC | 比较两个单精度浮点数。如果寄存器 vBB 的值大于寄存器 vCC 的值,结果为 -1;如果等于,结果为 0;如果小于,结果为 1。NaN 比较返回 -1。结果赋给寄存器 vAA |
2e | 23x | cmpg-float vAA, vBB, vCC | 比较两个单精度浮点数。如果寄存器 vBB 的值大于寄存器 vCC 的值,结果为 1;如果等于,结果为 0;如果小于,结果为 -1。NaN 比较返回 1。结果赋给寄存器 vAA |
2f | 23x | cmpl-double vAA, vBB, vCC | 比较两个双精度浮点数。如果寄存器 vBB 的值大于寄存器 vCC 的值,结果为 -1;如果等于,结果为 0;如果小于,结果为 1。NaN 比较返回 -1。结果赋给寄存器 vAA |
30 | 23x | cmpg-double vAA, vBB, vCC | 比较两个双精度浮点数。如果寄存器 vBB 的值大于寄存器 vCC 的值,结果为 1;如果等于,结果为 0;如果小于,结果为 -1。NaN 比较返回 1。结果赋给寄存器 vAA |
31 | 23x | cmp-long vAA, vBB, vCC | 比较两个长整型数。如果寄存器 vBB 的值大于寄存器 vCC 的值,结果为 1;如果等于,结果为 0;如果小于,结果为 -1。结果赋给寄存器 vAA |
32 | 22t | if-eq vA, vB, +CCCC | 如果寄存器 vA 的值等于 vB 的值,则跳转到指定偏移处,偏移量为 CCCC |
33 | 22t | if-ne vA, vB, +CCCC | 如果寄存器 vA 的值不等于 vB 的值,则跳转到指定偏移处,偏移量为 CCCC |
34 | 22t | if-lt vA, vB, +CCCC | 如果寄存器 vA 的值小于 vB 的值,则跳转到指定偏移处,偏移量为 CCCC |
35 | 22t | if-ge vA, vB, +CCCC | 如果寄存器 vA 的值大于等于 vB 的值,则跳转到指定偏移处,偏移量为 CCCC |
36 | 22t | if-gt vA, vB, +CCCC | 如果寄存器 vA 的值大于 vB 的值,则跳转到指定偏移处,偏移量为 CCCC |
37 | 22t | if-le vA, vB, +CCCC | 如果寄存器 vA 的值小于等于 vB 的值,则跳转到指定偏移处,偏移量为 CCCC |
38 | 21t | if-eqz vAA, +BBBB | 如果寄存器 vAA 的值等于 0,则跳转到指定偏移处,偏移量为 BBBB |
39 | 21t | if-nez vAA, +BBBB | 如果寄存器 vAA 的值不等于 0,则跳转到指定偏移处,偏移量为 BBBB |
3a | 21t | if-ltz vAA, +BBBB | 如果寄存器 vAA 的值小于 0,则跳转到指定偏移处,偏移量为 BBBB |
3b | 21t | if-gez vAA, +BBBB | 如果寄存器 vAA 的值大于等于 0,则跳转到指定偏移处,偏移量为 BBBB |
3c | 21t | if-gtz vAA, +BBBB | 如果寄存器 vAA 的值大于 0,则跳转到指定偏移处,偏移量为 BBBB |
3d | 21t | if-lez vAA, +BBBB | 如果寄存器 vAA 的值小于等于 0,则跳转到指定偏移处,偏移量为 BBBB |
3e | 10x | unused | |
3f | 10x | unused | |
40 | 10x | unused | |
41 | 10x | unused | |
42 | 10x | unused | |
43 | 10x | unused | |
44 | 23x | aget vAA, vBB, vCC | 获取寄存器 vBB 存储的数组指定索引处的元素并赋给寄存器 vAA。寄存器 vCC 的值为指定索引 |
45 | 23x | aget-wide vAA, vBB, vCC | 获取寄存器 vBB 存储的数组指定索引处的元素(64 位)并赋给寄存器对 vAA。寄存器 vCC 的值为指定索引 |
46 | 23x | aget-object vAA, vBB, vCC | 获取寄存器 vBB 存储的对象类型数组指定索引处的元素并赋给寄存器 vAA。寄存器 vCC 的值为指定索引 |
47 | 23x | aget-boolean vAA, vBB, vCC | 获取寄存器 vBB 存储的布尔类型数组指定索引处的元素并赋给寄存器 vAA。寄存器 vCC 的值为指定索引 |
48 | 23x | aget-byte vAA, vBB, vCC | 获取寄存器 vBB 存储的 byte 类型数组指定索引处的元素并赋给寄存器 vAA。寄存器 vCC 的值为指定索引 |
49 | 23x | aget-char vAA, vBB, vCC | 获取寄存器 vBB 存储的 char 类型数组指定索引处的元素并赋给寄存器 vAA。寄存器 vCC 的值为指定索引 |
4a | 23x | aget-short vAA, vBB, vCC | 获取寄存器 vBB 存储的 short 类型数组指定索引处的元素并赋给寄存器 vAA。寄存器 vCC 的值为指定索引 |
4b | 23x | aput vAA, vBB, vCC | 将寄存器 vAA 的值赋给寄存器 vBB 存储的数组的指定索引处。寄存器 vCC 存储的值为指定索引 |
4c | 23x | aput-wide vAA, vBB, vCC | 将寄存器对 vAA 的值(64 位)赋给寄存器 vBB 存储的数组的指定索引处。寄存器 vCC 存储的值为指定索引 |
4d | 23x | aput-object vAA, vBB, vCC | 将寄存器 vAA 存储的对象赋给寄存器 vBB 存储的数组的指定索引处。寄存器 vCC 存储的值为指定索引 |
4e | 23x | aput-boolean vAA, vBB, vCC | 将寄存器 vAA 存储的布尔值赋给寄存器 vBB 存储的数组的指定索引处。寄存器 vCC 存储的值为指定索引 |
4f | 23x | aput-byte vAA, vBB, vCC | 将寄存器 vAA 存储的 byte 值赋给寄存器 vBB 存储的数组的指定索引处。寄存器 vCC 存储的值为指定索引 |
50 | 23x | aput-char vAA, vBB, vCC | 将寄存器 vAA 存储的 char 值赋给寄存器 vBB 存储的数组的指定索引处。寄存器 vCC 存储的值为指定索引 |
51 | 23x | aput-short vAA, vBB, vCC | 将寄存器 vAA 存储的 short 值赋给寄存器 vBB 存储的数组的指定索引处。寄存器 vCC 存储的值为指定索引 |
52 | 硬核!全网最全Nginx配置指令,建议收藏~ |