Format petunjuk yang dapat dieksekusi Dalvik

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, #+BBBB0000
op vAA, #+BBBB000000000000
 
21c op vAA, type@BBBB
op vAA, field@BBBB
op vAA, method_handle@BBBB
op vAA, proto@BBBB
op 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@CCCC
op 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@BBBB

Pilihan 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@BBBB

Pilihan 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@BBBB

Pilihan 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@BBBB
op {vCCCC .. vNNNN}, site@BBBB
op {vCCCC .. vNNNN}, type@BBBB

dengan NNNN = CCCC+AA-1, yaitu A menentukan jumlah 0..255, dan C menentukan register pertama

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

dengan NNNN = CCCC+AA-1, yaitu A menentukan jumlah 0..255, dan C menentukan register pertama

format yang disarankan untuk petunjuk invoke-virtual dan invoke-super yang ditautkan secara statis dari format 3rc
3rmi op {vCCCC .. vNNNN}, inline@BBBB

dengan NNNN = CCCC+AA-1, yaitu A menentukan jumlah 0..255, dan C menentukan register pertama

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 NNNN = CCCC+AA-1, yaitu A menentukan jumlah 0..255, dan C menentukan register pertama

invoke-polymorphic/range
AA|op BBBBlo BBBB BBBB BBBBhi 51l op vAA, #+BBBBBBBBBBBBBBBB const-wide