深入理解Android:Java虚拟机ART
上QQ阅读APP看书,第一时间看更新

3.3.1 insns的组织形式

由图3-8所示的code_item数据结构可知,函数的内容存储在insns数组里,该数组元素的类型是ushort,而ushort为两个字节长 这一点有别于Class文件中的code数组。在Class文件中,code数组内容是以byte为单位的。。那么这两个字节所包含的内容是如何组织的呢?来看图3-9。

图3-9 insns的组织形式

由图3-9可知:

·Dex指令码 指令码也叫操作码。的长度还是1个字节,所以指令码的个数不会超过255条。但是和Class指令码不同的是,Dex指令码与第一个参数混在一起构成了一个双字节元素存储在insns内。在这个双字节中,低8位才是指令码,高8位是参数。笔者称这种双字节元素为[参数+操作码组合]

·[参数+操作码组合]后的下一个ushort双字节元素可以是新一组的[参数+操作码组合],也可以是[纯参数组合]。

·参数组合的格式也有要求,不同的字符代表不同的参数,参数的比特位长度又是由字符的个数决定。比如AA表示一个参数,这个参数占8位,而其中每一个A都代表4位比特长。

提示 关于图3-9中的参数格式,根据官方文档,下面几点内容需要读者了解。

(1)不同的字符代表不同的参数,比如A、B、C代表三个不同的参数。

(2)参数的长度由对应字符的个数决定,1个字符占据4个比特。比如:A表示一个占4比特的参数,AA代表一个占8比特的参数,AAAA代表一个16比特长的参数。

(3)代表一个特殊的参数,该参数取值为0。比如øø表示这样一个参数,这个参数长度。为8位,每位的取值都是0。