Smali基本語法


.field private isFlag:z  定義變量

.method  方法

.parameter  方法參數

.prologue  方法開始

.line 12  此方法位於第12行

invoke-super  調用父函數

const/high16  v0, 0x7fo3  把0x7fo3賦值給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_**

=============================================

if函數的java代碼:

private boolean ifSense(){
        boolean tempFlag = ((3-2)==1)? true : false;
        if (tempFlag) {
            return true;
        }else{
            return false;
        }
    }

if函數分析:

.method private ifSense()Z
    .locals 2

    .prologue
    .line 22
    const/4 v0, 0x1     // v0賦值為1

    .line 24
    .local v0, tempFlag:Z
    if-eqz v0, :cond_0            // 判斷v0是否等於0, 不符合條件向下走, 符合條件執行cond_0分支

    .line 25
    const/4 v1, 0x1            // 符合條件分支

    .line 27
    :goto_0
    return v1

    :cond_0
    const/4 v1, 0x0            // cond_0分支

    goto :goto_0
.end method

###文字描述:如果符合if分支則程序往下走,最終return ; 而如果條件不符合則會走到 :cond_0分支 , 最終執行 goto :goto_0走回 :goto_0返回

 

======================================================

for函數java代碼:

private void forSense(){
    listStr = new ArrayList<String>(COUNT);
    for (int i = 0; i < COUNT; i++) {
        listStr.add("現在輪到我上場樂");
    }
}

 

for函數分析:

.line 40
    const/4 v0, 0x0

    .local v0, i:I
    :goto_0
    if-lt v0, v3, :cond_0            //  if-lt判斷數值v0小於v3 ,    如不符合往下走, 符合執行分支 :cond_0

    .line 43
    return-void

    .line 41
    :cond_0                // 標簽
    iget-object v1, p0, Lcom/example/smalidemo/MainActivity;->listStr:Ljava/util/List;                // 引用對象

    const-string v2, "\u73b0\u5728\u8f6e\u5230\u6211\u4e0a\u573a\u4e50"

    invoke-interface {v1, v2}, Ljava/util/List;->add(Ljava/lang/Object;)Z        // List是接口, 所以執行接口方法add

    .line 40
    add-int/lit8 v0, v0, 0x1    // 將第二個v0寄存器中的值,加上0x1的值放入第一個寄存器中, 實現自增長

    goto :goto_0                // 回去:goto_0標簽

###文字描述:設定一個標簽goto_0, 判斷v0小於v3, 符合執行分支:cond_0 ,然后又跑回:goto_0做繼續判斷

 

 

=========================================================

 讀完這篇鏈接文章,就基本入門了。http://blog.csdn.net/lpohvbe/article/details/7981386

 

  

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM