指令集特点1 参数采用从目标到源的方式。
2 根据字节码的大小与类型不同,一些字节码添加了名称后缀以消除歧义32位常规类型的字节码未添加任何后缀
64常规类型的字节码添加 -wide 后缀
特殊类型的字节码根据具体类型添加后缀。它们可以是 -boolean、-byte、-char、-short、 -int、-long、-float、-double、-object、-string、-void之一。
3 根据字节码的布局与选项不同,一些字节码添加了字节码后缀以消除歧义。这些后缀通过在字节码主名称后缀添加斜杠“/”来分割开。
4 在指令集的描述中,宽度值中每个字幕表示宽度为4位。
举个例子: move-wide/from16 vAA, vBBBB
该指令表示:move为基础字节码,标识这是基本操作。wide为名称后缀,标识指令操作的数据宽度(64位)。from16为字节码后缀(opcode suffix),标识源为一个16位的寄存器引用变量。vAA为目的寄存器,它始终在源的前面,取值范围为v0~v255。vBBBB为源寄存器,取值范围为v0~v65535。 指令集中大多数指令用到了寄存器作为目的操作数或源操作数,其中 A/B/C/D/E/F/G/H 代表一个4位的数值, 可用来表示v0~v15的寄存器。 AA/BB/.../HH代表一个8位的数值。 AAAA/BBBB/.../HHHH 代表一个16位的数值数据操作指令
数据操作指令为move。move指令的原型为“move destination,source”,move指令根据字节码的大小与类型不同,后面会跟上不同的后缀。 eg:- “move vA, vB”:将vB寄存器的值赋给vA寄存器,源寄存器与目的寄存器都为4位。 - "move /from 16 VAA,VBBBB":将VBBBB寄存器的值赋给VAA寄存器,源寄存器为16位,目标寄存器为8位 - “move /from 16 VAAAA,VBBBB”:将VBBBB寄存器的值赋给VAAAA,源寄存器和目标寄存器都为16位 - “move-wide vA, vB”:为4位的寄存器对赋值。源寄存器与目的寄存器都为4位 - "move-object vA,vB":将vB寄存器中的对象引用赋值给vA寄存器,vA寄存器和vB寄存器都是4位 - "move-result vAA":将上一个“invoke”(方法调用)指令,操作的单字(32位) - “move-result-wide vAA” :将上一个invoke指令操作的双字(64位)非对象结果赋值给vAA寄存器 - “mvoe-result-object vAA”:将上一个invoke指令操作的对象结果赋值给vAA寄存器 - “move-exception vAA”:保存上一个运行时发生的异常到vAA寄存器
数据定义指令
数据定义指令用来定义程序中用到的常量、字符串、类等数据。它的基础字节码为const。- const/4 vA,#+B 将数值符号扩展为32位后赋给寄存器 vA
- const/16 vAA,#+BBBB 将数值符号扩展为32位后赋给寄存器 vAA
- const vAA,#+BBBBBBBB 将数值赋给寄存器vAA
- const/high16 vAA,#+BBBB0000 将数值右边 0 扩展为32位后赋给寄存器vAA
- const-wide/16 vAA,#+BBBB 将数值符号扩展64位后赋给寄存器对vAA
- const-wide vAA,#+BBBBBBBBBBBBBBBB 将数值赋给寄存器对vAA
- const-wide/high16 vAA,#+BBBB000000000000 将数值右边 0 扩展为64位后付赋值给寄存器 vAA
- const-string vAA,string[@BBBB](https://my.oschina.net/u/205605) 通过字符串索引构造一个字符串并赋给寄存器对 vAA
- const-string/jumbo vAA,string[@BBBBBBBB](https://my.oschina.net/u/2326784) 通过字符串索引(较大) 构造一个字符串并赋值给寄存器对vAA
- const-class vAA,type[@BBBB](https://my.oschina.net/u/205605) 通过类型索引获取一个类引用并赋值给寄存器 vAA
- const-class/jumbo vAAAA,type[@BBBBBBBB](https://my.oschina.net/u/2326784) 通过给定的类型那个索引获取一个类索引并赋值给寄存器vAAAA(这条指令占用两个字节,值为0x00ff,是Android4.0中新增的指令)
数据返回指令
返回指令指的是函数结尾时运行的最后一条指令。它的基础字节码为return,共有以下四条返回指令:- "return-void":表示什么也不返回 - “return vAA”:表示函数返回一个32位非对象类型的值 - “return-wide vAA”:表示函数返回一个64位非对象类型的值 - “return-object vAA”:表示函数返回一个对象类型的值
数组操作指令
数组操作包括读取数组长度、新建数组、数组赋值、数组元素取值与赋值等操作。- array-length vA,vB 获取给定vB寄存器中数组的长度并将值赋给vA寄存器,数组长度指的是数组的条目个数。 - new-array vA,vB,type[@CCCC](https://my.oschina.net/u/157616) 构造指定类型(type@CCCC)与大小(vB)的数组,并将值赋给vA寄存器。 - new-array/jumbo vAAAA,vBBBB,type@CCCCCCCC 指令功能与上一条指令相同,只是寄存器与指令的索引取值范围更大(Android4.0中新增的指令) - filled-new-array {vC,vD,vE,vF,vG},type@BBBB 构造指定类型(type@BBBB)与大小(vA)的数组并填充数组内容。v