全网最全 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 指令 :

操作码格式码语法说明
0010xnop空指令
0112xmove vA, vB将寄存器 vB 的内容赋给寄存器 vA
0222xmove/from16 vAA, vBBBB将寄存器 vBBBB 的内容赋给寄存器 vAA。vAA 范围是 0-255,vBBBB 范围是 0-65535
0332xmove/16 vAAAA, vBBBB将寄存器 vBBBB 的内容赋给寄存器 vAAAA。两个寄存器范围都是 0-65535
0412xmove-wide vA, vB将寄存器对 vB 的内容赋给寄存器对 vA
0522xmove-wide/from16 vAA, vBBBB将寄存器对 vBBBB 的内容赋给寄存器对 vAA
0632xmove-wide/16 vAAAA, vBBBB将寄存器对 vBBBB 的内容赋给寄存器对 vAAAA
0712xmove-object vA, vB将寄存器 vB 中的对象引用赋给寄存去 vA
0822xmove-object/from16 vAA, vBBBB将寄存器 vBBBB 中的对象引用赋给寄存对 vAA
0932xmove-object/16 vAAAA, vBBBB将寄存器 vBBBB 中的对象引用赋给寄存去 vAAAA
0a11xmove-result vAA将上一个 invoke-kind 指令的单字非对象结果存入寄存器 vAA
0b11xmove-result-wide vAA将上一个 invoke-kind 指令的双字非对象结果存入寄存器 vAA,vAA+1
0c11xmove-result-object vAA将上一个 invoke-kind 指令的对象结果存入寄存器 vAA
0d11xmove-exception vAA将方法执行过程中抛出的异常存入寄存器 vAA
0e10xreturn-void返回 void
0f11xreturn vAA返回 32 位非对象值
1011xreturn-wide vAA返回 64 位非对象值
1111xreturn-object vAA返回对象引用
1211nconst/4 vA, #+B将给定的 4 位字面值符号扩展为 32 位之后赋给寄存器 vA
1321sconst/16 vAA, #+BBBB将给定的 16 位字面值符号扩展为 32 位之后赋给寄存器 vAA
1431iconst vAA, #+BBBB将给定的字面值赋给寄存器 vAA
1521hconst/high16 vAA, #+BBBB0000将给定的字面值右零扩展为 32 位之后赋给寄存器 vAA,vAA+1
1621sconst-wide/16 vAA, #+BBBB将给定的 16 位字面值符号扩展为 64 位之后赋给寄存器 vAA,vAA+1
1731iconst-wide/32 vAA, #+BBBBBBBB将给定的 32 位字面值符号扩展为 64 位之后赋给寄存器 vAA,vAA+1
1851lconst-wide vAA, #+BBBBBBBBBBBBBBBB将给定的 64 位字面值赋给寄存器 vAA,vAA+1
1921hconst-wide/high16 vAA, #+vBBBB000000000000将给定的 16 位字面值右零扩展为 64 位之后赋给寄存器对 vAA
1a21cconst-string vAA, string@BBBB将字符串索引 BBBB 指向的字符串引用赋给寄存器 vAA
1b31cconst-string/jumbo vAA, string@BBBBBBBB将字符串索引 BBBBBBBB 指向的字符串引用赋给寄存器 vAA
1c21cconst-class vAA, type@BBBB将类型索引 BBBB 指向的类引用赋给寄存器 vAA
1d11xmonitor-enter vAA获取寄存器 vAA 中对象的监视锁
1e11xmonitor-exit vAA释放寄存器 vAA 中对象的监视锁
1f21ccheck-cast vAA type@BBBB将寄存器 vAA 中的对象引用转化为 type@BBBB 指定的类型,若失败抛出 ClassCastException
2022cinstance-of vA, vB type@CCCC判断寄存器 vB 中的对象引用是否为类型 type@CCCC 的实例。如果是给寄存器 vA 赋值为 1,否则赋值为 0
2112xarray-length vA, vB获取寄存器 vB 中的数组的长度并赋给寄存器 vA
2221cnew-instance vAA, type@vBBBB构建指定类型 type@BBBB 的实例对象,并将对象引用赋给寄存器 vAA
2322cnew-array vA, vB, type@CCCC构建指定类型 type@CCCC 和指定大小 vB 的数组,并将数组引用赋给寄存器 vA
2435cfilled-new-array vC,vD,vE,vF,vG type@vBBBB构建指定类型 type@BBBB 和指定大小的数组,并使用提供的内容 vC-vG 填充数组。由于数组内容是给定的,所以无需再使用一个寄存器 vA 指定数组大小
253rcfilled-new-array/range vCCCC..vNNNN type@BBBB同上,区别是使用一定范围内的寄存器内容来填充数组,数组大小为 N-C+1
2631tfill-array-data vAA, +BBBB使用给定数据 BBBB 填充寄存器 vAA 存储的数组,只能是基本类型数组。BBBB 有特定的格式
2711xthrow vAA抛出寄存器 vAA 指定的异常
2810tgoto +AA无条件跳转至指定偏移处,偏移量 AA 为 8 位
2920tgoto/16 +AAAA无条件跳转至指定偏移处,偏移量 AAAA 为 16 位
2a30tgoto/32 +AAAAAAAA无条件跳转至指定偏移处,偏移量 AAAAAAAA 为 32 位
2b31tpacked-switch vAA, +BBBBBBBB寄存器 vAA 存储的是是希望跳转的偏移量,BBBBBBBB 是一个偏移量表。基于偏移量表查找匹配项,如果存在则跳转,不存在跳转到下一指令
2c31tsparse-switch vAA, +BBBBBBBB
2d23xcmpl-float vAA, vBB, vCC比较两个单精度浮点数。如果寄存器 vBB 的值大于寄存器 vCC 的值,结果为 -1;如果等于,结果为 0;如果小于,结果为 1。NaN 比较返回 -1。结果赋给寄存器 vAA
2e23xcmpg-float vAA, vBB, vCC比较两个单精度浮点数。如果寄存器 vBB 的值大于寄存器 vCC 的值,结果为 1;如果等于,结果为 0;如果小于,结果为 -1。NaN 比较返回 1。结果赋给寄存器 vAA
2f23xcmpl-double vAA, vBB, vCC比较两个双精度浮点数。如果寄存器 vBB 的值大于寄存器 vCC 的值,结果为 -1;如果等于,结果为 0;如果小于,结果为 1。NaN 比较返回 -1。结果赋给寄存器 vAA
3023xcmpg-double vAA, vBB, vCC比较两个双精度浮点数。如果寄存器 vBB 的值大于寄存器 vCC 的值,结果为 1;如果等于,结果为 0;如果小于,结果为 -1。NaN 比较返回 1。结果赋给寄存器 vAA
3123xcmp-long vAA, vBB, vCC比较两个长整型数。如果寄存器 vBB 的值大于寄存器 vCC 的值,结果为 1;如果等于,结果为 0;如果小于,结果为 -1。结果赋给寄存器 vAA
3222tif-eq vA, vB, +CCCC如果寄存器 vA 的值等于 vB 的值,则跳转到指定偏移处,偏移量为 CCCC
3322tif-ne vA, vB, +CCCC如果寄存器 vA 的值不等于 vB 的值,则跳转到指定偏移处,偏移量为 CCCC
3422tif-lt vA, vB, +CCCC如果寄存器 vA 的值小于 vB 的值,则跳转到指定偏移处,偏移量为 CCCC
3522tif-ge vA, vB, +CCCC如果寄存器 vA 的值大于等于 vB 的值,则跳转到指定偏移处,偏移量为 CCCC
3622tif-gt vA, vB, +CCCC如果寄存器 vA 的值大于 vB 的值,则跳转到指定偏移处,偏移量为 CCCC
3722tif-le vA, vB, +CCCC如果寄存器 vA 的值小于等于 vB 的值,则跳转到指定偏移处,偏移量为 CCCC
3821tif-eqz vAA, +BBBB如果寄存器 vAA 的值等于 0,则跳转到指定偏移处,偏移量为 BBBB
3921tif-nez vAA, +BBBB如果寄存器 vAA 的值不等于 0,则跳转到指定偏移处,偏移量为 BBBB
3a21tif-ltz vAA, +BBBB如果寄存器 vAA 的值小于 0,则跳转到指定偏移处,偏移量为 BBBB
3b21tif-gez vAA, +BBBB如果寄存器 vAA 的值大于等于 0,则跳转到指定偏移处,偏移量为 BBBB
3c21tif-gtz vAA, +BBBB如果寄存器 vAA 的值大于 0,则跳转到指定偏移处,偏移量为 BBBB
3d21tif-lez vAA, +BBBB如果寄存器 vAA 的值小于等于 0,则跳转到指定偏移处,偏移量为 BBBB
3e10xunused
3f10xunused
4010xunused
4110xunused
4210xunused
4310xunused
4423xaget vAA, vBB, vCC获取寄存器 vBB 存储的数组指定索引处的元素并赋给寄存器 vAA。寄存器 vCC 的值为指定索引
4523xaget-wide vAA, vBB, vCC获取寄存器 vBB 存储的数组指定索引处的元素(64 位)并赋给寄存器对 vAA。寄存器 vCC 的值为指定索引
4623xaget-object vAA, vBB, vCC获取寄存器 vBB 存储的对象类型数组指定索引处的元素并赋给寄存器 vAA。寄存器 vCC 的值为指定索引
4723xaget-boolean vAA, vBB, vCC获取寄存器 vBB 存储的布尔类型数组指定索引处的元素并赋给寄存器 vAA。寄存器 vCC 的值为指定索引
4823xaget-byte vAA, vBB, vCC获取寄存器 vBB 存储的 byte 类型数组指定索引处的元素并赋给寄存器 vAA。寄存器 vCC 的值为指定索引
4923xaget-char vAA, vBB, vCC获取寄存器 vBB 存储的 char 类型数组指定索引处的元素并赋给寄存器 vAA。寄存器 vCC 的值为指定索引
4a23xaget-short vAA, vBB, vCC获取寄存器 vBB 存储的 short 类型数组指定索引处的元素并赋给寄存器 vAA。寄存器 vCC 的值为指定索引
4b23xaput vAA, vBB, vCC将寄存器 vAA 的值赋给寄存器 vBB 存储的数组的指定索引处。寄存器 vCC 存储的值为指定索引
4c23xaput-wide vAA, vBB, vCC将寄存器对 vAA 的值(64 位)赋给寄存器 vBB 存储的数组的指定索引处。寄存器 vCC 存储的值为指定索引
4d23xaput-object vAA, vBB, vCC将寄存器 vAA 存储的对象赋给寄存器 vBB 存储的数组的指定索引处。寄存器 vCC 存储的值为指定索引
4e23xaput-boolean vAA, vBB, vCC将寄存器 vAA 存储的布尔值赋给寄存器 vBB 存储的数组的指定索引处。寄存器 vCC 存储的值为指定索引
4f23xaput-byte vAA, vBB, vCC将寄存器 vAA 存储的 byte 值赋给寄存器 vBB 存储的数组的指定索引处。寄存器 vCC 存储的值为指定索引
5023xaput-char vAA, vBB, vCC将寄存器 vAA 存储的 char 值赋给寄存器 vBB 存储的数组的指定索引处。寄存器 vCC 存储的值为指定索引
5123xaput-short vAA, vBB, vCC将寄存器 vAA 存储的 short 值赋给寄存器 vBB 存储的数组的指定索引处。寄存器 vCC 存储的值为指定索引
52硬核!全网最全Nginx配置指令,建议收藏~

硬核!全网最全Nginx配置指令,建议收藏~

硬核!全网最全Nginx配置指令,建议收藏~

Dalvik指令集

Java 虚拟机原理Dalvik 虚拟机 ( 简介 | CPU 指令集 | Dalvik 虚拟机内存 )

Android 逆向笔记 —— 说说 Dalvik 及其指令集

(c)2006-2024 SYSTEM All Rights Reserved IT常识