您的位置:首页 > 移动开发 > Android开发

Android培训班(59)Dalvik虚拟机的指令格式

2011-07-10 10:00 197 查看
在分析Dalvik虚拟机运行之前,先要了解Davlik指令,但是了解Davlik指令之前又要先懂得指令的格式,才能看得懂指令是怎么样构成,怎么样表达,怎么样查看,下面就来仔细地学习指令格式,这样在代码里看到指令时,就会很自然而然知道这条指令是干什么用了。在Dalvik虚拟机的目录下面有这样一份文档,我们来仔细学习它,如下:

本文描述了在Dalvik虚拟机里字节码的指令格式,这种指令格式是使用在另一个文档《指令字节码参考》文档里。

指令的位描述

下表第一列里说明了每个指令位的布局情况,每16位的字采用空格分隔开来,每个字母表示四位,每个字母按顺序从高节开始,排列到低字节。每四位之间可能使用竖线(|)来表示不同的内容,提高对指令的可读性。采用大写字母A、B等来表示每四位意义,op来表示八位操作码,0来表示这字段所有位为0值。

比如指令格式为“B|A|opCCCC”,就是表示这条指令有两个16位的字组成,因为中间有空格分隔,每个分开的表示16位字。第一个16位,就是“B|A|op”,高字节由B和A组成,低字节由操作码op组成。第二个16位是由CCCC组成,它是表示一个16位的值。

指令格式的标识

下表第二列里是指令的格式编码,它用在别的文档和代码里来说明指令的格式。指令的格式编码是由三个字符组成,前两个是数字,最后一个是字母。第一个数字是表示有多少个16位的字组成这条指令。第二个数字是表示这条指令最多使用多少个寄存器。最后一个字母表示指令另外的数据处理。比如“21t”格式就是表示有两个16位字组成,使用一个寄存器,t表示有一个分支。有可能后面添加一个字母s在后面,表示静态连接。

下面表格式就定义了后面出现字母和相关含义:

字母

位数

意义

b

8

立即无符号字节。(byte)

c

16,32

常量池索引

f

16

接口常量

h

16

表示高位上的值。

i

32

立即无符号整数,或32位浮点数。

l

64

立即无符号长整数,或者64位双精度浮点数。

m

16

方法常量。

n

4

立即无符号半字节数。

s

16

立即无符号短整数。

t

8,16,32

跳转,分支。

x

0

没有另外数据。

语法说明

在下表第三列里使用人们熟悉的语法来描述指令的工作过程。每条指令从操作码开始,接着紧跟后面的参数,参数的个数是不定的,每个参数使用逗号分开。无论在第一列里那一个字段,如果使用4位来表达的字母,在这里也是采用这样的方法的。比如8位在第一列里表示为“BB”,那么在语法说明里也是采用“BB”的方式来说明。当一个参数是寄存器表示时,采用“vX”的方式,这里采用v而不采用r是避免与代码里表示有冲突。

当参数是一个常量数字时表示为“#+X”方式,当参数是访问相对地址表示为“+X”方式,当参数是表法常量池索引表示为“kind@X”方式,其中kind表示那一个常量池被使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: