本頁面列出 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, #+BBBB0000op vAA, #+BBBB000000000000
|
||
21c | op vAA, type@BBBBop vAA, field@BBBBop vAA, method_handle@BBBBop vAA, proto@BBBBop 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@CCCCop 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-virtual 和 invoke-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-static 和 invoke-virtual 指示語格式 35c |
|
AA|op BBBB CCCC | 3rc | op {vCCCC .. vNNNN}, meth@BBBBop {vCCCC .. vNNNN}, site@BBBBop {vCCCC .. vNNNN}, type@BBBB其中 |
|
3rms | op {vCCCC .. vNNNN}, vtaboff@BBBB其中 |
建議格式,適用於格式為 3rc 的靜態連結 invoke-virtual 和 invoke-super 指令
|
|
3rmi | op {vCCCC .. vNNNN}, inline@BBBB其中 |
建議格式:內嵌連結的 invoke-static 和 invoke-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
其中 |
invoke-polymorphic/range |
AA|op BBBBlo BBBB BBBB BBBBhi | 51l | op vAA, #+BBBBBBBBBBBBBBBB |
const-wide |