Halaman ini mencantumkan format instruksi yang digunakan oleh format Dalvik executable (DEX) dan bytecode Dalvik. Hal ini dimaksudkan untuk digunakan bersama dengan dokumen referensi bytecode .
Deskripsi sedikit demi sedikit
Kolom pertama dalam tabel format mencantumkan tata letak format bitwise. Ini terdiri dari satu atau lebih "kata" yang dipisahkan spasi yang masing-masing menggambarkan unit kode 16-bit. Setiap karakter dalam sebuah kata mewakili empat bit, dibaca dari bit tinggi ke rendah, dengan garis vertikal (" |
") diselingi untuk membantu pembacaan. Huruf besar secara berurutan dari " A
" digunakan untuk menunjukkan bidang dalam format (yang kemudian ditentukan lebih lanjut oleh kolom sintaksis). Istilah " op
" digunakan untuk menunjukkan posisi opcode delapan bit dalam format. Garis miring nol (" Ø
") digunakan untuk menunjukkan bahwa semua bit harus nol pada posisi yang ditunjukkan.
Untuk sebagian besar, penulisan huruf berasal dari unit kode sebelumnya ke unit kode selanjutnya, dan tingkat rendah ke tingkat tinggi dalam unit kode. Namun, ada beberapa pengecualian terhadap aturan umum ini, yang dilakukan untuk membuat penamaan bagian yang memiliki arti serupa menjadi sama pada format instruksi yang berbeda. Kasus-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 nilai 16-bit tunggal.
ID Format
Kolom kedua dalam tabel format menunjukkan pengidentifikasi singkat untuk format tersebut, yang digunakan dalam dokumen lain dan dalam kode untuk mengidentifikasi format.
Kebanyakan format ID terdiri dari tiga karakter, dua digit diikuti dengan satu huruf. Digit pertama menunjukkan jumlah unit kode 16-bit dalam format. Digit kedua menunjukkan jumlah maksimum register yang terdapat dalam format tersebut (maksimum, karena beberapa format dapat menampung sejumlah variabel register), dengan sebutan khusus " r
" yang menunjukkan bahwa rentang register dikodekan. Huruf terakhir secara semi-mnemonik menunjukkan jenis data tambahan yang dikodekan oleh format. Misalnya, format " 21t
" memiliki panjang dua, berisi satu referensi register, dan juga berisi target cabang.
Format tautan statis yang disarankan memiliki akhiran " s
" tambahan, sehingga totalnya menjadi empat karakter. Demikian pula, format penautan "sebaris" yang disarankan memiliki tambahan " i
" akhiran. (Dalam konteks ini, tautan inline seperti tautan statis, kecuali dengan ikatan yang lebih langsung ke dalam implementasi mesin.) Terakhir, beberapa format yang disarankan secara eksentrik (misalnya, " 20bc
") mencakup dua bagian data yang keduanya direpresentasikan dalam ID formatnya .
Daftar lengkap huruf kode ketik adalah sebagai berikut. Perhatikan bahwa beberapa formulir memiliki ukuran berbeda, bergantung pada formatnya:
Mnemonik | Ukuran Bit | Arti |
---|---|---|
B | 8 | segera ditandatangani oleh yte |
C | 16, 32 | c indeks kumpulan konstan |
F | 16 | konstanta inter f ace (hanya digunakan dalam format yang terhubung secara statis) |
H | 16 | h at yang ditandatangani langsung (bit tingkat tinggi dengan nilai 32 atau 64-bit; bit tingkat rendah semuanya 0 ) |
Saya | 32 | langsung ditandatangani i nt, atau float 32-bit |
aku | 64 | langsung ditandatangani lama , atau ganda 64-bit |
M | 16 | konstanta metode m (hanya digunakan dalam format yang terhubung secara statis) |
N | 4 | segera ditandatangani dan ibble |
S | 16 | segera ditandatangani s singkat |
T | 8, 16, 32 | cabang t target |
X | 0 | tidak ada data tambahan |
Sintaksis
Kolom ketiga dari tabel format menunjukkan sintaks berorientasi manusia untuk instruksi yang menggunakan format yang ditunjukkan. Setiap instruksi dimulai dengan opcode bernama dan secara opsional diikuti oleh satu atau lebih argumen, yang dipisahkan dengan koma.
Dimanapun suatu argumen mengacu pada suatu field dari kolom pertama, huruf untuk field tersebut ditunjukkan dalam sintaksis, diulang satu kali untuk setiap empat bit dari field tersebut. Misalnya, bidang delapan bit berlabel " BB
" di kolom pertama juga akan diberi label " BB
" di kolom sintaksis.
Argumen yang memberi nama suatu register berbentuk " v X
". Awalan " v
" dipilih daripada " r
" yang lebih umum untuk menghindari konflik dengan arsitektur (non-virtual) di mana format Dalvik Executable dapat diimplementasikan yang menggunakan awalan " r
" untuk registernya. (Artinya, keputusan ini memungkinkan untuk membicarakan register virtual dan register nyata secara bersamaan tanpa perlu berbelit-belit.)
Argumen yang menunjukkan nilai literal berbentuk " #+ X
". Beberapa format menunjukkan literal yang hanya memiliki bit bukan nol dalam bit tingkat tinggi; untuk ini, angka nol direpresentasikan secara eksplisit dalam sintaksis, meskipun angka nol tersebut tidak muncul dalam representasi bitwise.
Argumen yang menunjukkan offset alamat instruksi relatif berbentuk " + X
".
Argumen yang menunjukkan indeks kumpulan konstanta literal berbentuk " kind @ X
", di mana " kind
" menunjukkan kumpulan konstanta mana yang dirujuk. Setiap opcode yang menggunakan format seperti itu secara eksplisit hanya mengizinkan satu jenis konstanta; lihat referensi opcode untuk mengetahui korespondensinya. Jenis kumpulan konstan adalah " string
" (indeks kumpulan string), " type
" (tipe indeks kumpulan), " field
" (indeks kumpulan bidang), " meth
" (indeks kumpulan metode), dan " site
" (indeks situs panggilan ).
Mirip dengan representasi indeks kumpulan konstan, ada juga bentuk yang disarankan (opsional) yang menunjukkan offset atau indeks yang ditautkan sebelumnya. Ada dua jenis nilai prataut yang disarankan: offset vtable (ditunjukkan sebagai " vtaboff
") dan offset bidang (ditunjukkan sebagai " fieldoff
").
Dalam kasus di mana nilai format tidak secara eksplisit menjadi bagian dari sintaksis melainkan memilih varian, setiap varian dicantumkan dengan awalan " [ X = N ]
" (misalnya, " [A=2]
") untuk menunjukkan korespondensi .
Format
Format | PENGENAL | Sintaksis | Opcode Terkemuka Tercakup |
---|---|---|---|
T/A | 00x | N/A | format semu yang digunakan untuk opcode yang tidak digunakan; disarankan untuk digunakan sebagai format nominal untuk opcode breakpoint |
ØØ| op | 10x | op | |
B|A| op | 12x | op vA, vB | |
11n | op vA, #+B | ||
AA| op | 11x | op vAA | |
10t | op +AA | pergi ke | |
ØØ| op AAAA | 20t | op +AAAA | pergi/16 |
AA| op BBBB | 20 SM | op AA, baik hati@BBBB | format yang disarankan untuk kesalahan verifikasi yang ditentukan secara statis; A adalah tipe kesalahan dan B adalah indeks ke dalam tabel yang sesuai tipe (misalnya referensi metode untuk kesalahan tanpa metode seperti itu) |
AA| op BBBB | 22x | op vAA, vBBBB | |
21t | op vAA, +BBBB | ||
21 detik | op vAA, #+BBBB | ||
21 jam | op vAA, #+BBBB0000op vAA, #+BBBB000000000000 | ||
21c | op vAA, ketik@BBBBop vAA, bidang@BBBBop vAA, metode_handle@BBBBop vAA, proto@BBBBop vAA, string@BBBB | check-cast kelas const const-metode-penanganan tipe metode const string-konstan | |
AA| op CC|BB | 23x | op vAA, vBB, vCC | |
22b | op vAA, vBB, #+CC | ||
B|A| op CCCC | 22t | op vA, vB, + CCCC | |
22 detik | op vA, vB, #+CCCC | ||
22c | op vA, vB, ketik@CCCCop vA, vB, bidang@CCCC | contoh | |
22cs | op vA, vB, fieldoff@CCCC | format yang disarankan untuk instruksi akses lapangan yang terhubung secara statis dalam format 22c | |
ØØ| op AAAA lo AAAA hai | 30t | op +AAAAAAAA | pergi/32 |
ØØ| op AAAA BBBB | 32x | op vAAAA, vBBBB | |
AA| op BBBB lo BBBB hai | 31i | op vAA, #+BBBBBBBB | |
31t | op vAA, +BBBBBBBB | ||
31c | op vAA, string@BBBBBBBB | const-string/jumbo | |
SEBUAH|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}, situs@BBBB[ A=5 ] op {vC, vD, vE, vF, vG}, ketik@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 penghitungan 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 penghitungan dan indeks referensi memiliki label yang sama seperti dalam format 3rms. | format yang disarankan untuk instruksi invoke-virtual dan invoke-super yang ditautkan secara statis dalam format 35c | |
35 mil | [ A=5 ] op {vC, vD, vE, vF, vG}, sebaris@BBBB[ A=4 ] op {vC, vD, vE, vF}, sebaris@BBBB[ A=3 ] op {vC, vD, vE}, sebaris@BBBB[ A=2 ] op {vC, vD}, sebaris@BBBB[ A=1 ] op {vC}, sebaris@BBBBPilihan huruf yang tidak biasa di sini mencerminkan keinginan untuk membuat penghitungan dan indeks referensi memiliki label yang sama seperti dalam format 3rmi. | format yang disarankan untuk instruksi invoke-static dan invoke-virtual tertaut inline dalam format 35c | |
AA| op BBBB CCCC | 3rc | op {vCCCC .. vNNNN}, meth@BBBBop {vCCCC .. vNNNN}, situs@BBBBop {vCCCC .. vNNNN}, ketik@BBBB dimana | |
3rms | op {vCCCC .. vNNNN}, vtaboff@BBBB dimana | format yang disarankan untuk instruksi invoke-virtual dan invoke-super yang ditautkan secara statis dalam format 3rc | |
3rmi | op {vCCCC .. vNNNN}, inline@BBBB dimana | format yang disarankan untuk instruksi invoke-static dan invoke-virtual tertaut inline dalam format 3rc | |
SEBUAH|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 | panggil-polimorfik |
AA| op BBBB CCCC HHHH | 4rcc | op> {vCCCC .. vNNNN}, meth@BBBB, proto@HHHH dimana | panggil-polimorfik/rentang |
AA| op BBBB lo BBBB BBBB BBBB hai | 51l | op vAA, #+BBBBBBBBBBBBBBBB | lebar konstan |