Format instruksi Dalvik yang dapat dieksekusi

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

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

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

Pilihan 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@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 yang ditautkan secara statis dalam 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 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 NNNN = CCCC+AA-1 , yaitu A menentukan hitungan 0..255 , dan C menentukan register pertama

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