1. 程式人生 > 其它 >Dalvik位元組碼和Smali基本語法

Dalvik位元組碼和Smali基本語法

什麼是Dalvik位元組碼

Dalvik是Google專門為Android設計的一個虛擬機器。
Dalvik VM是基於暫存器的,而JVM是基於棧的,Dalvik有專屬的檔案執行格式dex(Dalvik executable),jvm使用的是java位元組碼。
Dalvik VM你jvm速度更快,佔用空間更少。

什麼是Smali

 Smali,baksmali分貝時指安卓系統裡的java虛擬機器(Dalvik)所使用的一種。dex格式檔案的彙編器,反彙編器。
 語法為一行寬鬆的Jasmin/dedeser語法,且實現了.dex格式的所用功能(註解,除錯資訊,線路資訊等)。
 對apk檔案進行反彙編後,便會生成此類檔案。其中在Dalvik位元組碼中,暫存器都是32位的,能夠支援任何型別,64位型別(Long/Double)用2個暫存器表示。
Dalvik位元組碼有兩種型別:原始型別,引用型別。

原始型別:  
      B --- byte

      C --- char

      D --- double

      F --- float

      I --- int

      J --- long

      S --- short

      V --- void

      Z --- boolean  

      [XXX --- array    //陣列表示方式:基本型別前加上“[”,eg:int型陣列表示為:[I

      LXXX/yyy --- object  //物件表示以L開頭,格式為LpackageName/objectName;(分號必須有)

      //eg:String在Smali中為:LJava/lang.String; ,其中java/lang對應java.lang包,String就是定義在該包中的一個物件。

      //內部類表示為:LpackName/objectNamesubObjectName;。即在內部類前面加“subObjectName;。即在內部類前面加“”符號。

 

    方法定義:Func-Name(para-Type1para-Type2para-Type3...)Return-Type    //引數之間沒有空格

    eg:hello()v    //void hello()

      hello(III)Z    //boolean hello(int,int,int)

      hello(Z[I[ILjava/lang/String;J)Ljava/lang/String    //String hello(boolean,int[],int[],String,long)

Smali基本語法


  .field private isFlag:z  定義變數

  .method       方法

  .parameter     方法引數

  .prologue      方法開始

  .line 123     此方法位於第123行

  invoke-super   呼叫父函式

  const/high16 vO, 0x7fo3   把0x7fo3賦值給v0

  invoke-direct   呼叫函式

  return-void   函式返回void

  .end method   函式結束

  new-instance   建立例項

  iput-object   物件賦值

  iget-object   呼叫物件

  invoke-static   呼叫靜態函式

條件跳轉分支:
  "if-eq vA, vB, :con_**"   如果vA等於vB則跳轉到:cond_ **

  "if-ne vA, vB, :cond_**"    如果vA不等於vB則跳轉到:cond_ **

  "if-It 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-Itz 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 **