(翻译)Bytecode for the Dalvik VM -General Design
来源:互联网 发布:数据恢复最好的软件 编辑:程序博客网 时间:2024/06/06 20:43
Bytecode for the Dalvik VM -General Design
- 以下所述的machine model和调用约定采用了一般架构和C语言调用约定来表述:
- Dalvi虚拟机是基于寄存器的,函数帧在创建时有固定的大小,每个帧包含了若干个寄存器(由函数指定)以及一些执行时所需要的附加数据,例如(但不局限于)程序计数器pc,以及包含该方法的一个.dex文件引用
- 寄存器位宽为32位,使用两个连续的寄存器来表示一个64位长的值
- 位操作的表示,(Object)null == (int) 0.
- 函数的N个参数有序的放置于函数帧的最后N个寄存器中。宽字节参数占用两个寄存器。函数的实例使用this引用第一个参数。
指令流中的每个存储单元为16位无符号。有些指令中的位会被忽略,或者必须为0。
指令不必要限制为某种类型,比如一个对32位寄存器的mov操作指令在没有解释之前不需要指定指令是针对int还是float
有单独的枚举和有序的常量池来引用string,types,fileds,以及方法。
对literal data的位操作是内联在指令流中的。
由于一般一个函数不会使用超过16个寄存器,而且使用8个以上的寄存器是很常见的,很多指令被限制为只能访问前16个寄存器(addressing the first 16 register).在需要的情况下,允许引用最多256个寄存器。为避免一条指令无法访问一个需要的寄存器,建议将寄存器的内容从原始寄存器拷贝到一个较低位置的寄存器(在引用之前),然后在应用之后将其拷贝到一个高位寄存器
有一些“伪指令”可以包含变长数据,以供常规指令引用(比如,fill-array-data).这些指令在正常执行流中不应该出现。此外,这些指令必须出现在字节码偏移为偶数的位置(即4字节对其)。为了达到这个要求,dex生成器工具必须产生额外的nop指令作为占位符。最后,虽然不是必须的,我们期望这类dex生成器将这些nop指令放在方法的结尾,否则需要额外的指令来“环绕”它们(不是很懂,原文:it is expected that most tools will choose to emit these instructions at the ends of methods, since otherwise it would likely be the case that additional instructions would be needed to branch around them.)
在程序安装后,有些指令会被修改其格式,作为安装时的一个静态链接优化。如果链接是已知的,这样做可以允许快速执行。参见 Dalvik VM Instruction Format
可读的格式和助记
- 参数:先目的地址,后源地址
- 一些指令会包含他们操作类型的后缀:64bit操作码通常含有-wide后缀。类型相关的操作通常会带有类型名后缀:-boolean -byte -char -short -int -long -float -double -object -string -class -void。普通32位操作不带后缀
- 一些指令含有反斜杠‘/’来标记其不同的指令布局和选项。这些后缀与指令名字用‘/’隔开,来保证和指令中的静态常量的一一映射并生成和翻译为可执行文件。
原文地址以及指令详细格式含义
- (翻译)Bytecode for the Dalvik VM -General Design
- Dalvik bytecode
- 【翻译】Dalvik——如何控制vm
- General Design Considerations for Secure Networks
- Dalvik VM
- AndBug调试Android Dalvik Bytecode
- AndBug调试Android Dalvik Bytecode
- AndBug调试Android Dalvik Bytecode
- AndBug调试Android Dalvik Bytecode
- source does not match the bytecode for class问题解决
- Dalvik VM介绍
- Dalvik VM介绍
- android dalvik vm alloc
- android dalvik vm oo
- android dalvik vm alloc
- increase dalvik vm heapsize
- Dalvik vm Hash interface
- Dalvik VM Hash - implementation
- nginx配置详解
- 关于MongoDB你需要知道的几件事
- Leetcode Pascal's Triangle II
- java的数据类型
- 如何解决编译过程中遇到ASN1C相关的问题
- (翻译)Bytecode for the Dalvik VM -General Design
- Glib学习
- Android Vitamio 直播视频播放功能的实现
- Java中的异常
- 【网络流】 csu 1623 Inspectors
- Linux学习一----------Linux制作本地yum源
- java读取properties配置文件
- 使用ContentProvider
- myBatis事务处理