概述
在学习分析smali文件过程中,有一些特殊的指令需要记忆,这样有助于我们快速分析smali文件,本文将一些常见的罗列如下:
1、数据操作指令:
数据操作指令的原型为:move destination,source或者move destination。
move指令会根据字节码的大小与类型不同,后面跟上不同的后缀。
简单举例如下:
move vA,vB
将vB寄存器的值赋给vA寄存器,源寄存器与目的寄存器都是4位
move/from16 vAA,vBBBB
将vBBBB寄存器的值赋给vAA寄存器,源寄存器16位,目的寄存器8位
move-object vA,vB
为对象赋值,源寄存器与目的寄存器都是4位
move-result vAA
将上一个invoke类型指令操作的单字非对象结果赋值给vAA寄存器
move-exception vAA
将一个运行时的异常赋值给vAA寄存器
2、返回指令
return-void从一个void方法返回
return vAA
表示函数返回一个32位非对象类型的值,返回值寄存器为8位的寄存器vAA
return-object vAA
表示函数返回一个对象类型的值。
3、数据定义指令
数据定义指令非常常用,其基本指令为constconst/4 vA,#+B
将数值符号扩展为32位后,赋值给寄存器vA
const vAA,#+BBBBBBBB
将数值赋给寄存器vAA
const-string vAA,string@BBBB
通过字符串索引构造一个字符串,并且赋值给寄存器vAA
4、锁与异常指令
一共两条,多用在多线程程序中,对同一对象操作monitor-enter vAA
为指定的对象获取锁
monitor-exit vAA
释放指定对象的锁
一条异常指令
throw vAA
抛出vAA寄存器中指定类型的异常
5、实例操作指令
类型转换check-cast vAA,type@BBBB
将vAA寄存器中的对象引用,转换成BBBB寄存器指定类型,失败会抛出类型转换异常
instance-of vA,VB,type@CCCC
判断vB是否可以转换成CCCC寄存器的引用,是vA赋值为1,否则vA赋值为0
新建指令
new-instance vAA,type@BBBB
新建type类型实例(不能是数组等引用类型),将对象引用赋值给vAA寄存器
6、比较跳转指令
if指令if-test vA,vB,+CCCC
比较vA与vB的值,如果满足,就跳转到CCCC指定的偏移处。
if-testz vAA,+BBBB
比较vAA寄存器与0的大小关系,满足就跳转到BBBB指定的偏移处。
eq equals 等于
ne not equals 不等于
lt low 小于
ge 大于等于
gt 大于
le 小于等于
比较指令
格式cmpkind vAA,vBB,vCC
比较vBB与vCC的值,结果放在vAA中
cmpl-float
cmpg-float
cmpl-double
cmpg-double
cmp-long
l表示寄存器,g表示寄存器对
举例说明
cmpl-float vAA,vBB,vCC
如果vBB寄存器大于vCC寄存器,返回-1,相等返回0,小于返回1
7、方法调用指令
invoke-virtual 调用实例虚方法invoke-super 调用实例的父类方法
invoke-direct 调用实例的直接方法
invoke-static 调用实例的静态方法
invoke-interface 调用实例的接口方法
8、其它指令
goto +AA无条件跳转到指定偏移处
packed-switch vAA,+BBBBBBBB
该指令表示switch语句中的跳转,具体含义看具体语境
unop vA,vB
将vB寄存器中的数据按照unop转换之后,存在vA中
数据运算符
算数:加、减、乘、除、模、位移,
逻辑:与、或、非,异或等操作
指令的英文学习文档:http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html
最后
以上就是昏睡铃铛为你收集整理的smali语法之指令学习的全部内容,希望文章能够帮你解决smali语法之指令学习所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复