首页 > 系统 > Android > 正文

Android 反编译 smail语法基础

2019-11-08 00:18:57
字体:
来源:转载
供稿:网友

数据类型

1. 基本数据类型

    Z boolean    B byte    S short    C char    I int    J long (64 bits)    F float    D double (64 bits)

    V void  返回值类型

2.引用数据类型

  对象 

   以Lpackage/name/ObjectName;的形式表示。

   前面的L表示这是一个对象类型,package/name/是该对象所在的包,ObjectName是对象的名字,”;”表示对象名称的结束。相当于java中的package.name.ObjectName

例如:Ljava/lang/String;  相当于  java.lang.String

   数组

   [I –表示一个整型一维数组,相当于java中的 int[]。 对于多维数组,只要增加[就行了。[[I 相当于 int[][],[[[I 相当于int[][][] 。注意每一维的最多255个。

   对象数组

[Ljava/lang/String; 表示一个String对象数组。

方法

方法表示形式:Lpackage/name/ObjectName;-> MethodName(III)Z

在上面的例子中,Lpackage/name/ObjectName;表示类型,MethodName是方法名。III为参数(在此是3个整型参数),Z是返回类型(bool型)。

方法的参数是一个接一个的,中间没有隔开。

一个更复杂的例子:method(I[[IILjava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;

在java中则为:String method(int, int[][], int, String, Object[])

寄存器

java变量存放在内存中,android中变量放在寄存器中,为了提高性能

寄存器为32位,可以支持任何类型,其中long和doubble是64位的,需要使用两个寄存器保存

寄存器采用v和p来命名v表示本地寄存器,p表示参数寄存器,关系如下

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

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

当然,如果是静态方法的话就只有5个寄存器了,不需要存this了。

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

声明成员

PRivate TextView mTextView;

.field private mTextView:Landroid/widget/TextView;

指令执行

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

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

invoke-static {v4, v5}, Lme/isming/myapplication/MainActivity;->sum(II)I 

#执行方法sum(),v4,v5的值分别作为sum的参数。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表