Halaman ini mencantumkan format petunjuk yang digunakan oleh format Dalvik Executable (DEX) dan bytecode Dalvik. Ini dimaksudkan untuk digunakan bersama dengan dokumen referensi bytecode.
Deskripsi bitwise
Kolom pertama dalam tabel format mencantumkan tata letak bitwise
format. Ini terdiri dari satu atau beberapa "kata" yang dipisahkan spasi, yang masing-masing
menjelaskan unit kode 16-bit. Setiap karakter dalam kata
mewakili empat bit, yang dibaca dari bit tinggi ke rendah, dengan batang vertikal
("|
") yang diselingi untuk membantu pembacaan. Huruf besar
dalam urutan dari "A
" digunakan untuk menunjukkan kolom dalam
format (yang kemudian ditentukan lebih lanjut oleh kolom sintaksis). Istilah
"op
" digunakan untuk menunjukkan posisi opcode delapan
bit dalam format. Nol dengan garis miring
("Ø
") digunakan untuk menunjukkan bahwa semua bit harus
nol di posisi yang ditunjukkan.
Sebagian besar, huruf berlanjut dari unit kode sebelumnya ke unit kode berikutnya, dan urutan rendah ke urutan tinggi dalam unit kode. Namun, ada beberapa pengecualian untuk aturan umum ini, yang dilakukan untuk membuat penamaan bagian yang memiliki arti serupa sama di berbagai format petunjuk. Kasus ini dicatat secara eksplisit dalam deskripsi format.
Misalnya, format "B|A|op CCCC
" menunjukkan bahwa format tersebut terdiri dari dua unit kode 16-bit. Kata pertama
terdiri dari opcode dalam delapan bit rendah dan sepasang nilai empat
bit dalam delapan bit tinggi; dan kata kedua terdiri dari satu
nilai 16-bit.
ID Format
Kolom kedua dalam tabel format menunjukkan ID singkat untuk format, yang digunakan dalam dokumen lain dan dalam kode untuk mengidentifikasi format.
Sebagian besar ID format terdiri dari tiga karakter, dua digit, diikuti dengan
huruf. Digit pertama menunjukkan jumlah unit kode 16-bit dalam
format. Digit kedua menunjukkan jumlah maksimum register yang
dimuat format (maksimum, karena beberapa format dapat mengakomodasi jumlah
register variabel), dengan penetapan khusus "r
" yang menunjukkan
bahwa rentang register dienkode. Huruf terakhir secara semi-mnemonik
menunjukkan jenis data tambahan yang dienkode oleh format. Misalnya,
format "21t
" memiliki panjang dua, berisi satu referensi register,
dan juga berisi target cabang.
Format penautan statis yang disarankan memiliki akhiran
"s
" tambahan, sehingga totalnya menjadi empat karakter. Demikian pula,
format penautan "inline" yang disarankan memiliki akhiran "i
"
tambahan. (Dalam konteks ini, penautan inline seperti penautan statis,
kecuali dengan hubungan yang lebih langsung ke implementasi mesin.)
Terakhir, beberapa format yang disarankan aneh (mis.,
"20bc
") menyertakan dua bagian data yang
diwakili dalam ID formatnya.
Berikut adalah daftar lengkap huruf kode jenis. Perhatikan bahwa beberapa formulir memiliki ukuran yang berbeda, bergantung pada formatnya:
Mnemonik | Ukuran Bit | Arti |
---|---|---|
b | 8 | byte byte yang ditandatangani langsung |
c | 16, 32 | constant pool index |
f | 16 | konstanta antarfa (hanya digunakan dalam format yang ditautkan secara statis) |
j | 16 | hat bertanda langsung (bit urutan tinggi dari nilai
32- atau 64-bit; bit urutan rendah semuanya 0 )
|
i | 32 | int bertanda langsung, atau float 32-bit |
l | 64 | long langsung yang ditandatangani, atau ganda 64-bit |
m | 16 | Konstanta method (hanya digunakan dalam format yang ditautkan secara statis) |
n | 4 | nibble yang ditandatangani langsung |
s | 16 | short bertanda tangan langsung |
t | 8, 16, 32 | target target cabang |
x | 0 | tidak ada data tambahan |
Sintaksis
Kolom ketiga tabel format menunjukkan sintaksis berorientasi manusia untuk petunjuk yang menggunakan format yang ditunjukkan. Setiap petunjuk dimulai dengan opcode yang dinamai dan secara opsional diikuti dengan satu atau beberapa argumen, yang dipisahkan dengan koma.
Di mana pun argumen merujuk ke kolom dari kolom pertama, huruf untuk kolom tersebut ditunjukkan dalam sintaksis, diulang sekali untuk setiap empat bit kolom. Misalnya, kolom delapan bit yang berlabel
"BB
" di kolom pertama juga akan berlabel
"BB
" di kolom sintaksis.
Argumen yang memberi nama register memiliki bentuk "vX
".
Awalan "v
" dipilih, bukan "r
" yang lebih umum,
untuk menghindari konflik dengan arsitektur (non-virtual)
tempat format Dalvik Executable dapat diimplementasikan, yang
menggunakan awalan "r
" untuk registernya. (Artinya, keputusan ini memungkinkan kita membahas register virtual dan register sebenarnya
secara bersamaan tanpa perlu menggunakan kata-kata yang berbelit-belit.)
Argumen yang menunjukkan nilai literal memiliki bentuk
"#+X
". Beberapa format menunjukkan literal yang hanya
memiliki bit non-nol dalam bit urutan tinggi; untuk ini, nol
diwakili secara eksplisit dalam sintaksis, meskipun tidak
muncul dalam representasi bitwise.
Argumen yang menunjukkan offset alamat petunjuk relatif memiliki
bentuk "+X
".
Argumen yang menunjukkan indeks kumpulan konstanta literal memiliki bentuk
"kind@X
", dengan "kind
"
menunjukkan kumpulan konstanta yang dirujuk. Setiap opcode yang
menggunakan format tersebut secara eksplisit hanya mengizinkan satu jenis konstanta; lihat
referensi opcode untuk mengetahui korespondensinya. Jenis
kumpulan konstanta adalah "string
" (indeks kumpulan string),
"type
" (indeks kumpulan jenis), "field
" (indeks kumpulan
kolom), "meth
" (indeks kumpulan metode), dan
"site
" (indeks lokasi panggilan).
Serupa dengan representasi indeks kumpulan konstanta, ada
juga bentuk yang disarankan (opsional) yang menunjukkan offset atau
indeks pra-penautan. Ada dua jenis nilai pra-penautan yang disarankan: offset vtable
(ditunjukkan sebagai "vtaboff
") dan offset kolom (ditunjukkan sebagai
"fieldoff
").
Jika nilai format tidak secara eksplisit merupakan bagian dari sintaksis,
tetapi memilih varian, setiap varian akan dicantumkan dengan awalan
"[X=N]
" (misalnya, "[A=2]
") untuk menunjukkan
korespondensi.
Format
Format | ID | Sintaksis | Opcode Penting yang Dibahas |
---|---|---|---|
T/A | 00x | N/A |
format pseudo yang digunakan untuk opcode yang tidak digunakan; disarankan untuk digunakan sebagai format nominal untuk opcode titik henti sementara |
ØØ|op | 10x | op |
|
B|A|op | 12x | op vA, vB |
|
11n | op vA, #+B |
||
AA|op | 11x | op vAA |
|
10t | op +AA |
buka | |
ØØ|op AAAA | 20t | op +AAAA |
goto/16 |
AA|op BBBB | 20bc | op AA, kind@BBBB |
format yang disarankan untuk error verifikasi yang ditentukan secara statis; A adalah jenis error dan B adalah indeks ke dalam tabel yang sesuai dengan jenis (misalnya, referensi metode untuk error tidak ada metode tersebut) |
AA|op BBBB | 22x | op vAA, vBBBB |
|
21t | op vAA, +BBBB |
||
21 dtk | op vAA, #+BBBB |
||
21 jam | 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 | 23x | op vAA, vBB, vCC |
|
22b | op vAA, vBB, #+CC |
||
B|A|op CCCC | 22t | op vA, vB, +CCCC |
|
22 dtk | op vA, vB, #+CCCC |
||
22c | op vA, vB, type@CCCCop vA, vB, field@CCCC
|
instance-of | |
22cs | op vA, vB, fieldoff@CCCC |
format yang disarankan untuk petunjuk akses kolom yang ditautkan secara statis dengan format 22c | |
ØØ|op AAAAlo AAAAhi | 30t | op +AAAAAAAA |
goto/32 |
ØØ|op AAAA BBBB | 32x | 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 @BBBBPilihan huruf yang tidak biasa di sini mencerminkan keinginan untuk membuat hitungan dan indeks referensi memiliki label yang sama seperti dalam format 3rc. |
|
35 md | [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@BBBBPilihan huruf yang tidak biasa di sini mencerminkan keinginan untuk membuat hitungan dan indeks referensi memiliki label yang sama seperti dalam format 3rms. |
format yang disarankan untuk petunjuk invoke-virtual
dan invoke-super yang ditautkan secara statis dengan format 35c
|
|
56 km | [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@BBBBPilihan huruf yang tidak biasa di sini mencerminkan keinginan untuk membuat jumlah dan indeks referensi memiliki label yang sama seperti dalam format 3rmi. |
format yang disarankan untuk petunjuk invoke-static
dan invoke-virtual tertaut inline dalam format 35c
|
|
AA|op BBBB CCCC | 3rc | op {vCCCC .. vNNNN}, meth@BBBBop {vCCCC .. vNNNN}, site@BBBBop {vCCCC .. vNNNN}, type@BBBBdengan |
|
3rms | op {vCCCC .. vNNNN}, vtaboff@BBBBdengan |
format yang disarankan untuk petunjuk invoke-virtual
dan invoke-super yang ditautkan secara statis dari format 3rc
|
|
3rmi | op {vCCCC .. vNNNN}, inline@BBBBdengan |
format yang disarankan untuk petunjuk invoke-static dan invoke-virtual tertaut inline dalam format 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
dengan |
invoke-polymorphic/range |
AA|op BBBBlo BBBB BBBB BBBBhi | 51l | op vAA, #+BBBBBBBBBBBBBBBB |
const-wide |