Dalvik 可執行指令格式

本頁列出了 Dalvik 執行檔 (DEX) 格式和 Dalvik 字節碼所使用的指令格式。它旨在與字節碼參考文件結合使用。

按位描述

格式表中的第一列列出了格式的位元版面配置。它由一個或多個空格分隔的「字」組成,每個字描述一個 16 位元代碼單元。字中的每個字元代表四位,從高位到低位讀取,中間散佈垂直線(“ | ”)以幫助閱讀。從「 A 」開始依序排列的大寫字母用於指示格式中的欄位(然後由語法列進一步定義)。術語“ op ”用於指示格式中八位操作碼的位置。斜線零(“ Ø ”)用於指示指示位置中的所有位元都必須為零。

在大多數情況下,字母從較早的代碼單元到較晚的代碼單元,並且在代碼單元內從低位到高位。然而,這個一般規則有一些例外,這樣做是為了讓不同指令格式中相似意義部分的命名相同。這些情況在格式描述中明確註明。

例如,格式「 B|A| op CCCC 」表示該格式由兩個16位元代碼單元組成。第一個字由低八位元的操作碼和高八位元的一對四位值組成;第二個字由單一 16 位元值組成。

格式化 ID

格式表中的第二列表示該格式的短標識符,在其他文件和程式碼中使用它來標識該格式。

大多數格式 ID 由三個字元、兩個數字和一個字母組成。第一個數字表示格式中 16 位元代碼單元的數量。第二個數字表示該格式包含的暫存器的最大數量(最大,因為某些格式可以容納可變數量的暫存器),特殊名稱「 r 」表示對一系列暫存器進行編碼。最後一個字母半助記符指示由該格式編碼的任何額外資料的類型。例如,格式「 21t 」的長度為二,包含一個暫存器引用,並且還包含一個分支目標。

建議的靜態連結格式有一個額外的「 s 」後綴,使它們總共有四個字元。類似地,建議的「內嵌」連結格式具有附加的「 i 」後綴。 (在這種情況下,內聯鏈接就像靜態鏈接,除了與機器的實現有更直接的聯繫。)最後,一些奇怪的建議格式(例如“ 20bc ”)包括兩條數據,它們都以其格式ID 表示。

類型代碼字母的完整清單如下。請注意,某些表格具有不同的大小,具體取決於格式:

助記符位元尺寸意義
8立即簽名字節
C 16, 32常量池索引
F 16介面常數(僅用於靜態連結格式)
H 16立即有符號h at (32 位元或 64 位元值的高位元;低位元皆為0
32立即有符號int ,或 32 位元浮點數
64立即有符號整型,或 64 位元雙精確度
16 m方法常數(僅用於靜態連結格式)
n 4立即簽名n ibble
s 16立即簽署簡短
t 8、16、32分支目標
X 0沒有附加數據

句法

格式表的第三列指示使用指示格式的指令的面向人類的語法。每條指令都以指定的操作碼開頭,並且可以選擇後面跟著一個或多個參數,參數本身以逗號分隔。

無論參數引用第一列中的字段,該字段的字母都會在語法中指示,該字段的每四位重複一次。例如,第一列中標記為「 BB 」的八位元欄位在語法列中也會標記為「 BB 」。

命名暫存器的參數的形式為“ v X ”。選擇前綴“ v ”而不是更常見的“ r ”,正是為了避免與可能實現 Dalvik 可執行文件格式的(非虛擬)體系結構發生衝突,這些體系結構本身使用前綴“ r ”作為其寄存器。 (也就是說,這個決定使得可以同時討論虛擬寄存器和真實寄存器,而無需迂迴。)

指示文字值的參數具有「 #+ X 」的形式。某些格式指示其高位中僅包含非零位的文字;對於這些,零在語法中明確表示,即使它們沒有出現在位元表示中。

指示相對指令位址偏移量的參數具有「 + X 」的形式。

指示文字常數池索引的參數具有「 kind @ X 」的形式,其中「 kind 」指示正在引用哪個常數池。使用這種格式的每個操作碼都明確地只允許一種常數;請參閱操作碼參考來找出對應關係。常數池的種類有「 string 」(字串池索引)、「 type 」(類型池索引)、「 field 」(欄位池索引)、「 meth 」(方法池索引)和「 site 」(呼叫網站索引) )。

與常數池索引的表示類似,也有指示預連結偏移量或索引的建議(可選)形式。建議的預連結值有兩種:vtable 偏移量(表示為「 vtaboff 」)和欄位偏移量(表示為「 fieldoff 」)。

在格式值不是語法的明確部分而是選擇變體的情況下,每個變體都以前綴“ [ X = N ] ”列出(例如,“ [A=2] ”)以指示對應關係。

格式

格式ID句法涵蓋的著名操作碼
不適用00x N/A用於未使用的操作碼的偽格式;建議用作斷點操作碼的名義格式
ØØ|操作10倍op
乙|甲|操作12x op vA, vB
11n op vA,#+B
AA|操作11x op VAA
10噸op +AA
ØØ|操作AAAA 20噸op +AAAA轉到/16
AA| BBBB西元前20年op AA,善良@BBBB靜態確定的驗證錯誤的建議格式; A 是錯誤類型,B 是類型適當資料表的索引(例如,無此類方法錯誤的方法參考)
AA| BBBB 22x op vAA, vBBBB
21噸op vAA, +BBBB
21秒op vAA,#+BBBB
21小時op vAA,#+BBBB0000
op vAA,#+BBBB000000000000
21c op vAA,輸入@BBBB
op vAA,field@BBBB
op vAA,method_handle@BBBB
op vAA,原型@BBBB
op vAA,字串@BBBB
支票投送
常量類
const 方法句柄
const 方法類型
常數字串
AA|操作CC|BB 23x op VAA、VBB、VCC
22b op vAA、vBB、#+CC
乙|甲|中交22噸op vA, vB, +CCCC
22秒op vA, vB, #+CCCC
22c op vA、vB、類型@CCCC
op vA、vB、field@CCCC
實例
22cs op vA, vB, fieldoff@CCCC格式 22c 的靜態連結欄位存取指令的建議格式
ØØ| op AAAA lo AAAA hi 30噸op +AAAAAAAAA轉到/32
ØØ|操作AAAA BBBB 32x op vAAAA, vBBBB
AA| op BBBB lo BBBB hi 31i op vAA,#+BBBBBBBB
31噸op vAA, +BBBBBBBB
31c op vAA,字串@BBBBBBBB常數字串/巨型
一個|G|操作BBBB F|E|D|C 35℃ [ A=5 ] op {vC, vD, vE, vF, vG}, meth@BBBB
[ A=5 ] op {vC, vD, vE, vF, vG}, site@BBBB
[ A=5 ] op {vC, vD, vE, vF, vG},類型@BBBB
[ A=4 ] op {vC,vD,vE,vF}, kind @BBBB
[ A=3 ] op {vC, vD, vE}, kind @BBBB
[ A=2 ] op {vC, vD}, kind @BBBB
[ A=1 ] op {vC}, kind @BBBB
[ A=0 ] op {}, kind @BBBB

這裡字母的不尋常選擇反映了使計數和參考索引具有與格式 3rc 中相同的標籤的願望。

35毫秒[ A=5 ] op {vC, vD, vE, vF, vG}, vtaboff@BBBB
[ A=4 ] op {vC, vD, vE, vF}, vtaboff@BBBB
[ A=3 ] op {vC, vD, vE}, vtaboff@BBBB
[ A=2 ] op {vC, vD}, vtaboff@BBBB
[ A=1 ] op {vC}, vtaboff@BBBB

這裡字母的不尋常選擇反映了使計數和參考索引具有與 3rms 格式相同的標籤的願望。

格式 35c 的靜態連結invoke-virtualinvoke-super指令的建議格式
35英里[ A=5 ] op {vC, vD, vE, vF, vG}, 內聯@BBBB
[ A=4 ] op {vC, vD, vE, vF}, 內聯@BBBB
[ A=3 ] op {vC, vD, vE}, 內嵌@BBBB
[ A=2 ] op {vC, vD},內聯@BBBB
[ A=1 ] op {vC},內聯@BBBB

這裡字母的不尋常選擇反映了使計數和參考索引具有與格式 3rmi 相同的標籤的願望。

格式 35c 的內嵌連結invoke-staticinvoke-virtual指令的建議格式
AA| BBBB CCCC操作3rc op {vCCCC .. vNNNN},meth@BBBB
op {vCCCC .. vNNNN},site@BBBB
op {vCCCC .. vNNNN},輸入@BBBB

其中NNNN = CCCC+AA-1 ,即A確定計數0..255C確定第一個暫存器

3均方根op {vCCCC .. vNNNN},vtaboff@BBBB

其中NNNN = CCCC+AA-1 ,即A確定計數0..255C確定第一個暫存器

格式3rc的靜態連結invoke-virtualinvoke-super指令的建議格式
3r米op {vCCCC .. vNNNN},內聯@BBBB

其中NNNN = CCCC+AA-1 ,即A確定計數0..255C確定第一個暫存器

格式 3rc 的內嵌連結invoke-staticinvoke-virtual指令的建議格式
一個|G| op BBBB F|E|D|C HHHH 45cc [ A=5 ] op {vC, vD, vE, vF, vG}, meth@BBBB, proto@HHHH
[ A=4 ] op {vC, vD, vE, vF}, meth@BBBB, proto@HHHH
[ A=3 ] op {vC, vD, vE}, meth@BBBB, proto@HHHH
[ A=2 ] op {vC, vD}, meth@BBBB, proto@HHHH
[ A=1 ] op {vC},meth@BBBB,proto@HHHH
呼叫多型
AA| BBBB CCCC HHHH 4rcc op> {vCCCC .. vNNNN},meth@BBBB,proto@HHHH

其中NNNN = CCCC+AA-1 ,即A確定計數0..255C確定第一個暫存器

呼叫多態/範圍
AA| op BBBB lo BBBB BBBB BBBB hi 51公升op vAA,#+BBBBBBBBBBBBBBBB常量範圍