简介
该⽂档描述了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]
格式描述表
格式ID语法Notable Opcodes Covered
N/A00x N/A⽤于未使⽤的操作码的伪格式; 建议⽤作⽤作断点操作码的名义
格式
ØØ|op10x op
B|A|op 12x op vA, vB 11n op vA, #+B
AA|op 11x op vAA
10t op +AA goto
ØØ|op AAAA20t op +AAAA goto/16
AA|op BBBB20bc 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|op CC|BB 23x op vAA, vBB, vCC 22b op vAA, vBB, #+CC
B|A|op CCCC 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
ØØ|op AAAA lo AAAA hi30t op +AAAAAAAA goto/32ØØ|op AAAA BBBB32x op vAAAA, vBBBB
AA|op BBBB lo BBBB hi 31i op vAA, #+BBBBBBBB
31t op vAA, +BBBBBBBB
kyx
31c op vAA, string@BBBBBBBB const-string/jumbo
A|G|op BBBB 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
suggested format for statically linked invoke-virtual and invoke-
super instructions of format 35c
desire to make the count and the reference index have the same label as in format 3rms.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|op BBBB CCCC
3rc
op {vCCCC .. vNNNN}, meth@BBBB op {vCCCC .. vNNNN}, type@BBBB
where NNNN = CCCC+AA-1, that is A determines the count 0..255, and C determines the first register
3rms op {vCCCC .. vNNNN}, vtaboff@BBBB
where NNNN = CCCC+AA-1, that is A determines
the count 0..255, and C determines the first register
suggested format for statically linked invoke-virtual and invoke-super instructions of format 3rc
3rmi op {vCCCC .. vNNNN}, inline@BBBB
where NNNN = CCCC+AA-1, that is A 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|op BBBB lo BBBB BBBB BBBB hi
51l
op vAA, #+BBBBBBBBBBBBBBBB
const-wide
格式手机镜片
ID
语法
Notable Opcodes Covered