要分析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)