专业的编程技术博客社区

网站首页 > 博客文章 正文

零基础 超详细 Dalvik 虚拟机操作码讲解

baijin 2024-10-26 08:08:56 博客文章 10 ℃ 0 评论

表中的vx、vy、vz 表示某个Dalvik 寄存器。

根据不同指令可以访问16、256 或64K 寄存器。表中lit4、lit8、lit16、lit32、lit64 表示字面值(直接赋值),数字是值所占用位的长度。

long 和double 型的值占用两个寄存器,例:一个在v0 寄存器的double 值实际占用v0,v1 两个寄存器。

boolean 值的存储实际是1 和0,1 为真、0 为假;boolean 型的值实际是转成int 型的值进行操作。

所有例子的字节序都采用高位存储格式,例:0F00 0A00 的编译为0F, 00, 0A, 00 存储。

有一些指令没有说明和例子,因为我没有在正常使用中看到过这些指令,它们的存在是从这里知道的:Android o

pcode constant list。

Android应用程序是运行在Dalvik虚拟机里面的,并且每一个应用程序对应有一个单独的Dalvik虚拟机实例。

Dalvik虚拟机使用的指令是基于寄存器的,而Java虚拟机使用的指令集是基于堆栈的。基于堆栈的指令很紧凑,例如,Java虚拟机使用的指令只占一个字节,因而称为字节码。基于寄存器的指令由于需要指定源地址和目标地址,因此需要占用更多的指令空间,例如,Dalvik虚拟机的某些指令需要占用两个字节。基于堆栈和基于寄存器的指令集各有优劣,一般而言,执行同样的功能,前者需要更多的指令(主要是load和store指令),而后者需要更多的指令空间。需要更多指令意味着要多占用CPU时间,而需要更多指令空间意味着数据缓冲(d-cache)更易失效。

事实上,基于寄存器和基于堆栈的指令集之争,就如精简指令集(RISC)和复杂指令集(CISC)之争,谁优谁劣,至今是没有定论的。

关于Dalvik虚拟机的特性,我们就简要介绍到这里。事实上,Dalvik虚拟机和Java虚拟机的实现是类似的,例如,Dalvik虚拟机也支持JDWP(Java Debug Wire Protocol)协议,这样我们就可以使用DDMS来调试运行在Dalvik虚拟机中的进程。对Dalvik虚拟机的其它特性或者实现原理有兴趣的,建议都可以参考Java虚拟机的实现,这里提供三本参考书:

1. Java Virtual Machine Specification (Java SE 7)

2. Inside the Java Virtual Machine, Second Edition

3. Oracle JRockit: The Definitive Guide

另外需要详细pdf教程的朋友私信我哦。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表