smali语法学习笔记

关键字
.method
方法
.parameter
方法参数
.locals 14
变量个数
.prologue
方法开始
const/16 v9 0x30
赋值
const/4 v7, 0
.line 18
const/16 v8, 0x2F
aput-byte v8, v2, v7 # v2[0]=0x2F
.line 17
此方法位于第17行
invoke-super
调用父函数
invoke-direct
调用函数
return-void
函数返回void
.end method
函数结束
new-instance
创建实例
iput-object
对象赋值
iget-object
调用对象
invoke-static
调用静态函数

基本数据类型
B — byte
C — char
D — double (64 bits)
F — float
I — int
J — long (64 bits)
S — short
V — void    只能用于返回值类型
Z — boolean

数组类型
#
[I表示一个int型的一维数组,相当于int[]
增加一个维度增加一个[,如[[I表示int[][]
数组每一个维度最多255个;
对象数组表示也是类似,如String数组的表示是[Ljava/lang/String
#
pl:new-array v2, v7, [B
创建大小为v7的字节型数组v2

对象类型
Lxxx/yyy/zzz; — object

#
L表示这是一个对象类型
xxx/yyy是该对象所在的包
zzz是对象名称
;标识对象名称的结束
#

寄存器与变量
java中变量存放在内存中,android为了提高性能,变量存放在寄存器中。寄存器32位,支持任何类型,其中long和double为64位,需要两个寄存器保存。
寄存器采用v和p命名,v表示本地寄存器,p表示参数寄存器。一个方法有三个本地变量,三个参数:
v0第一个本地寄存器
v1第二个本地寄存器
v2第三个本地寄存器
v3 p0(this)
v4 p1第一个参数
v5 p2第二个参数
v6 p3第三个参数
#
当然,如果是静态方法的话就只有5个寄存器了,不需要存this了。
.registers使用这个指令指定方法中寄存器的总数
.locals使用这个指定表明方法中非参寄存器的总数,放在方法的第一行。
#

方法和字段
指令执行
move v0, v3 #把v3寄存器的值移动到寄存器v0上.
const v0, 0x1 #把值0x1赋值到寄存器v0上。
invoke-static {v4, v5}, Lme/isming/myapplication/MainActivity;->sum(II)I #执行方法sum(),v4,v5的值分别作为sum的参数。

条件跳转分支
“if-eq vA, vB, :cond_x” — 如果vA等于vB则跳转到:cond_x
“if-ne vA, vB, :cond_x” — 如果vA不等于vB则跳转到:cond_x
“if-lt vA, vB, :cond_x” — 如果vA小于vB则跳转到:cond_x
“if-ge vA, vB, :cond_x” — 如果vA大于等于vB则跳转到:cond_x
“if-gt vA, vB, :cond_x” — 如果vA大于vB则跳转到:cond_x
“if-le vA, vB, :cond_x” — 如果vA小于等于vB则跳转到:cond_x
“if-eqz vA, :cond_x” — 如果vA等于0则跳转到:cond_x
“if-nez vA, :cond_x” — 如果vA不等于0则跳转到:cond_x
“if-ltz vA, :cond_x” — 如果vA小于0则跳转到:cond_x
“if-gez vA, :cond_x” — 如果vA大于等于0则跳转到:cond_x
“if-gtz vA, :cond_x” — 如果vA大于0则跳转到:cond_x
“if-lez vA, :cond_x” — 如果vA小于等于0则跳转到:cond_x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值