Format instruksi Dalvik Executable

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

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

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

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

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

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

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

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

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

panggilan-polimorfik/rentang
AA| op BBBB lo BBBB BBBB BBBB hai 51l op vAA, #+BBBBBBBBBBBBBBBB const-lebar