本頁列出了 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,#+BBBB0000op vAA,#+BBBB000000000000 | ||
21c | op vAA,輸入@BBBBop vAA,field@BBBBop vAA,method_handle@BBBBop vAA,原型@BBBBop 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、類型@CCCCop 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-virtual 和invoke-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-static 和invoke-virtual 指令的建議格式 | |
AA| BBBB CCCC操作 | 3rc | op {vCCCC .. vNNNN},meth@BBBBop {vCCCC .. vNNNN},site@BBBBop {vCCCC .. vNNNN},輸入@BBBB其中 | |
3均方根 | op {vCCCC .. vNNNN},vtaboff@BBBB其中 | 格式3rc 的靜態連結invoke-virtual 和invoke-super 指令的建議格式 | |
3r米 | op {vCCCC .. vNNNN},內聯@BBBB其中 | 格式 3rc 的內嵌連結invoke-static 和invoke-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其中 | 呼叫多態/範圍 |
AA| op BBBB lo BBBB BBBB BBBB hi | 51公升 | op vAA,#+BBBBBBBBBBBBBBBB | 常量範圍 |