要分析Dalvik虛擬機運行,就先要了解Davlik指令,瞭解Davlik指令之前又要先懂得指令的格式,這樣在代碼裏看到指令時,就會知道這條指令是幹什麼用了。在Dalvik虛擬機的目錄下面有這樣一份文檔,如下:

1、關於指令的位描述

關於每個指令位的佈局情況,約定:

  • 每16位的字採用空格分隔開來。
  • 每個字母表示四位,每個字母按順序從高節開始,排列到低字節。每四位之間可能使用豎線(|)來表示不同的內容,提高對指令的可讀性。
  • 採用大寫字母A、B等來表示四位操作碼,op來表示八位操作碼。
  • 0來表示這字段所有位為0值。

以指令格式為“B|A|op CCCC”為例:
因為中間有空格分隔,每個分開的表示16位字,所以表示這條指令有兩個16位的字組成。第一個16位是“B|A|op”,高字節由B和A組成,低字節由操作碼op組成。第二個16位是由CCCC組成,它表示一個16位的值。

2、指令格式的標識

關於指令的格式編碼,約定:

  • 指令的格式編碼是由三個字符組成,前兩個是數字,最後一個是字母。
  • 第一個數字是表示有多少個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

沒有另外數據。

3、語法説明

關於描述指令的工作過程,約定:

  • 每條指令從操作碼開始,接着緊跟後面的參數,參數的個數是不定的,每個參數使用逗號分開。
  • 使用一個字母表示4位。
  • 當一個參數是寄存器表示時,採用“vX”的方式,這裏採用v而不採用r是避免與代碼裏表示有衝突。
  • 當參數是一個常量數字時用“#+X”的方式表示。
  • 當參數是訪問相對地址時用“+X”的方式表示。
  • 當參數是常量池索引時用“kind@X”的方式表示,其中kind表示哪一個常量池被使用。

登錄為: 讀者 (reader)