Dalvik 可執行指示格式

本頁面列出 Dalvik 執行檔 (DEX) 格式和 Dalvik 位元碼所使用的指令格式。這份文件應與字節碼參考文件搭配使用。

位元說明

格式表格的第一欄會列出格式的位元版面配置。它包含一或多個以空格分隔的「字詞」,每個字詞都會描述一個 16 位元程式碼單元。字詞中的每個字元都代表四個位元,從高位元讀取至低位元,並穿插垂直條 (「|」) 以利閱讀。從「A」開始的字母序列,用於表示格式中的欄位 (後續會透過語法欄進一步定義)。「op」一詞用於表示格式中八位元操作碼的位置。零加上刪除線 (Ø) 表示在指定位置的所有位元都必須為零。

在大多數情況下,字母會從較早的程式碼單元開始,依序往後推,並在程式碼單元內從低位元往高位元推進。不過,這項一般規則有一些例外狀況,這是為了讓不同指令格式中同義部分的命名方式一致。這些情況會在格式說明中明確指出。

舉例來說,格式「B|A|op CCCC」表示格式包含兩個 16 位元代碼單位。第一個字組包含低位元八位元中的 Opcode,以及高位元八位元中的一組四位元值;第二個字組則包含單一 16 位元值。

格式 ID

格式表中的第二欄會顯示格式的短 ID,用於其他文件和程式碼中識別格式。

大多數格式 ID 包含三個字元,兩位數字後面接著一個英文字母。第一碼代表格式中 16 位元代碼單位的數量。第二個數字表示格式所含的暫存器數量上限 (由於某些格式可容納可變數量的暫存器,因此為上限),其中特殊指定的「r」表示已編碼的暫存器範圍。最後一個字母的半記憶法則會指出格式所編碼的任何額外資料類型。舉例來說,格式「21t」的長度為 2,包含一個註冊參照,並且還包含分支目標。

建議的靜態連結格式會加上「s」字尾,總共四個字元。同樣地,建議的「內嵌」連結格式會加上「i」後綴。(在這個情況下,內嵌連結就像靜態連結,但與機器實作連結得更為直接)。最後,我們提供幾個建議的特殊格式 (例如「20bc」) 包含兩個資料,兩者皆以格式 ID 表示。

以下是型別代碼字母的完整清單。請注意,某些表單的大小會因格式而異:

助憶鍵 位元大小 意義
b 8 立即簽署的 byte
c 16、32 constant 集區索引
f 鍵 16 interface 常數 (僅用於靜態連結格式)
小時 16 立即簽署的 hat (32 或 64 位元值的高位元位元;低位元位元全為 0)
i 32 立即有符號 int 或 32 位元浮點
l 鍵 64 帶正負號的立即值 long,或 64 位元雙精度
分鐘 16 method 常數 (僅用於靜態連結格式)
n 4 立即簽署的 nibble
16 立即簽署的 short
t 8、16、32 分支版本 target
x 0 沒有其他資料

語法

格式表的第三欄會指出使用指定格式的指令,其人性化語法。每個指令都以命名的 Opcode 開頭,並可視需要在後方加上一或多個以半形逗號分隔的引數。

每當引數參照第一欄的欄位時,語法中會顯示該欄位的字母,每四個欄位重複一次。舉例來說,第一欄中標示為「BB」的八位元欄位,在語法欄中也會標示為「BB」。

命名為「vX」的引數會採用「vX」格式。我們選擇使用「v」前置字串,而非較常見的「r」,是為了避免與 (非虛擬) 架構發生衝突,因為這些架構可能會實作 Dalvik 可執行格式,而這些架構本身會在其註冊機制中使用「r」前置字串。(也就是說,這個決定可讓您同時討論虛擬和實際的註冊器,不必拐彎抹角地表達意思)。

表示文字值的引數格式為「#+X」。某些格式會指出文字常值只在高階位元中含有非零位元;對於這些格式,語法會明確表示零,即使位元表示法中沒有零也一樣。

表示相對指令位址偏移的引數格式為「+X」。

表示文字常數集索引的引數格式為「kind@X」,其中「kind」表示所參照的常數集。每個明確使用此格式的運算碼只允許一種常數,請參閱運算碼參考資料,瞭解兩者之間的對應關係。常數集區的類型包括「string」(字串集區索引)、「type」(型別集區索引)、「field」(欄位集區索引)、「meth」(方法集區索引) 和「site」(呼叫位置索引)。

與常數集區索引的表示方式類似,建議的 (選用) 形式也能指出預先連結的偏移量或索引。建議的預先連結值有兩種:vtable 偏移值 (以「vtaboff」表示) 和欄位偏移值 (以「fieldoff」表示)。

如果格式值並非語法中明確的部分,而是選取變化版本,則每個變化版本都會加上前置字串「[X=N]」(例如 「[A=2]」) 來表示對應關係。

格式

格式 ID 語法 涵蓋的著名 Opcode
不適用 00x N/A 用於未使用的 Opcode 的擬似格式;建議用於做為中斷點 Opcode 的標準格式
ØØ|op 10 倍 op  
B|A|op 12 倍 op vA、vB  
11n op vA, #+B  
AA|op 11 倍 op vAA  
10t op +AA goto
ØØ|op AAAA 20t op +AAAA goto/16
AA|op BBBB 20bc op AA,kind@BBBB 建議的靜態驗證錯誤格式;A 是錯誤類型,B 是適當類型表格的索引 (例如,沒有此方法錯誤的參照方法)
AA|op BBBB 22 倍 op vAA、vBBBB  
21t op vAA, +BBBB  
21 秒 op vAA, #+BBBB  
21 小時 op vAA, #+BBBB0000
op vAA, #+BBBB000000000000
 
21c op vAA, type@BBBB
op vAA, field@BBBB
op vAA, method_handle@BBBB
op vAA, proto@BBBB
op vAA, string@BBBB
check-cast
const-class
const-method-handle
const-method-type
const-string
AA|op CC|BB 23 倍 op vAA、vBB、vCC  
22b op vAA、vBB、#+CC  
B|A|op CCCC 22t op vA、vB、+CCCC  
22 秒 op vA、vB、#+CCCC  
22c op vA、vB、type@CCCC
op vA、vB、field@CCCC
instance-of
22cs op vA、vB、fieldoff@CCCC 格式 22c 的靜態連結欄位存取指令建議格式
ØØ|op AAAAlo AAAAhi 30t op +AAAAAAAA goto/32
ØØ|op AAAA BBBB 32 倍 op vAAAA、vBBBB  
AA|op BBBBlo BBBBhi 31i op vAA, #+BBBBBBBB  
31t op vAA, +BBBBBBBB  
31c op vAA, string@BBBBBBBB const-string/jumbo
A|G|op BBBB F|E|D|C 35c [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}, type@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}, inline@BBBB
[A=4] op {vC, vD, vE, vF}, inline@BBBB
[A=3] op {vC, vD, vE}, inline@BBBB
[A=3] op {vC, vD, vE}, inline@BBBB
[A=2] op {vC, vD}, inline@BBBB
[A=1] op
{vC}, inline@BBBB

這裡的字母選擇不尋常,反映出我們希望計數和參照索引的標籤與 3rmi 格式相同。

建議格式:內嵌連結的 invoke-staticinvoke-virtual 指示語格式 35c
AA|op BBBB CCCC 3rc op {vCCCC .. vNNNN}, meth@BBBB
op {vCCCC .. vNNNN}, site@BBBB
op {vCCCC .. vNNNN}, type@BBBB

其中 NNNN = CCCC+AA-1,即 A 決定計數 0..255,而 C 則決定第一個註冊

 
3rms op {vCCCC .. vNNNN}, vtaboff@BBBB

其中 NNNN = CCCC+AA-1,即 A 決定計數 0..255,而 C 則決定第一個註冊

建議格式,適用於格式為 3rc 的靜態連結 invoke-virtualinvoke-super 指令
3rmi op {vCCCC .. vNNNN}, inline@BBBB

其中 NNNN = CCCC+AA-1,即 A 決定計數 0..255,而 C 則決定第一個註冊

建議格式:內嵌連結的 invoke-staticinvoke-virtual 指令,格式為 3rc
A|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
invoke-polymorphic
AA|op BBBB CCCC HHHH 4rcc op> {vCCCC .. vNNNN}, meth@BBBB, proto@HHHH

其中 NNNN = CCCC+AA-1,即 A 決定計數 0..255,而 C 則決定第一個註冊

invoke-polymorphic/range
AA|op BBBBlo BBBB BBBB BBBBhi 51l op vAA, #+BBBBBBBBBBBBBBBB const-wide