smali语法(一)

一.什么是Smali?

Smali,Baksmali分别是指安卓系统里的Java虚拟机(Dalvik)所使用的一种dex格式文件的汇编器,反汇编器。其语法是一种宽松式的Jasmin/dedexer语法,而且它实现了.dex格式所有功能(注解,调试信息,线路信息等)

二.smali的语法

1.原始类型

  • B---byte
  • C---char
  • D---double
  • F---float
  • I---int
  • J---long
  • S---short
  • V---void
  • Z---boolean
  • [XXX---array
  • Lxxx/yyy---object

解析下最后两项,数组的表示方式是:

  • 在基本类型前加上前中括号“[”,例如int数组和float数组分别表示为:[I、[F;
  • 对象的表示则以L作为开头,格式LpackageName/objectName;(注意必须有个分号跟在最后),例如String对象在smali中为:Ljava/lang/String;,其中java/lang对应java.lang包,String就是定义在该包中的一个对象。

2.方法的定义

 格式:Func-Name (Para-Type1Para-Type2Para-Type3...)Return-Type

注意:参数和参数间没有任何分隔符,

1.hello()v

  就是void hello()

2.hello(lll)Z

  就是boolean hello(int,int,int)

3.hello(Z[l[lLjava/lang/String;J)Ljava/lang/String 

  就是String hello(boolean,int[],int[],String,long)

3.基本语法

  • .field private isFlag:z  定义变量
  • .method  方法
  • .parameter  方法参数
  • .prologue  方法开始
  • .line 123  此方法位于第123行
  • invoke-super  调用父函数
  • const/high16  v0, 0x7fo3  把0x7fo3赋值给v0
  • invoke-direct  调用函数
  • return-void  函数返回void
  • .end method  函数结束
  • new-instance  创建实例
  • iput-object  对象赋值
  • iget-object  调用对象
  • invoke-static  调用静态函数

4.条件跳转分支:

"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_**

 

posted @ 2017-12-03 11:44  im.lhc  阅读(1300)  评论(0编辑  收藏  举报