Dalvik系列02 - 指令格式
简介
该文档描述了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, #+BBBB0000op vAA, #+BBBB000000000000 |
||
| 21c | op vAA, type@BBBBop vAA, field@BBBBop 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@CCCCop 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=5] op {vC, vD, vE, vF, vG}, meth@BBBB[ A=5] op {vC, vD, vE, vF, vG}, type@BBBB[ A=4] op {vC, vD, vE, vF},kind@BBBB[ A=3] op {vC, vD, vE},kind@BBBB[ A=2] op {vC, vD}, kind@BBBB[ A=1] op {vC}, kind@BBBB[ A=0] op {}, 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=5] op {vC, vD, vE, vF, vG}, vtaboff@BBBB[ A=4] op {vC, vD, vE, vF}, vtaboff@BBBB[ A=3] op {vC, vD, vE}, vtaboff@BBBB[ A=2] op {vC, vD}, vtaboff@BBBB[ A=1] op {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=5] op {vC, vD, vE, vF, vG}, inline@BBBB[ A=4] op {vC, vD, vE, vF}, inline@BBBB[ A=3] op {vC, vD, vE}, inline@BBBB[ A=2] op {vC, vD}, inline@BBBB[ A=1] op {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@BBBBop {vCCCC .. vNNNN}, type@BBBB
where |
|
| 3rms | op {vCCCC .. vNNNN}, vtaboff@BBBB
where |
suggested format for statically linkedinvoke-virtual and invoke-super instructions of format 3rc |
|
| 3rmi | op {vCCCC .. vNNNN}, inline@BBBB
where |
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 - 指令格式的更多相关文章
- Aoite 系列(02) - 超动感的 Ioc 容器
Aoite 系列(02) - 超动感的 Ioc 容器 Aoite 是一个适于任何 .Net Framework 4.0+ 项目的快速开发整体解决方案.Aoite.Ioc 是一套解决依赖的最佳实践. 说 ...
- SAP接口编程 之 JCo3.0系列(02) : JCo Client Programming
SAP接口编程 之 JCo3.0系列(02) : JCo Client Programming 字数545 阅读52 评论0 喜欢1 JCo3.0调用SAP函数的过程 大致可以总结为以下步骤: 连接至 ...
- Java 之 I/O 系列 02 ——序列化(二)
Java 之 I/O 系列 目录 Java 之 I/O 系列 01 ——基础 Java 之 I/O 系列 02 ——序列化(一) Java 之 I/O 系列 02 ——序列化(二) 继续上篇的第二个问 ...
- Java 之 I/O 系列 02 ——序列化(一)
Java 之 I/O 系列 目录 Java 之 I/O 系列 01 ——基础 Java 之 I/O 系列 02 ——序列化(一) Java 之 I/O 系列 02 ——序列化(二) 一 序列化概述 序 ...
- Java 集合系列 02 Collection架构
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括InputStream)
我们以ByteArrayInputStream,拉开对字节类型的“输入流”的学习序幕.本章,我们会先对ByteArrayInputStream进行介绍,然后深入了解一下它的源码,最后通过示例来掌握它的 ...
- JavaScript进阶系列02,函数作为参数以及在数组中的应用
有时候,把函数作为参数可以让代码更简洁. var calculator = { calculate: function(x, y, fn) { return fn(x, y); } }; var su ...
- 委托、Lambda表达式、事件系列02,什么时候该用委托
假设要找出整型集合中小于5的数. static void Main(string[] args) { IEnumerable<int> source = new List<int&g ...
- php从入门到放弃系列-02.php基础语法
php从入门到放弃系列-02.php基础语法 一.学习语法,从hello world开始 PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器&qu ...
随机推荐
- Saddest's polar bear Pizza offered new YorkShire home
Saddest:adj,可悲的,悲哀的,polar,两级的,极地额,YorkShire,约克郡 A UK wildlife park has confirmed that it is offering ...
- spring retry 使用
1. 场景 系统方法调用时无状态的,同时因为网络原因,或者系统暂时故障,进行的重试 2. maven 依赖 <project xmlns="http://maven.apa ...
- java 8 原版 api 下载地址,
http://download.oracle.com/otn-pub/java/javafx/8.0.25-b17/javafx-8u25-apidocs.zip?AuthParam=14174994 ...
- UICollectionView的使用
感谢下面文章作者的无私奉献 基础用法: http://www.cnblogs.com/ios8/p/iOS-UICollectionView.html http://my.oschina.net/jo ...
- myeclipse构建webservice项目
新建server端 1 创建Web Service Project项目 2.项目名称:HelloWorldServer 3.创建接口类 4.发布 选择项目名称,选择从Java类中构建web servi ...
- 承接Hololens内容定制外包
近日,微软宣布第三批微软Hololens开发者版开始发货,包括:头显.头显手提包和一个遥控器.前两批开发者版本分别在今年3月30日和5月9日开始发货的. 第三批AR头显Hololens开发者版发货 虽 ...
- Intellij IDEA +MAVEN+Jetty实现SpringMVC简单查询功能
利用 Intellij IDEA +MAVEN+Jetty实现SpringMVC读取数据库数据并显示在页面上的简单功能 1 新建maven项目,配置pom.xml <project xmlns= ...
- C#矩阵运算类库
这个类库是本人参考许多相关资料之后做出的C#矩阵运算类库,因为C#的数值计算库相对比较少,所以希望这个类库能够给大家带来一些帮助. 源码github网址:https://github.com/Josh ...
- shape--用代码修改shape的颜色属性
Android里面经常会使用shape来定制一些View的背景,可以修改View的背景颜色,形状等属性 一般情况下,shape都是在xml文件里面写死了,今天遇到一个需求,View的形状是圆角的,但是 ...
- IOS ScrollView放大缩小点击位置并居中
项目中的一个优化案例,提升用户体验,对地铁线路图点击放大.缩小,并且点击位置居中: 正常ScrollView 我们点击某一点比如屏幕右侧,想要点的位置向左移动到中心位置,很简单只有算出该点位置距中心位 ...