首页 > 编程知识 正文

smali语法指令,ivbydrip是静滴吗

时间:2023-05-05 14:57:54 阅读:160894 作者:3796

dalvik字节码有两种类型:原始类型和引用类型。 对象和数组是引用类型,其他类型是原始类型。

V void,仅适用于返回类型

z布尔

B byte

S short

C char

I int

Jlong(64位) )。

F float

ddouble(64位)。

对象

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; 表示字符串对象的数组。

方法

显示格式: Lpackage/name/ObjectName; -methodname(iii ) z

Lpackage/name/ObjectName; 表示类型,MethodName是方法名称。 III是参数(这里是三个整数参数),z是返回类型(bool类型)。

方法的参数一个接一个,之间是未分隔的。

更复杂的例子:

method(I[[iilJava/Lang/string; [Ljava/lang/Object; ) Ljava/lang/String;

在java中,您将看到以下内容:

字符串方法(int,int[],int,string,Object[] ) )

字段

显示格式:

Lpackage/name/ObjectName; - field name : ljava/lang/string;

包名称、字段名和每个字段类型。

寄存器

在dalvik字节码中,寄存器为32位,可以支持任何类型。 64位类型(Long型和Double型)用2个寄存器表示。

有两种方法可以指定一种方法可以使用的寄存器数量。 registers命令指定方法中的寄存器总数。 locals命令显示方法中非参数寄存器的数量。

方法的传参

调用该方法时,该方法的参数将放置在最后n个寄存器中。 1种方法有2个参数、5个寄存器(v0-v4 )时,参数配置在最后2个寄存器——v3和v4中。

非静态方法的第一个参数始终调用该方法的对象。

例如,非静态方法LMyObject; -callme(ii ) v有两个整数参数,另一个隐式LMyObject; 因为是参数,所以共有3个参数。 假设使用这种方法指定了5个寄存器(v0-v4 )。 使用. registers方式指定5个,或使用. locals方式指定2个。 即两个local寄存器、三个参数寄存器。 调用方法时,调用方法的对象(即this引用)存储在v2中,第一个整数参数存储在v3中,第二个整数参数存储在v4中。

静态方法是相同的,除了没有隐式this参数。

寄存器的命名方式

有——V命名方式和p命名方式两种。 p命名方式的第一个寄存器是方法的第一个参数寄存器。 下表说明了上一个示例如何包含五个寄存器和三个参数,以及这两种命名方法。

v0第一个本地注册器

第v12个本地注册器

v2 p0第一个参数注册器

v3 p1中的第二个参数注册器

v4p第二个参数注册器

用什么方法参照参数寄存器——他们都没有什么不同。

注意: baksmali缺省情况下对参数寄存器使用p命名方法。 如果要使用v命名方法,请使用-pl—no-parameter-registers选项。

使用p命名方法是为了避免以下缺点:如果以后尝试将寄存器添加到方法中,则必须对参数寄存器重新编号。

长/双精度值

Long和double类型为64位,需要两个寄存器。

例如,非静态方法LMyObject; -mymethod(ijz ) v,参数分别为LMyObject;int、long、bool。 因此,该方法中为了存储参数需要5个寄存器。

p0 this

p1 I

p2,p3 J

p4 Z

# static fields定义静态变量的标记

定义# instance fields实例变量的标记

#用于定义直接方法静态方法的标记

# virtual methods用于定义非静态方法的标记

构造函数的返回类型为v,名称为init。

if-eq p1,v0, cond_8表示如果p1和v 0相等,则执行cond _ 8的进程。

:cond_8

invoke-direct {p0},Lcom/paul/test/a; -d () v

调用com.paul.test.a中的d (方法

if-ne p1,v 0, cond_b表示如果不相等,则执行cond _ b的进程。

:cond_b

const/4v 0,0x 0

invoke-virtual {p0,v0},Lcom/paul/test/a; -setpressed(z ) v

invoke-super {p0,p1,p2},Landroid/view/View; - onkeyup (il Android/view/keyevent; (z

move-result v0

调用com.paul.test.a的setPressed方法,以调用父类View的onKeyUp方法,最后调用return v0

init和clinit区别

init是初始化构造函数

clinit是初始化静态成员的变量

class x { static loglog=log factory.get log (; //clinit private int x=1; //init X (()//init X (静态)//clinit ) ) )。

参考:

3358 BBS.pediy.com/showthread.PHP? t=151769

3358 stack overflow.com/questions/8517121/Java-VM spec-what-is-difference-between-init-and-clin it

3358 www.net mite.com/Android/my droid/dal vik/docs/dal vik-bytecode.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。