Google致力於提高黑人社區的種族平等。 怎麼看。
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

Dalvik可執行指令格式

該頁面列出了Dalvik可執行格式和Dalvik字節碼使用的指令格式。它旨在與字節碼參考文檔一起使用。

按位描述

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

在大多數情況下,刻字從較早的代碼單元到較晚的代碼單元,以及在一個代碼單元內從低位到高位。但是,此通用規則有一些例外,可以這樣做,以使含義相同的部分的命名在不同的指令格式之間相同。這些情況在格式說明中明確指出。

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

格式編號

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

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

建議的靜態鏈接格式具有附加的“ s ”後綴,使其總共四個字符。同樣,建議的“內聯”鏈接格式具有附加的“ i ”後綴。 (在這種情況下,內聯鏈接就像靜態鏈接一樣,不同之處在於與機器的實現之間有更直接的聯繫。)最後,一對奇怪的建議格式(例如“ 20bc ”)包括兩段數據,均以其格式ID表示。

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

助記符位大小含義
b 8 立即簽名b。YTE
C 16、32 çonstant池索引
F 16 ˚F王牌常數(僅在靜態鏈接格式使用)
H 16 立即有符號h at(32或64位值的高位;低位均為0
一世 32 立即簽名 NT,或32位浮點
64 立即簽署翁,或64位雙
16 ethod常數(僅在靜態鏈接格式使用)
ñ 4 立即簽署ñibble
s 16 立即簽名短褲
Ť 8、16、32 旁路T ARGET
X 0 沒有其他數據

句法

格式表的第三列指示使用指示格式的指令的面向人的語法。每條指令均以命名的操作碼開頭,並可選地後面跟一個或多個參數,它們之間以逗號分隔。

無論自變量引用第一列中的某個字段,該字段的字母都會在語法中指出,並對該字段的每四位重複一次。例如,在第一列中標記為“ BB ”的八位字段在語法列中也將標記為“ BB ”。

命名寄存器的參數的格式為“ v X ”。選擇前綴“ v ”而不是更常見的“ r ”是為了避免與(非虛擬的)體系結構相衝突,在該體系結構上可能會實現Dalvik可執行格式,而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 vAA
10噸 op + AA
ØØ| 行動 AAAA 20噸 op + AAAA 轉到/ 16
AA | BBBB 20bc op AA,kind @ BBBB 靜態確定的驗證錯誤的建議格式; A是錯誤的類型,而B是指向適合類型的表的索引(例如,針對此類方法錯誤的方法引用)
AA | BBBB 22倍 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,proto @ BBBB
op vAA,字符串@BBBB
檢查廣播
const類
const方法句柄
const方法類型
常量字符串
AA | op CC | BB 23倍 op vAA,vBB,vCC
22b op vAA,vBB,#+ CC
B | A | CCCC 22噸 op vA,vB,+ CCCC
22秒 op vA,vB,#+ CCCC
22c op vA,vB,type @ CCCC
op vA,vB,field @ CCCC
實例
22cs op vA,vB,fieldoff @ CCCC 格式22c的靜態鏈接字段訪問指令的建議格式
ØØ| op AAAA lo AAAA hi 30噸 op + AAAAAAAA 轉到/ 32
ØØ| op AAAA BBBB 32倍 op vAAAA,vBBBB
AA | op BBBB lo BBBB hi 31i op vAA,#+ BBBBBBBB
31噸 op vAA,+ BBBBBBBB
31c op vAA,字符串@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},類型@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=2 ] op {vC,vD},inline @ BBBB
[ A=1 ] op {vC},inline @ BBBB

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

內聯鏈接的35c invoke-staticinvoke-virtual指令的建議格式
AA | op BBBB CCCC 3rc op {vCCCC .. vNNNN},meth @ BBBB
op {vCCCC .. vNNNN},site @ 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},inline @ 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 4路 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,#+ BBBBBBBBBBBBBBBBBB const範圍