smail学习

原始类型

V void (只能用于返回值类型)
Z boolean
B byte
S short
C char
I int
J long
F float
D Double

对象类型

Lpackage/name/ObjectName; 相当于java中的package.name.ObjectName
L 表示这是一个对象类型
package/name 该对象所在的包
ObjectName 对象名称
; 标识对象名称的结束

数组的表示

[I 表示一个int型的一维数组,相当于int[];
增加一个维度增加一个[,如[[I表示int[][]

数组每一个维度最多255个;
对象数组表示也是类似,如String数组的表示是[Ljava/lang/String

寄存器与变量

java中变量都是存放在内存中的,android为了提高性能,变量都是存放在寄存器中的,寄存器为32位,可以支持任何类型,其中long和double是64为的,需要使用两个寄存器保存。
寄存器采用v和p来命名
在这里插入图片描述
v表示本地寄存器,p表示参数寄存器,关系如下
如果一个方法有两个本地变量,有三个参数
v0 第一个本地寄存器
v1 第二个本地寄存器
v2 p0 (this)
v3 p1 第一个参数
v4 p2 第二个参数
v5 p3 第三个参数
当然,如果是静态方法的话就只有5个寄存器了,不需要存this了。

.registers 使用这个指令指定方法中寄存器的总数
.locals 使用这个指定表明方法中非参寄存器的总数,放在方法的第一行。

指令执行

smali字节码是类似于汇编的,如果你有汇编基础,理解起来是非常容易的。
比如:
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的参数。

Dalvik指令集

指令格式为:[op]-type/[位宽,默认4位] [目标寄存器],源寄存器
赋值:move v1,v2*
返回操作:return-[type] (void ,不带, object,wide)

switch语句

.packed-switch 0x0
:pswitch_0
:pswitch_3
:pswitch_2
:pswitch_1
:pswitch_4
:pswitch_5
:pswitch_6
.end packed-switch

check-cast 类型转换

声明常量: const(/4、/16、/hight16) v1 im 将常量赋值给v1寄存器,const-wide(/16、/32、/hight16) v1 im 将双字型常量赋值给v1寄存器,const-string(/jumbo) v1 “str” 过长时需要加上jumbo,const-class v1 La/b/TargetClass 将Class常量a.b.TargetClass赋值给v1

调用函数:invoke-[kind()] {参数表}, 函数名@BBBB

invoke-virtual :用于调用一般的,非private、非static、非final、非构造函数的方法,它的第一个参数往往会传p0,也就是this指针
invoke-super :用于调用父类中的方法,其他和invoke-virtual保持一致
invoke-direct :用于调用private修饰的方法,或者构造方法
invoke-static :用于调用静态方法,比如一些工具类
invoke-interface :用于调用interface中的方法

判断: if- v1,v2 【less than - lt,greater than - gt,equal -eq, not -ne,le,ge】*

比较:cmp v1,v2,v3 等价于 v1 = (v3 - v2)%1*

取值(get)和赋值(put): iget 和 iput**

类型转换 :如 float-to-int 将v2寄存器中的float类型值转换为int类型,并赋值给v1寄存器

算术运算 :add-int/2addr v1, v2 将v1、v2寄存器中的值相加,并赋值给v1寄存器

注:lit8(limit)是对要加的常量的长度限制,如果不写,则默认为4位,还可选择lit16,即16bit

语法:

.prologue 代码的起始指令

.field  定义变量

.locals 指定了方法中非参寄存器的总数(局部变量的个数 v开头的寄存器)

.method  方法

.parameter  方法参数

.prologue  方法开始

.line   指定了该处指令在源代码中的位置

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值