Smail语法(2)指令解析
【重点】归总了一些简单的Smail指令。
1.If语句
if-nez v0,:cond_0 如果结果不为0,就跳转到cond_0标号处
if-eqz v0,:cond_1 如果结果为0,就跳转到cond_1标号处
2.数据操作指令
move v0,v1 将v1的值赋给v0 ,两个寄存器都为4位
move-result v0 将上一个invoke类型指令操作的单字非对象结果赋给v0
move-result-object v0 将上一个invoke类型指令操作的对象结果(返回值)赋给v0
3.返回指令
return-void
return v0
return-object v0
4.实例操作指令
check-cast v1, Landroid/widget/TextView; 将v1寄存器中的对象引用转化成指定的类型(这里是 TextView)
new-instance v1, Ljava/lang/StringBuilder; 构造一个指定类型对象的新实例
5.数组操作指令
new-array v0,v0,[I 构造Int类型,大小是v0的数组,并将值赋给v0寄存器
array-length v1,v0 获取v0数组的长度且将值赋给v1
6.异常指令
throw vAA 抛出vAA寄存器中指定类型的异常
7.跳转指令
1,goto :goto_0 偏移量goto_0不能为0
2,If语句
3,switch
packed-switch v0, :pswitch_data_0 v0是switch需要判断的值 :pswitch_data_0 偏移表,表中值是有规律递增的。
sparse-switch v0, :pswitch_data_0 偏移表中值是无规律的。
8,比较指令
cmpl-float v0,v2,v3 比较v2和v3,如果v2>v3,v0=-1;反之,v0=1;相等,v0=0
cmpg-float v0,v2,v3 比较v2和v3,如果v2>v3,v0=1;反之,v0=-1;相等,v0=0
cmpl-double v0,v2,v3 同理
cmpg-double v0,v2,v3 同理
cmp-long v0,v2,v3 比较v2和v3,如果v2>v3,v0=1;反之,v0=-1;相等,v0=0