Dalvik技術揭祕之四-Dalvik虛擬機的指令格式

在分析Dalvik虛擬機運行之前,先要了解Davlik指令,但是瞭解Davlik指令之前又要先懂得指令的格式,才能看得懂指令是怎麼樣構成,怎麼樣表達,怎麼樣查看,下面就來仔細地學習指令格式,這樣在代碼裏看到指令時,就會很自然而然知道這條指令是幹什麼用了。在Dalvik虛擬機的目錄下面有這樣一份文檔,我們來仔細學習它,如下:


本文描述了在Dalvik虛擬機裏字節碼的指令格式,這種指令格式是使用在另一個文檔《指令字節碼參考》文檔裏。


指令的位描述


下表第一列裏說明了每個指令位的佈局情況,每16位的字採用空格分隔開來,每個字母表示四位,每個字母按順序從高節開始,排列到低字節。每四位之間可能使用豎線(|)來表示不同的內容,提高對指令的可讀性。採用大寫字母AB等來表示每四位意義,op來表示八位操作碼,0來表示這字段所有位爲0值。


比如指令格式爲“BAopCCCC”,就是表示這條指令有兩個16位的字組成,因爲中間有空格分隔,每個分開的表示16位字。第一個16位,就是“BAop”,高字節由BA組成,低字節由操作碼op組成。第二個16位是由CCCC組成,它是表示一個16位的值。


指令格式的標識


下表第二列裏是指令的格式編碼,它用在別的文檔和代碼裏來說明指令的格式。指令的格式編碼是由三個字符組成,前兩個是數字,最後一個是字母。第一個數字是表示有多少個16位的字組成這條指令。第二個數字是表示這條指令最多使用多少個寄存器。最後一個字母表示指令另外的數據處理。比如“21t”格式就是表示有兩個16位字組成,使用一個寄存器,t表示有一個分支。有可能後面添加一個字母s在後面,表示靜態連接。

下面表格式就定義了後面出現字母和相關含義:

字母

位數

意義

b

8

立即無符號字節。(byte

c

1632

常量池索引

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章