smali语法第一课

Smali是一种汇编语法,来源Dalvik的vm的字节码,即dex文件中的bytecode=二进制数据,反汇编后得到的Smali代码,对应文件叫:Smali文件

dalvik的字节码有两大类类型,原始类型和引用类型。引用类型是对象和数组,其他一切都是原始类型。

一、原始类型语法类型smali和java对比

V    void

Z    boolean-----区别点

B    byte

S    short

C    char

I    int

J    long(64bits)---区别点

F    float

D    double(64bits)

二、引用类型

对象类型:对象类型以L作为开头,格式是:LpackageName/objectName;(注意必须有个分号跟在最后),String对象在smali中为Ljava/lang/String;,

内部类的格式为:LpackageName/objectName$subObjectName;在内部类前面加$符号

数组类型:在基本类型前面加[ ,例如int数组和float数组分别表示为[I、[F

方法:总是以非常详细的形式指定,其中包括方法的类型、方法名称、参数类型和返回类型

格式:Lpackage/name/ObjectName;->MethodName(III)Z

eg:method(I[[IILjava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;在java中是:

String method(int,int[][],int,String,Object[])

三、Smali基本语法:

.field private isFlag:z    定义变量

.method    方法

.parameter    方法参数

.prologue    方法开始

.line 123    此方法位于123行

invoke-super    调用父函数

const/high16 vo,ox7fo3    把ox7fo3赋值给v0

invoke-direct    调用函数

return-void    函数返回void

.end method    函数结束

new-instance    创建实例

iput-object    对象赋值

iget-object     调用对象

invoke-static 调用静态函数

四、条件跳转分支:

“if-eq vA,vB,:cond_\**” 如果vA等于vB则跳转到cond_**

"if-ne vA,vB,:cond_\**"如果vA不等于vB则跳转到cond_**

"if-lt vA,vB,:cond_\**" 如果vA小于vB则跳转到cond_**

"if-ge vA,vB,:cond_\**" 如果vA大于等于vB则跳转到cond_**

if-gt vA,vB,:cond_\**" 如果vA大于vB则跳转到cond_**

if-le vA,vB,:cond_\**" 如果vA小于等于vB则跳转到cond_**

if-eqz vA,:cond_\**" 如果vA等于0则跳转到cond_**

if-nez vA,:cond_\**" 如果vA不等于0则跳转到cond_**

if-ltz vA,:cond_\**" 如果vA小于0则跳转到cond_**

if-gez vA,:cond_\**" 如果vA大于等于0则跳转到cond_**

if-gtz vA,:cond_\**" 如果vA大于0则跳转到cond_**

if-lez vA,:cond_\**" 如果vA小于等于0则跳转到cond_**

五、关于寄存器的知识

在java中变量都是存放在内存中的,android为了提高性能,变量都是存放在寄存器中的

寄存器为32位,可以支持任何类型。

寄存器分为本地寄存器和参数寄存器

本地寄存器:用v开头数字结尾的符号来表示 eg:v0、v1、v2

参数寄存器:用p开头数字结尾的符号来表示 eg:p0、p1、p2

在非static方法中,po代指this,p1为方法的第一个参数

在static方法中,p0为方法的第一个参数

说明:.register:指定了方法中寄存器的总数,.locals:表明了方法中非参寄存器的总数,出现在方法中的第一行

五、操作指令

成员变量格式是:.field public/private [static] [final] varName:<类型>

对于不同的成员变量也有不同的指令

一般来说 获取的指令有:

iget、sget、iget-boolean、sget-boolean、iget-object、sget-object等 看到get的都是获取指令

操作的指令有:

iput、sput、iput-boolean、sput-boolean、iput-object、sput-object等

没有“-object”后缀的表示操作的成员变量对象是基本数据类型,带“-object”表示操作的成员变量是对象类型,特别地boolean类型则使用带“-boolean”的操作指令操作。

array的操作是aget和aput

六、方法/函数 Methods

.method public/private [static][final] methodName()<类型>

.end method

函数类型

direct method = private方法

virtual method = 其余的方法(public、protected)

函数调用

格式:invoke-指令类型{参数1,参数2...},L类名;->方法名

包含

invoke-direct

invoke-virtual

invoke-static

invoke-super

invoke-interface

函数返回结果:

invoke-result或move-result-object来保存函数返回的结果

invoke-result返回基本数据类型

move-result-object返回对象类型

你可能感兴趣的:(smali语法第一课)