• Smali基本语法


    Smali基本语法 - lee0oo0 - 博客园

    .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, "u73b0u5728u8f6eu5230u6211u4e0au573au4e50"
    
        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

  • 相关阅读:
    读《高效能人士的七个习惯》有感
    Springboot中的日志
    fastjson JSON.toJavaObject() 实体类首字母大写属性无法解析问题
    java多线程编程实例
    IDEA插件配置推荐
    Spring Boot 自定义数据源 DruidDataSource
    zookeeper环境搭建
    eureka注册中心的使用
    记事本编码
    Chrome浏览器基本操作
  • 原文地址:https://www.cnblogs.com/seven1979/p/4283536.html
Copyright © 2020-2023  润新知