简介

该文档描述了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.

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

b8signed byte立即数
c16, 32常量池索引
f16接口常量 (只用于静态链接的格式)
h16signed hat立即数 (hat是32位或者64位数据的高位,这些数据的低位全部为0)
i32signed int或者32-bit float立即数
l64signed long或者64-bit double立即数
m16方法常量 (只用于静态链接的格式)
n4signed nibble立即数
s16signed short立即数
t8, 16, 32分支目标,用于转移指令goto等
x0没有附加数据

语法

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

每个参数对应第一列的一个字段,与第一列类似,字母每重复一次,代表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]

格式描述表

N/A00xN/A用于未使用的操作码的伪格式; 建议用作用作断点操作码的名义格式
ØØ|op10xop 
B|A|op12xop vA, vB 
11nop vA, #+B 
AA|op11xop vAA 
10top +AAgoto
ØØ|op AAAA20top +AAAAgoto/16
AA|op BBBB20bcop AA, kind@BBBBsuggested 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 BBBB22xop vAA, vBBBB 
21top vAA, +BBBB 
21sop vAA, #+BBBB 
21hop vAA, #+BBBB0000
op vAA, #+BBBB000000000000
 
21cop vAA, type@BBBB
op vAA, field@BBBB
op vAA, string@BBBB
check-cast
const-class
const-string
AA|opCC|BB23xop vAA, vBB, vCC 
22bop vAA, vBB, #+CC 
B|A|opCCCC22top vA, vB, +CCCC 
22sop vA, vB, #+CCCC 
22cop vA, vB, type@CCCC
op vA, vB, field@CCCC
instance-of
22csop vA, vB, fieldoff@CCCCsuggested format for statically linked field access instructions of format 22c
ØØ|opAAAAAAAA30top +AAAAAAAAgoto/32
ØØ|opAAAA BBBB32xop vAAAA, vBBBB 
AA|opBBBBBBBB31iop vAA, #+BBBBBBBB 
31top vAA, +BBBBBBBB 
31cop vAA, string@BBBBBBBBconst-string/jumbo
A|G|opBBBB F|E|D|C35c[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 CCCC3rcop {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

 
3rmsop {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
3rmiop {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|opBBBBBBBB BBBB BBBB51lop vAA, #+BBBBBBBBBBBBBBBBconst-wide
05-11 15:25
查看更多