Dalvik 可執行指令格式

本頁列出了 Dalvik Executable 格式和 Dalvik 字節碼使用的指令格式。它旨在與字節碼參考文檔一起使用。

逐位描述

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

在大多數情況下,字母從較早的代碼單元到後面的代碼單元,在一個代碼單元內從低位到高位。但是,這個一般規則有一些例外,這樣做是為了使類似含義的部分的命名在不同的指令格式中是相同的。這些情況在格式描述中明確指出。

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

格式 ID

格式表中的第二列表示格式的短標識符,用於其他文檔和代碼中以標識格式。

大多數格式 ID 由三個字符組成,兩個數字後跟一個字母。第一個數字表示格式中 16 位代碼單元的數量。第二個數字表示格式包含的最大寄存器數量(最大,因為某些格式可以容納可變數量的寄存器),特殊名稱“ r ”表示對寄存器範圍進行編碼。最後一個字母半助記地指示由該格式編碼的任何額外數據的類型。例如,格式“ 21t ”的長度為 2,包含一個寄存器引用,另外還包含一個分支目標。

建議的靜態鏈接格式有一個額外的“ s ”後綴,總共四個字符。同樣,建議的“內聯”鏈接格式有一個額外的“ i ”後綴。 (在這種情況下,內聯鏈接類似於靜態鏈接,只是與機器的實現有更直接的聯繫。)最後,一些奇怪的建議格式(例如,“ 20bc ”)包括兩條數據,它們都以其格式 ID 表示.

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

助記符位大小意義
b 8立即簽署字節
C 16, 32恆定池指數
F 16接口常量(僅用於靜態鏈接格式)
H 16立即有符號h at (32 位或 64 位值的高位;低位全為0
一世32立即有符號int ,或 32 位浮點數
l 64立即有符號long或 64 位雙精度
16方法常量(僅用於靜態鏈接格式)
n 4立即簽名的小食
s 16立即
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
B|A|操作12倍op vA, vB
11n op vA,#+B
AA|操作11倍手術op
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,現場@BBBB
op vAA,method_handle@BBBB
op vAA,原型@BBBB
op vAA,字符串@BBBB
檢查演員
常量類
常量方法句柄
const 方法類型
常量字符串
AA|操作CC|BB 23x op vAA、vBB、vCC
22b op vAA、vBB、#+CC
B|A|操作CCCC 22噸op vA, vB, +CCCC
22s op vA, vB, #+CCCC
22c op vA, vB, type@CCCC
op vA, vB, 現場@CCCC
實例
22cs op vA, vB, fieldoff@CCCC格式 22c 的靜態鏈接字段訪問指令的建議格式
ØØ| op AAAA lo AAAA30噸op +AAAAAAA轉到/32
ØØ|操作AAAA BBBB 32x op vAAAA, vBBBB
AA| op BBBB lo BBBB31i op vAA,#+BBBBBBBB
31噸op vAA,+BBBBBBBB
31c op vAA,字符串@BBBBBBBB常量字符串/巨型
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}, 站點@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},站點@BBBB
op {vCCCC .. vNNNN},輸入@BBBB

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

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

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

格式為3rc的靜態鏈接invoke-virtualinvoke-super指令的建議格式
3rmi op {vCCCC .. vNNNN},內聯@BBBB

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

格式 3rc 的內聯鏈接invoke-staticinvoke-virtual指令的建議格式
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
調用多態
AA| op BBBB CCCC HHHH 4rcc op> {vCCCC .. vNNNN},meth@BBBB,proto@HHHH

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

調用多態/範圍
AA| op BBBB lo BBBB BBBB BBBB51升op vAA, #+BBBBBBBBBBBBBBBB常量範圍