wx_pmZ7777t 发表于 2018-5-2 12:42:00

Smali基本语法

http://bbs.zecoki.com/data/attachment/common/cf/102311q362klb36li21t72.png

.field private isFlag:z  定义变量.method  方法.parameter  方法参数.prologue  方法开始.line 12  此方法位于第12行invoke-super  调用父函数const/high16v0, 0x7fo3  把0x7fo3赋值给v0invoke-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(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://bbs.zecoki.com/forum-70-1.html}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: Smali基本语法