Halaman ini mencantumkan format instruksi yang digunakan oleh format Dalvik Executable 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 lebih "kata" yang dipisahkan oleh 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 didefinisikan lebih lanjut oleh kolom sintaks). Istilah " op
" digunakan untuk menunjukkan posisi opcode delapan bit dalam format. Garis miring Ø
(" ") digunakan untuk menunjukkan bahwa semua bit harus nol pada posisi yang ditunjukkan.
Untuk sebagian besar, hasil huruf dari unit kode sebelumnya ke unit kode selanjutnya, dan orde rendah ke orde tinggi dalam unit kode. Namun, ada beberapa pengecualian untuk aturan umum ini, yang dilakukan untuk membuat penamaan bagian yang memiliki arti serupa menjadi sama di seluruh 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 di delapan bit rendah dan sepasang nilai empat bit di delapan bit tinggi; dan kata kedua terdiri dari nilai 16-bit tunggal.
Format ID
Kolom kedua dalam tabel format menunjukkan pengidentifikasi singkat untuk format, yang digunakan dalam dokumen lain dan dalam kode untuk mengidentifikasi format.
Kebanyakan format ID 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 berisi format (maksimum, karena beberapa format dapat menampung sejumlah variabel register), dengan penunjukan khusus " r
" yang menunjukkan bahwa rentang register dikodekan. Huruf terakhir secara semi-mnemonik menunjukkan jenis data tambahan apa pun yang dikodekan oleh format. Misalnya, format " 21t
" memiliki panjang dua, berisi satu referensi register, dan tambahan berisi target cabang.
Format penautan statis yang disarankan memiliki akhiran " s
" tambahan, menjadikannya total empat karakter. Demikian pula, format penautan "inline" yang disarankan memiliki akhiran " i
" tambahan. (Dalam konteks ini, penautan sebaris seperti penautan statis, kecuali dengan ikatan yang lebih langsung ke dalam implementasi mesin.) Terakhir, beberapa format yang disarankan eksentrik (misalnya, " 20bc
") menyertakan dua bagian data yang keduanya diwakili dalam ID formatnya .
Daftar lengkap huruf kode ketik adalah sebagai berikut. Perhatikan bahwa beberapa formulir memiliki ukuran yang berbeda, tergantung pada formatnya:
Mnemonik | Ukuran Bit | Arti |
---|---|---|
b | 8 | langsung ditandatangani oleh yte |
c | 16, 32 | c indeks kumpulan konstan |
f | 16 | konstanta antarmuka (hanya digunakan dalam format yang terhubung secara statis) |
h | 16 | h segera ditandatangani (bit orde tinggi dengan nilai 32 atau 64 bit; bit orde rendah semuanya 0 ) |
saya | 32 | langsung ditandatangani , atau float 32-bit |
aku | 64 | langsung ditandatangani panjang, atau 64-bit ganda |
m | 16 | m ethod constants (hanya digunakan dalam format yang ditautkan secara statis) |
n | 4 | segera ditandatangani n ibble |
s | 16 | segera ditandatangani s hort |
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.
Di mana pun argumen merujuk ke bidang dari kolom pertama, huruf untuk bidang itu ditunjukkan dalam sintaks, diulang sekali untuk setiap empat bit bidang. Misalnya, bidang delapan bit berlabel " BB
" di kolom pertama juga akan diberi label " BB
" di kolom sintaks.
Argumen yang menamai sebuah register berbentuk " v X
". Awalan " v
" dipilih daripada " r
" yang lebih umum persis untuk menghindari konflik dengan arsitektur (non-virtual) di mana format Dalvik Executable dapat diimplementasikan yang menggunakan awalan " r
" untuk register mereka sendiri. (Artinya, keputusan ini memungkinkan untuk membicarakan register virtual dan nyata bersama-sama tanpa perlu bertele-tele.)
Argumen yang menunjukkan nilai literal memiliki bentuk " #+ X
". Beberapa format menunjukkan literal yang hanya memiliki bit bukan nol dalam bit orde tinggi; untuk ini, nol diwakili secara eksplisit dalam sintaks, meskipun mereka tidak muncul dalam representasi bitwise.
Argumen yang menunjukkan offset alamat instruksi relatif memiliki bentuk " + X
".
Argumen yang menunjukkan indeks kumpulan konstanta literal memiliki bentuk " 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 korespondensi. Jenis kumpulan konstanta adalah " string
" (indeks kumpulan string), " type
" (indeks kumpulan jenis), " field
" (indeks kumpulan bidang), " meth
" (indeks kumpulan metode), dan " site
" (panggil indeks situs ).
Mirip dengan representasi indeks kumpulan konstan, ada juga formulir yang disarankan (opsional) yang menunjukkan offset atau indeks yang ditautkan sebelumnya. Ada dua jenis nilai pratautan 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 sintaks tetapi memilih varian, setiap varian dicantumkan dengan awalan " [ X = N ]
" (misalnya, " [A=2]
") untuk menunjukkan korespondensi .
Formatnya
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 AAA | 20t | op +AAAA | masuk/16 |
AA| op BBBB | 20bc | op AA, baiklah@BBBB | format yang disarankan untuk kesalahan verifikasi yang ditentukan secara statis; A adalah jenis kesalahan dan B adalah indeks ke dalam tabel yang sesuai dengan jenisnya (misalnya referensi metode untuk kesalahan metode tanpa metode tersebut) |
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, method_handle@BBBBop vAA, proto@BBBBop vAA, string@BBBB | check-cast kelas-konst const-metode-pegangan 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 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 dari format 22c | |
| op AAAA lo AAAA hai | 30t | op +AAAAAA | masuk/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 | |
A|G| op BBBB F|E|D|C | 35c | [ A=5 op di {vC, vD, vE, vF, vG}, met@BBBB[ A=5 op di {vC, vD, vE, vF, vG}, situs@BBBB[ A=5 op di {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 {}, ketik kind Pilihan huruf yang tidak biasa di sini mencerminkan keinginan untuk menghitung dan indeks referensi memiliki label yang sama seperti dalam format 3rc. | |
35ms | [ A=5 op di {vC, vD, vE, vF, vG}, vtaboff@BBBB[ A=4 op di {vC, vD, vE, vF}, vtaboff@BBBB[ A=3 ] op {vC, vD, vE}, vtaboff@BBBB[ A=2 op di {vC, vD}, vtaboff@BBBB[ A=1 op di {vC}, vtaboff@BBBBPilihan huruf yang tidak biasa di sini mencerminkan keinginan untuk menghitung dan indeks referensi memiliki label yang sama seperti dalam format 3rms. | format yang disarankan untuk instruksi invoke-virtual dan invoke-super terhubung secara statis dari format 35c | |
35 menit | [ A=5 op di {vC, vD, vE, vF, vG}, sebaris@BBBB[ A=4 ] op {vC, vD, vE, vF}, inline@BBBB[ A=3 op di {vC, vD, vE}, sebaris@BBBB[ A=2 op di {vC, vD}, sebaris@BBBB[ A=1 op di {vC}, sebaris@BBBBPilihan huruf yang tidak biasa di sini mencerminkan keinginan untuk menghitung dan indeks referensi memiliki label yang sama seperti dalam format 3rmi. | format yang disarankan untuk instruksi inline invoke-static dan invoke-virtual dari 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 terhubung secara statis dari format 3rc | |
3rmi | op {vCCCC .. vNNNN}, inline@BBBB dimana | format yang disarankan untuk instruksi inline invoke-static dan invoke-virtual dari format 3rc | |
A|G| op BBBB F|E|D|C HHHH | 45cc | [ A=5 op di {vC, vD, vE, vF, vG}, met@BBBB, proto@HHHH[ A=4 op dari {vC, vD, vE, vF}, sabu@BBBB, proto@HHHH[ A=3 op dari {vC, vD, vE}, met@BBBB, proto@HHHH[ A=2 op di {vC, vD}, sabu@BBBB, proto@HHHH[ A=1 op dari {vC}, sabu@BBBB, proto@HHHH | memanggil-polimorfik |
AA| op BBBB CCCC HHHH | 4rcc | op> {vCCCC .. vNNNN}, meth@BBBB, proto@HHHH dimana | panggilan-polimorfik/rentang |
AA| op BBBB lo BBBB BBBB BBBB hai | 51l | op vAA, #+BBBBBBBBBBBBBBBB | const-lebar |