简介

该文档描述了Dalvik 可执行文件和Dalvik 字节码的指令格式。

按照位的描述

格式描述表(见下文)的第一列表示个格式的位结构,它由一个或者多个由空格分开的“指令单元”构成,每个指令单元的长度为16位,指令单元中的每个字符表示4个位,按照高位到低位的顺序进行排列,采用"|"进行分割。采用从"A"开始的大写字母用于区分指令单元中的不同字段(每个字段的进一步定义参见语义列)."op"用于标识一个8位宽的操作码,"Ø"用于标识被忽略的位,这些位必须为0.

在大部分情况下,字母是按照代码单元的顺序进行排列,代码单元中按照从低位到高位的顺序进行排序。但是也存在例外情况,为了将含义相近的部分放在一起,可能也会改变顺序。在格式描述中会单独说明。

例如格式"B|A|op CCCC"表示一个格式,由2个代码单元构成。第一个代码单元的低八位表示操作码(opcode),高八位由一对4位的数据构成;第二个代码单元表示一个单独的16位数据。

格式ID

格式描述表的第二列表示格式的id,用于在其它文档中引用一个格式。

大部分格式id由3个字符构成,2个数字加上1个字母。第1个数字表示代码单元的个数。第2个数字表示该指令格式可以包含的最大的寄存器个数(一些指令格式可以使用可变数量的寄存器),字母"r"表示使用了一段的寄存器。最后一个字符表示了指令格式中的任何类型的附加数据。例如"21t"表示2个代码单元长度的指令,引用了1个寄存器,并且包含了附加数据分支目标("branch target").

建议静态链接的指令格式会加一个"s”作为后缀,一共加起来是4个字符。类似的,建议"inline"链接的会加一个"i"作为后缀.(在这里,内联链接和静态链接类似),最后,a couple oddball suggested formats (e.g., "20bc") include two pieces of data which are both represented in its format ID.

以下是附加数据类型的完整列表。注意,有些格式有不同的大小,由指令格式决定。

助记符 位数 含义
b 8 signed byte立即数
c 16, 32 常量池索引
f 16 接口常量 (只用于静态链接的格式)
h 16 signed hat立即数 (hat是32位或者64位数据的高位,这些数据的低位全部为0)
i 32 signed int或者32-bit float立即数
l 64 signed long或者64-bit double立即数
m 16 方法常量 (只用于静态链接的格式)
n 4 signed nibble立即数
s 16 signed short立即数
t 8, 16, 32 分支目标,用于转移指令goto等
x 0 没有附加数据

语法

格式描述表的第三列以人类可读的方式说明了格式的语法,每条指令采用操作码的名字开始,后面带一个或者多个参数,采用逗号进行分割。

每个参数对应第一列的一个字段,与第一列类似,字母每重复一次,代表4个位。例如:一个8个位的字段"BB"在第一列也是BB

寄存器参数采用"vX"这样的格式。使用前缀"v"而没有使用前缀"r"是因为为了避免与实现虚拟机的物理体系结构进行发生冲突。(这样就有可能将虚拟的和物理的寄存器一起进行讨论)

字面量采用"#+X"的形式进行表示,有些格式在表示字面量时,仅记录的字面量的高位(称作hat),对于这种类型的量,仅仅在语法表示时会写出后面的0,但是在指令中这些0会被省略。

相对地址偏移采用"+X"的形式进行表示。

常量缓存池索引采用kind@X进行表示,kind表示常量缓存池的类型。每个指令只允许使用一种类型的常量缓存池,指令使用缓存池的情况参见指令列表。常量缓冲池包括4种类型:字符串、类型、字段和方法。

类似于常量池的表示方法,预链接采用类似的格式进行表示。有2种预链接值:vtable偏移"vtaboff"和field偏移"fieldoff"

当字段的值不属于格式的一部分,而是一个确定的已经选择的值,采用"[X=N]"形式的前缀进行表示,例如[A=2]

格式描述表

格式 ID 语法 Notable Opcodes Covered
N/A 00x N/A 用于未使用的操作码的伪格式; 建议用作用作断点操作码的名义格式
ØØ|op 10x op  
B|A|op 12x op vA, vB  
11n op vA, #+B  
AA|op 11x op vAA  
10t op +AA goto
ØØ|op AAAA 20t op +AAAA goto/16
AA|op BBBB 20bc op AA, kind@BBBB suggested format for statically determined verification errors; A is the type of error and B is an index into a type-appropriate table (e.g. method references for a no-such-method error)
AA|op BBBB 22x op vAA, vBBBB  
21t op vAA, +BBBB  
21s op vAA, #+BBBB  
21h op vAA, #+BBBB0000
op vAA, #+BBBB000000000000
 
21c op vAA, type@BBBB
op vAA, field@BBBB
op vAA, string@BBBB
check-cast
const-class
const-string
AA|opCC|BB 23x op vAA, vBB, vCC  
22b op vAA, vBB, #+CC  
B|A|opCCCC 22t op vA, vB, +CCCC  
22s op vA, vB, #+CCCC  
22c op vA, vB, type@CCCC
op vA, vB, field@CCCC
instance-of
22cs op vA, vB, fieldoff@CCCC suggested format for statically linked field access instructions of format 22c
ØØ|opAAAAloAAAAhi 30t op +AAAAAAAA goto/32
ØØ|opAAAA BBBB 32x op vAAAA, vBBBB  
AA|opBBBBloBBBBhi 31i op vAA, #+BBBBBBBB  
31t op vAA, +BBBBBBBB  
31c op vAA, string@BBBBBBBB const-string/jumbo
A|G|opBBBB F|E|D|C 35c [A=5op {vC, vD, vE, vF, vG}, meth@BBBB
[A=5op {vC, vD, vE, vF, vG}, type@BBBB
[A=4op {vC, vD, vE, vF},kind@BBBB
[A=3op {vC, vD, vE},kind@BBBB
[A=2op {vC, vD}, kind@BBBB
[A=1op {vC}, kind@BBBB
[A=0op {}, kind@BBBB

The unusual choice in lettering here reflects a desire to make the count and the reference index have the same label as in format 3rc.

 
35ms [A=5op {vC, vD, vE, vF, vG}, vtaboff@BBBB
[A=4op {vC, vD, vE, vF}, vtaboff@BBBB
[A=3op {vC, vD, vE}, vtaboff@BBBB
[A=2op {vC, vD}, vtaboff@BBBB
[A=1op {vC}, vtaboff@BBBB

The unusual choice in lettering here reflects a desire to make the count and the reference index have the same label as in format 3rms.

suggested format for statically linkedinvoke-virtual and invoke-super instructions of format 35c
35mi [A=5op {vC, vD, vE, vF, vG}, inline@BBBB
[A=4op {vC, vD, vE, vF}, inline@BBBB
[A=3op {vC, vD, vE}, inline@BBBB
[A=2op {vC, vD}, inline@BBBB
[A=1op {vC}, inline@BBBB

The unusual choice in lettering here reflects a desire to make the count and the reference index have the same label as in format 3rmi.

suggested format for inline linked invoke-static and invoke-virtual instructions of format 35c
AA|opBBBB CCCC 3rc op {vCCCC .. vNNNN}, meth@BBBB
op {vCCCC .. vNNNN}, type@BBBB

where NNNN = CCCC+AA-1, that isA determines the count 0..255, and C determines the first register

 
3rms op {vCCCC .. vNNNN}, vtaboff@BBBB

where NNNN = CCCC+AA-1, that isA determines the count 0..255, and C determines the first register

suggested format for statically linkedinvoke-virtual and invoke-super instructions of format 3rc
3rmi op {vCCCC .. vNNNN}, inline@BBBB

where NNNN = CCCC+AA-1, that isA determines the count 0..255, and C determines the first register

suggested format for inline linked invoke-static and invoke-virtual instructions of format 3rc
AA|opBBBBloBBBB BBBB BBBBhi 51l op vAA, #+BBBBBBBBBBBBBBBB const-wide

Dalvik系列02 - 指令格式的更多相关文章

  1. Aoite 系列(02) - 超动感的 Ioc 容器

    Aoite 系列(02) - 超动感的 Ioc 容器 Aoite 是一个适于任何 .Net Framework 4.0+ 项目的快速开发整体解决方案.Aoite.Ioc 是一套解决依赖的最佳实践. 说 ...

  2. SAP接口编程 之 JCo3.0系列(02) : JCo Client Programming

    SAP接口编程 之 JCo3.0系列(02) : JCo Client Programming 字数545 阅读52 评论0 喜欢1 JCo3.0调用SAP函数的过程 大致可以总结为以下步骤: 连接至 ...

  3. Java 之 I/O 系列 02 ——序列化(二)

    Java 之 I/O 系列 目录 Java 之 I/O 系列 01 ——基础 Java 之 I/O 系列 02 ——序列化(一) Java 之 I/O 系列 02 ——序列化(二) 继续上篇的第二个问 ...

  4. Java 之 I/O 系列 02 ——序列化(一)

    Java 之 I/O 系列 目录 Java 之 I/O 系列 01 ——基础 Java 之 I/O 系列 02 ——序列化(一) Java 之 I/O 系列 02 ——序列化(二) 一 序列化概述 序 ...

  5. Java 集合系列 02 Collection架构

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  6. java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括InputStream)

    我们以ByteArrayInputStream,拉开对字节类型的“输入流”的学习序幕.本章,我们会先对ByteArrayInputStream进行介绍,然后深入了解一下它的源码,最后通过示例来掌握它的 ...

  7. JavaScript进阶系列02,函数作为参数以及在数组中的应用

    有时候,把函数作为参数可以让代码更简洁. var calculator = { calculate: function(x, y, fn) { return fn(x, y); } }; var su ...

  8. 委托、Lambda表达式、事件系列02,什么时候该用委托

    假设要找出整型集合中小于5的数. static void Main(string[] args) { IEnumerable<int> source = new List<int&g ...

  9. php从入门到放弃系列-02.php基础语法

    php从入门到放弃系列-02.php基础语法 一.学习语法,从hello world开始 PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器&qu ...

随机推荐

  1. SSH框架简化(struts2+spring+hibernate)

    目的: 通过对ssh框架有了基础性的学习,本文主要是使用注解的方式来简化ssh框架的代码编写. 注意事项: 1.运行环境:Windows 8-64位,Eclipse(开发工具),jdk1.8.0_91 ...

  2. grid安装

    在cs6.5,cs7.2上安装grid11.2.0.1 和database11.2.0.1还是有问题 1.i386与i686的问题 2.cs7.2中的semmni内核参数问题 已经设置了kernel. ...

  3. unity, reduce android size

    参考: https://www.youtube.com/watch?v=TYSmf_zgtZo http://stackoverflow.com/questions/41087220/how-to-u ...

  4. Javascript中数组与字典(即map)的使用

    简述: 简单记录一下数据结构Map和数组, 其实在Javascript这种弱类型的脚本语言中,数组同时也就是字典,下面主要就是字典数组的简易使用   代码: 1. 数组中添加map <!DOCT ...

  5. JavaScript使用XMLHttpRequest 發送GET/Post 請求

    <!DOCTYPE HTML> <html> <head> <title>Demo</title> <script type=&quo ...

  6. AMBA

    基于IP复用的设计方法在SOC设计中得到了广泛的应用,设计过程中,片上总线的设计师最关键的问题. AMBA是由ARM公司退出的片上总线,是一种流行的工业标准片上结构. AMBA规范主要包括了AHB(A ...

  7. [Android] ADB操作相关经验

    1.手机必须先root,小米可以安卓开发版系统即可.(注意:usb设置为调试模式) 2.安卓 adb工具(android debug bridge) 3.依次执行下面的命令: #adb root 获得 ...

  8. Mysql无法创建外键的原因

    在Mysql中创建外键时,经常会遇到问题而失败,这是因为Mysql中还有很多细节需要我们去留意,我自己总结并查阅资料后列出了以下几种常见原因. 1.  两个字段的类型或者大小不严格匹配.例如,如果一个 ...

  9. 【solr】之solr界面查询返回距离并排序

    使用solr界面查询 {!geofilt}距离函数 star:[4 TO 5]星级排序 geodist() desc 距离排序 pt :31.221717,121.580891 sfield:loca ...

  10. [经验交流] Mesos-dns 和 Marathon-lb 简要使用方法

    Mesos-dns 和 Marathon-lb 是mesosphere 官网提供的两种服务发现和负载均衡工具.官方的文档主要针对DCOS,针对其它系统的相关中文文档不多,下面是我在Centos7上的安 ...