- 在调用格式上模仿了C语言 的调用约定
- 采用从目标到源的方法
- 根据字节码的大小与类型不同,一些字节码添加了名称后缀以消除歧义
- 32位常规类型的字节码未添加任何后缀
- 64位常规类型的字节码添加-wide的后缀
数据定义:
- const/4 vA, #+B 将数组扩展为32位后赋给寄存器A
int a = 1; => const/4 v0, 0x1
- const/16 vAA, #+BBBB
int c = 254 => const/16 v2, 0xfe
- const vAA, #+BBBBBBBB将数组赋值给寄存器vAA
int d1 = 65538 => const v4, 0x10002 (大于65535使用constv4)
- const-wide/16 vAA, #+BBBBB 将数组扩展为64位后赋值给寄存器vAA
long e = 123456789789L => const-wide v6, 0xb4f5b835d4dL
-
const-string vAA, string@BBBB 将字符串索引构造一个字符串并赋给vAA
-
const-class vAA, type@BBBB 通过类型索引获取一个类的引用并赋给寄存器vAA
数据操作指令
- move destination, source 根据字节码的大小和类型不同,添加不同的后缀
- move vA,vB vB寄存器赋值给vA寄存器,都为4位
- move-result vAA 将上一个invoke类型的指令操作的单字非对象结果赋值vAA寄存器
- move-result-object vAA 将上一个invoke类型的指令操作的对象父子给vAA
- move-exception vAA 保存一个运行时发生的异常赋值给vAA寄存器,必须是异常发生时的异常处理的第一条指令
- new-instance vAA, type@BBBB 构造一个指定类型的对象,并赋值给vAA寄存器,不能是数组类型
返回指令
- return-void 返回一个void
- return vAA 返回一个32位非对象类型的值,返回寄存器为8位
- return-wide vAA 返回一个64位非对象类型的值,返回寄存器为8位
- return-object vAA 返回一个对象类型
对象操作
- check-cast vAA, type@BBBB 将vAA中的对象转为指定类型
- instance-ofvA, vB,type@CCCC 判断vB寄存器的对象是否可以转为在指定类型
数组类型
- array-length vA,vB 获取vB寄存器中数组的长度并赋值给vA寄存器
- new-array vA, vB, type@CCCC 构造指定类型(type@CCCC)与大小(vB)的数组,并赋值vA寄存器
- filled-new-array{vC, vD,vE,vF,vG},type@BBBB 构造函数类型(type@BBBB)与大小vA的数组并填充数组内容,除了指定数组的大小且指定了参数个数
- fill-array-data vAA, +BBBBBBBB vAA为寄存器数组引用,后面跟一个数据表
跳转指令
- goto +AA 无条件跳转到指令偏移处,AA不能为0
- goto/16 +AAAA
- goto/32 +AAAAAAAA
- if-eq:if(vA==vB)
- if-ne:vA!=vB
- if-lt:vA<vB
- if-gt:vA>vB
- if-le:vA<=vB
- if-ge:vA>=vB
字段操作指令
- iget,iput对实例字段进行读,写
- sget,sput对静态字段进行读写
方法调用
- invoke-super
- invoke-virtual
- invoke-direct
- invoke-static
- invoke-interface