2.2 虚拟机与Dalvik字节码

2.2.1 虚拟机

(1)Java虚拟机

    java字节码
    基于栈架构 

(2)Dalvik虚拟机(jit机制)

    Android 5.0以下
    dalvik字节码
    dalvik可执行文件体积更小
    基于寄存器架构

(3)ART虚拟机

    Android 5.0版本及以上

2.2.2 Dalvik字节码

    dalvik指令格式
    dex文件反汇编工具
        smali.jar\ddx.jar
    了解dalvik寄存器
        dalvik中的寄存器都是32位
    寄存器之v命名法与p命名法
        局部变量寄存器 
        参数寄存器
    dalvik字节码
        类型
            smali==>Java
            V    void
            Z    boolean
            B    byte
            S    short
            C    char
            I    int
            J    long  重点
            F    float
            D    double
            L    java类类型 重点
            [    数组类型
        字段
            Lpackage/name/ObjectName;->FieldName:Ljava/lang/String;
        方法
            Lpackage/name/ObjectName;->MethodName(III)Z

2.2.3 Dalvik指令集

基础字节码-名称后缀/字节码后缀 目的寄存器  源寄存器
名称后缀是wide,表示数据宽度为64位
字节码后缀是from16,表示源寄存器为16位
空操作指令
    nop
数据操作指令
    move(-wide/-object/-result/-result-object/-result-wide/-exception)
    move(-wide/-object)/from16
    move(-object)/16
返回指令(重点)
    return-void(表示方法的放回值为空)
    return(表示方法的放回值为32位非对象类型的值)
    return-wide(表示方法的放回值为64位非对象类型的值)
    return-object(表示方法的放回值为对象类型的值)
数据定义指令(重点)
    const(-wide/-string/-class)
    const/4
    const(-wide)/16
    const(-wide)/32
    const(-wide)/high16
锁指令
    monitor
实例操作指令
    check-cast(类型转换)
    instance-of(检查)
    new-instance(新建)
数组操作指令
    array-length(获取数组长度)
    new-array(新建数组)
    filled-new-array(定义数组并初始化)
    filled-new-array/range(定义数组并初始化/指定取值范围)
    filled-array-data(数组元素取值与赋值)
异常指令(throw)
跳转指令(重点)
    goto
    packed-switch(有规律)、sparse-switch(无规律)
    if-eq(等于)/if-ne(不等于)
    if-lt(小于)/if-le(小于等于)
    if-gt(大于)/if-ge(大于等于)
比较指令(cmp)
    大于(1)/等于(0)/小于(-1)=>cmpg、cmp
    大于(-1)/等于(0)/小于(1)=>cmpl
字段操作指令
    普通字段=>iget(读)/iput(写)
    静态字段=>sget(读)/sput(写)
方法调用指令(重点)
    invoke-virtual(调用实例的虚方法)
    invoke-super(调用实例的父类/基类方法)
    invoke-direct(调用实例的直接方法)
    invoke-static(调用实例的静态方法)
    invoke-interface(调用实例的接口方法)
数据转换指令
    neg-数据类型=>求补
    not-数据类型=>求反
    数据类型1-to-数据类型2=>将数据类型1转换为数据类型2
数据运算指令
    add/sub/mul/div/rem     加/减/乘/除/模
    and/or/xor  与/或/非
    sh1/shr/ushr    有符号左移/有符号右移/无符号右移

2.2.4 smali汇编

.class public LHelloWorld;
.super Ljava/lang/Object;
.method public static main([Ljava/lang/String;)V
    .registers 4
	.parameter
    .prologue
	#空指令
    nop
    nop
    nop
    nop
	#数据定义指令
	const/16 v0, 0x8
	const/4 v1, 0x5
	const/4 v2, 0x3
	#数据操作指令
	move v1, v2
	#数组操作指令
	new-array v0, v0, [I
	array-length v1, v0
	#实例操作指令
	new-instance v1, Ljava/lang/StringBuilder;
	#方法调用指令
	invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
	#跳转指令
	if-nez v0, :cond_0
	goto :goto_0
	:cond_0
	#数据转换指令
	int-to-float v2, v2
	#数据运算指令
	add-float v2, v2, v2
	#比较指令
	cmpl-float v0, v2, v2
	#字段操作指令
	sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
	const-string v1, "Hello World" #构造字符串
	#方法调用指令
	invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
	#返回指令
	:goto_0
    return-void
.end method

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值