我是靠谱客的博主 昏睡铃铛,最近开发中收集的这篇文章主要介绍smali语法之指令学习,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在学习分析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、数据定义指令

数据定义指令非常常用,其基本指令为const
const/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语法之指令学习所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部