Android 反编译(四)了解.smail方法

来源:互联网 发布:python for line in f 编辑:程序博客网 时间:2024/06/06 08:58
看一个.smail的方法
.method private testIf(I)V      .locals 3      .param p1, "a"    # I        .prologue      .line 34      const/4 v0, 0x5        if-ne p1, v0, :cond_0        .line 35      sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;        const-string v1, "a\u7684\u503c\u4e3a 5"        invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V        .line 39      :goto_0      return-void        .line 37      :cond_0      sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;        new-instance v1, Ljava/lang/StringBuilder;        invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V        const-string v2, "a\u7684\u503c\u4e3a ? :"        invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;        move-result-object v1        invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;        move-result-object v1        invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;        move-result-object v1        invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V        goto :goto_0  .end method  


看着一大堆有点晕,其实这就是一个if判断

private void testIf(int a){         if (a == 5){             System.out.print("a的值为 5");         }else {             System.out.print("a的值为 ? :"+a);         }     }  

下面自己总结了一下怎么看.smail的方法,我们看第一行.method private testIf(I)V,其中 .method就是开始一个方法,private是修饰类型(比如:public等),testIf就是方法名称,(I)括号里是参数 I 是int类型。可以看.smail文件之 JavaBean类

.locals 使用这个指定表明方法中非参寄存器的总数,放在方法的第一行

寄存器采用v和p来命名

v表示本地寄存器,p表示参数寄存器,关系如下

如果一个方法有两个本地变量,有三个参数

v0 第一个本地寄存器 v1 第二个本地寄存器 v2 p0 (this) v3 p1 第一个参数 v4 p2 第二个参数 v5 p3 第三个参数 

.registers 使用这个指令指定方法中寄存器的总数

line 就不用说了,就是对应的行数

move v0, v3 #把v3寄存器的值移动到寄存器v0上.

const v0, 0x1 #把值0x1赋值到寄存器v0上。

详细的需要去了解以下汇编,如果懂汇编就爽了。嘿嘿

结束就是.end method





阅读全文
0 0
原创粉丝点击