在分析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表示那一個常量池被使用。