Google berkomitmen untuk memajukan ekuitas ras untuk komunitas kulit hitam. Lihat bagaimana.
Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

Bytecode Dalvik

Desain umum

  • Model mesin dan konvensi pemanggilan dimaksudkan untuk meniru arsitektur umum yang sebenarnya dan konvensi pemanggilan gaya-C:
    • Mesin ini berbasis register, dan ukuran frame diperbaiki pada saat penciptaan. Setiap frame terdiri dari sejumlah register tertentu (ditentukan oleh metode) serta data tambahan yang diperlukan untuk menjalankan metode, seperti (tetapi tidak terbatas pada) penghitung program dan referensi ke file .dex yang berisi metode .
    • Ketika digunakan untuk nilai bit (seperti bilangan bulat dan angka floating point), register dianggap selebar 32 bit. Pasangan register yang berdekatan digunakan untuk nilai 64-bit. Tidak ada persyaratan pelurusan untuk pasangan register.
    • Ketika digunakan untuk referensi objek, register dianggap cukup lebar untuk menampung tepat satu referensi tersebut.
    • Dalam hal representasi bitwise, (Object) null == (int) 0 .
    • Argumen N ke tanah metode dalam N register terakhir dari kerangka doa metode, secara berurutan. Argumen luas mengkonsumsi dua register. Metode instan diberikan referensi this sebagai argumen pertama mereka.
  • Unit penyimpanan dalam aliran instruksi adalah jumlah unsigned 16-bit. Beberapa bit dalam beberapa instruksi diabaikan / harus-nol.
  • Instruksi tidak terbatas pada jenis tertentu. Sebagai contoh, instruksi yang memindahkan nilai register 32-bit tanpa interpretasi tidak harus menentukan apakah mereka bergerak int atau mengapung.
  • Ada kumpulan konstan yang dihitung dan diindeks secara terpisah untuk referensi ke string, tipe, bidang, dan metode.
  • Data literal bitwise diwakili in-line dalam aliran instruksi.
  • Karena, dalam prakteknya, hal ini jarang terjadi untuk metode untuk kebutuhan lebih dari 16 register, dan karena membutuhkan lebih dari delapan register cukup umum, banyak instruksi dibatasi hanya menangani 16 register pertama. Jika memungkinkan, instruksi memungkinkan referensi hingga 256 register pertama. Selain itu, beberapa instruksi memiliki varian yang memungkinkan untuk jumlah register jauh lebih besar, termasuk sepasang instruksi catch-all move yang dapat mengatasi register dalam kisaran v0 - v65535 . Dalam kasus di mana varian instruksi tidak tersedia untuk mengatasi register yang diinginkan, diharapkan konten register dipindahkan dari register asli ke register rendah (sebelum operasi) dan / atau pindah dari register hasil rendah ke register tinggi. daftar (setelah operasi).
  • Ada beberapa "instruksi semu" yang digunakan untuk menahan muatan data panjang variabel, yang disebut dengan instruksi reguler (misalnya, fill-array-data ). Instruksi tersebut tidak boleh ditemui selama aliran eksekusi normal. Selain itu, instruksi harus ditempatkan pada bytecode offset genap (yaitu, 4-byte sejajar). Untuk memenuhi persyaratan ini, alat generasi dex harus memancarkan instruksi nop tambahan sebagai pengatur jarak jika instruksi semacam itu sebaliknya akan tidak selaras. Akhirnya, meskipun tidak diperlukan, diharapkan sebagian besar alat akan memilih untuk memancarkan instruksi ini di akhir metode, karena jika tidak maka akan terjadi kasus bahwa instruksi tambahan akan diperlukan untuk bercabang di sekitar mereka.
  • Ketika diinstal pada sistem yang sedang berjalan, beberapa instruksi dapat diubah, mengubah formatnya, sebagai optimasi penghubung statis waktu pasang. Ini untuk memungkinkan eksekusi yang lebih cepat begitu tautan diketahui. Lihat dokumen format instruksi terkait untuk varian yang disarankan. Kata "disarankan" digunakan dengan penuh pertimbangan; tidak wajib untuk mengimplementasikannya.
  • Sintaks manusia dan mnemonik:
    • Dest-then-source memesan argumen.
    • Beberapa opcodes memiliki akhiran nama disambiguasi untuk menunjukkan jenis yang mereka operasikan:
      • Jenis-opcode umum 32-bit tidak ditandai.
      • Jenis-umum 64-bit opcodes diakhiri dengan -wide .
      • Opcodes jenis-spesifik suffixed dengan jenis mereka (atau singkatan langsung), salah satu dari: -boolean -byte -char -short -int -long -float -double -object -string -class -void .
    • Beberapa opcodes memiliki akhiran disambiguasi untuk membedakan operasi lain yang identik yang memiliki tata letak atau opsi instruksi yang berbeda. Sufiks ini dipisahkan dari nama-nama utama dengan garis miring (" / ") dan terutama ada sama sekali untuk membuat ada pemetaan satu-ke-satu dengan konstanta statis dalam kode yang menghasilkan dan menginterpretasikan executable (yaitu, untuk mengurangi ambiguitas untuk manusia).
    • Dalam uraian di sini, lebar nilai (menunjukkan, misalnya, kisaran konstanta atau jumlah register yang mungkin dibahas) ditekankan oleh penggunaan karakter per empat bit lebar.
    • Misalnya, dalam instruksi " move-wide/from16 vAA, vBBBB ":
      • " move " adalah opcode dasar, yang menunjukkan operasi basis (memindahkan nilai register).
      • " wide " adalah nama suffix, yang menunjukkan bahwa ia beroperasi pada data yang lebar (64 bit).
      • " from16 " adalah akhiran opcode, menunjukkan varian yang memiliki referensi register 16-bit sebagai sumber.
      • " vAA " adalah register tujuan (tersirat oleh operasi; sekali lagi, aturannya adalah bahwa argumen tujuan selalu didahulukan), yang harus dalam kisaran v0 - v255 .
      • " vBBBB " adalah register sumber, yang harus dalam kisaran v0 - v65535 .
  • Lihat dokumen format instruksi untuk detail lebih lanjut tentang berbagai format instruksi (tercantum di bawah "Op & Format") serta rincian tentang sintaks opcode.
  • Lihat dokumen format file .dex untuk detail lebih lanjut tentang di mana bytecode cocok dengan gambar yang lebih besar.

Ringkasan set bytecode

Op & Format Mnemonik / Sintaks Argumen Deskripsi
00 10x tidak Siklus limbah.

Catatan: Instruksi pseudo data-bearing ditandai dengan opcode ini, dalam hal ini byte orde tinggi dari unit opcode menunjukkan sifat data. Lihat "Format packed-switch-payload ", "Format sparse-switch-payload ", dan "Format fill-array-data-payload " di bawah ini.

01 12x pindahkan vA, vB A: register tujuan (4 bit)
B: register sumber (4 bit)
Pindahkan konten dari satu register non-objek ke yang lain.
02 22x pindah / from16 vAA, vBBBB A: register tujuan (8 bit)
B: register sumber (16 bit)
Pindahkan konten dari satu register non-objek ke yang lain.
03 32x bergerak / 16 vAAAA, vBBBB A: register tujuan (16 bit)
B: register sumber (16 bit)
Pindahkan konten dari satu register non-objek ke yang lain.
04 12x bergerak-lebar vA, vB A: pasangan register tujuan (4 bit)
B: pasangan register sumber (4 bit)
Pindahkan konten dari satu pasangan-pasangan ke pasangan lainnya.

Catatan: Adalah sah untuk berpindah dari v N ke v N-1 atau v N+1 , sehingga implementasi harus mengatur kedua bagian dari pasangan register untuk dibaca sebelum sesuatu ditulis.

05 22x move-wide / from16 vAA, vBBBB A: pasangan register tujuan (8 bit)
B: pasangan register sumber (16 bit)
Pindahkan konten dari satu pasangan-pasangan ke pasangan lainnya.

Catatan: Pertimbangan implementasi sama dengan move-wide , di atas.

06 32x bergerak lebar / 16 vAAAA, vBBBB A: pasangan register tujuan (16 bit)
B: pasangan register sumber (16 bit)
Pindahkan konten dari satu pasangan-pasangan ke pasangan lainnya.

Catatan: Pertimbangan implementasi sama dengan move-wide , di atas.

07 12x move-object vA, vB A: register tujuan (4 bit)
B: register sumber (4 bit)
Pindahkan isi dari satu register bantalan objek ke yang lain.
08 22x move-object / from16 vAA, vBBBB A: register tujuan (8 bit)
B: register sumber (16 bit)
Pindahkan isi dari satu register bantalan objek ke yang lain.
09 32x move-object / 16 vAAAA, vBBBB A: register tujuan (16 bit)
B: register sumber (16 bit)
Pindahkan isi dari satu register bantalan objek ke yang lain.
0a 11x memindahkan-hasil vAA A: register tujuan (8 bit) Pindahkan hasil non-objek tunggal kata dari invoke- kind terbaru ke register yang ditunjukkan. Hal ini harus dilakukan sebagai instruksi segera setelah invoke- kind yang (single-kata, non-object) hasilnya tidak akan diabaikan; di tempat lain tidak valid.
0b 11x memindahkan-hasil-lebar vAA A: pasangan register tujuan (8 bit) Pindahkan hasil kata ganda dari invoke- kind terbaru ke pasangan register yang ditunjukkan. Hal ini harus dilakukan sebagai instruksi segera setelah invoke- kind yang (double-kata) hasil ini tidak dapat diabaikan; di tempat lain tidak valid.
0c 11x memindahkan-hasil-objek vAA A: register tujuan (8 bit) Pindahkan hasil obyek yang terbaru invoke- kind ke register ditunjukkan. Ini harus dilakukan sebagai instruksi segera setelah invoke- kind atau filled-new-array yang (objek) hasilnya tidak dapat diabaikan; di tempat lain tidak valid.
0d 11x pindahkan-pengecualian vAA A: register tujuan (8 bit) Simpan pengecualian yang baru ditangkap ke dalam register yang diberikan. Ini harus menjadi instruksi pertama dari penangan pengecualian yang menangkap pengecualian tidak harus diabaikan, dan instruksi ini hanya boleh terjadi sebagai instruksi pertama penangan pengecualian; di tempat lain tidak valid.
0e 10x kembali batal Kembali dari metode void .
0f 11x kembalikan vAA A: daftar nilai pengembalian (8 bit) Kembali dari metode pengembalian nilai tunggal-lebar (32-bit).
10 11x return-wide vAA A: mengembalikan nilai register-pair (8 bit) Kembali dari metode pengembalian nilai lebar ganda (64-bit).
11 11x kembali-objek vAA A: daftar nilai pengembalian (8 bit) Kembali dari metode pengembalian objek.
12 11n const / 4 vA, # + B A: register tujuan (4 bit)
B: ditandatangani int (4 bit)
Pindahkan nilai literal yang diberikan (tanda diperluas ke 32 bit) ke dalam register yang ditentukan.
13 21-an const / 16 vAA, # + BBBB A: register tujuan (8 bit)
B: ditandatangani int (16 bit)
Pindahkan nilai literal yang diberikan (tanda diperluas ke 32 bit) ke dalam register yang ditentukan.
14 31i const vAA, # + BBBBBBBB A: register tujuan (8 bit)
B: konstanta 32-bit sewenang-wenang
Pindahkan nilai literal yang diberikan ke register yang ditentukan.
15 21h const / high16 vAA, # + BBBB0000 A: register tujuan (8 bit)
B: ditandatangani int (16 bit)
Pindahkan nilai literal yang diberikan (kanan-nol-diperpanjang ke 32 bit) ke register yang ditentukan.
16 21-an const-wide / 16 vAA, # + BBBB A: register tujuan (8 bit)
B: ditandatangani int (16 bit)
Pindahkan nilai literal yang diberikan (tanda diperluas ke 64 bit) ke dalam pasangan register yang ditentukan.
17 31i const-wide / 32 vAA, # + BBBBBBBB A: register tujuan (8 bit)
B: ditandatangani int (32 bit)
Pindahkan nilai literal yang diberikan (tanda diperluas ke 64 bit) ke dalam pasangan register yang ditentukan.
18 51l const-wide vAA, # + BBBBBBBBBBBBBBBBB A: register tujuan (8 bit)
B: konstanta lebar ganda acak (64-bit)
Pindahkan nilai literal yang diberikan ke pasangan-register yang ditentukan.
19 21h const-wide / high16 vAA, # + BBBB000000000000 A: register tujuan (8 bit)
B: ditandatangani int (16 bit)
Pindahkan nilai literal yang diberikan (kanan-nol-diperpanjang ke 64 bit) ke dalam pasangan register yang ditentukan.
1a 21c const-string vAA, string @ BBBB A: register tujuan (8 bit)
B: indeks string
Pindahkan referensi ke string yang ditentukan oleh indeks yang diberikan ke register yang ditentukan.
1b 31c const-string / jumbo vAA, string @ BBBBBBBB A: register tujuan (8 bit)
B: indeks string
Pindahkan referensi ke string yang ditentukan oleh indeks yang diberikan ke register yang ditentukan.
1c 21c const-class vAA, ketik @ BBBB A: register tujuan (8 bit)
B: jenis indeks
Pindahkan referensi ke kelas yang ditentukan oleh indeks yang diberikan ke register yang ditentukan. Dalam kasus di mana tipe yang ditunjukkan adalah primitif, ini akan menyimpan referensi ke kelas degenerasi tipe primitif.
1d 11x monitor-masukkan vAA A: register bantalan referensi (8 bit) Dapatkan monitor untuk objek yang ditunjukkan.
1e 11x monitor-keluar vAA A: register bantalan referensi (8 bit) Lepaskan monitor untuk objek yang ditunjukkan.

Catatan: Jika instruksi ini perlu melempar pengecualian, itu harus dilakukan seolah-olah pc telah maju melewati instruksi. Mungkin berguna untuk menganggap ini sebagai instruksi yang berhasil dieksekusi (dalam arti tertentu), dan pengecualian dilemparkan setelah instruksi tetapi sebelum yang berikutnya mendapat kesempatan untuk berjalan. Definisi ini memungkinkan metode untuk menggunakan monitor cleanup catch-all (misalnya, finally ) sebagai pembersihan monitor untuk blok itu sendiri, sebagai cara untuk menangani pengecualian sewenang-wenang yang mungkin terlempar karena penerapan historis Thread.stop() , sambil tetap mengatur kebersihan monitor yang tepat.

1f 21c check-cast vAA, ketik @ BBBB A: register bantalan referensi (8 bit)
B: ketik indeks (16 bit)
Lempar ClassCastException jika referensi dalam register yang diberikan tidak dapat dilemparkan ke tipe yang ditunjukkan.

Catatan: Karena A harus selalu menjadi referensi (dan bukan nilai primitif), ini akan selalu gagal saat runtime (yaitu, ia akan melempar pengecualian) jika B merujuk ke tipe primitif.

20 22c instance-dari vA, vB, ketik @ CCCC A: register tujuan (4 bit)
B: register bantalan referensi (4 bit)
C: ketik indeks (16 bit)
Simpan di register tujuan yang diberikan 1 jika referensi yang ditunjukkan adalah turunan dari jenis yang diberikan, atau 0 jika tidak.

Catatan: Karena B harus selalu menjadi referensi (dan bukan nilai primitif), ini akan selalu menghasilkan 0 disimpan jika C merujuk ke tipe primitif.

21 12x panjang array vA, vB A: register tujuan (4 bit)
B: register bantalan referensi (4 bit)
Simpan di tujuan yang diberikan daftarkan panjang array yang ditunjukkan, dalam entri
22 21c contoh baru vAA, ketik @ BBBB A: register tujuan (8 bit)
B: jenis indeks
Buat instance baru dari tipe yang ditunjukkan, menyimpan referensi untuk itu di tujuan. Tipe harus merujuk ke kelas non-array.
23 22c array baru vA, vB, ketik @ CCCC A: register tujuan (4 bit)
B: register ukuran
C: ketik indeks
Bangun array baru dengan tipe dan ukuran yang ditunjukkan. Tipe harus berupa tipe array.
24 35c array-diisi-baru {vC, vD, vE, vF, vG}, ketik @ BBBB A: ukuran array dan jumlah kata argumen (4 bit)
B: ketik indeks (16 bit)
C..G: register argumen (masing-masing 4 bit)
Buatlah array dari jenis dan ukuran yang diberikan, isilah dengan isi yang disediakan. Tipe harus berupa tipe array. Isi array harus satu kata (yaitu, tidak ada array yang long atau double , tetapi jenis referensi dapat diterima). Instance yang dikonstruksikan disimpan sebagai "hasil" dengan cara yang sama seperti instruksi pemanggilan metode menyimpan hasilnya, sehingga instance yang dikonstruksikan harus dipindahkan ke register dengan instruksi move-result-object segera berikutnya (jika itu akan digunakan ).
25 3rc diisi-array-baru / range {vCCCC .. vNNNN}, ketik @ BBBB A: ukuran array dan jumlah kata argumen (8 bit)
B: ketik indeks (16 bit)
C: register argumen pertama (16 bit)
N = A + C - 1
Buatlah array dari jenis dan ukuran yang diberikan, isilah dengan isi yang disediakan. Klarifikasi dan pembatasan sama dengan filled-new-array , dijelaskan di atas.
26 31t fill-array-data vAA, + BBBBBBBB (dengan data tambahan seperti yang ditentukan di bawah ini di "Format fill-array-data-payload ") A: referensi array (8 bit)
B: menandatangani "branch" offset ke data tabel pseudo-instructions (32 bit)
Isi array yang diberikan dengan data yang ditunjukkan. Referensi harus ke array primitif, dan tabel data harus cocok dengan tipe dan tidak boleh mengandung lebih banyak elemen daripada yang akan cocok dalam array. Artinya, array mungkin lebih besar dari tabel, dan jika demikian, hanya elemen awal array yang diatur, meninggalkan sisanya sendiri.
27 11x melempar vAA A: register pengecualian-bantalan (8 bit)
Lempar pengecualian yang ditunjukkan.
28 10t goto + AA A: offset cabang yang ditandatangani (8 bit) Tanpa syarat melompat ke instruksi yang ditunjukkan.

Catatan: Offset cabang tidak boleh 0 . (Putaran putaran dapat dibangun secara legal baik dengan goto/32 atau dengan memasukkan nop sebagai target sebelum cabang.)

29 20t goto / 16 + AAAA A: offset cabang yang ditandatangani (16 bit)
Tanpa syarat melompat ke instruksi yang ditunjukkan.

Catatan: Offset cabang tidak boleh 0 . (Putaran putaran dapat dibangun secara legal baik dengan goto/32 atau dengan memasukkan nop sebagai target sebelum cabang.)

2a 30t goto / 32 + AAAAAAAA A: offset cabang yang ditandatangani (32 bit)
Tanpa syarat melompat ke instruksi yang ditunjukkan.
2b 31t packed-switch vAA, + BBBBBBBBB (dengan data tambahan sebagaimana ditentukan di bawah ini dalam "Format packed-switch-payload ") A: daftar untuk menguji
B: menandatangani "branch" offset ke data tabel pseudo-instructions (32 bit)
Lompat ke instruksi baru berdasarkan nilai dalam register yang diberikan, menggunakan tabel offset yang terkait dengan setiap nilai dalam rentang integral tertentu, atau ikuti instruksi berikutnya jika tidak ada kecocokan.
2c 31t sparse-switch vAA, + BBBBBBBB (dengan data tambahan sebagaimana ditentukan di bawah dalam "Format payars sparse-switch-payload ") A: daftar untuk menguji
B: menandatangani "branch" offset ke data tabel pseudo-instructions (32 bit)
Lompat ke instruksi baru berdasarkan nilai dalam register yang diberikan, menggunakan tabel pasangan nilai-offset yang dipesan, atau ikuti instruksi berikutnya jika tidak ada kecocokan.
2d..31 23x jenis cmp vAA, vBB, vCC
2d: cmpl-float (bias)
2e: cmpg-float (gt bias)
2f: cmpl-dobel (bias)
30: cmpg-double (gt bias)
31: cmp-panjang
A: register tujuan (8 bit)
B: register atau pasangan sumber pertama
C: register atau pasangan sumber kedua
Lakukan floating point yang ditunjukkan atau perbandingan long , atur a ke 0 jika b == c , 1 jika b > c , atau -1 jika b < c . "Bias" yang tercantum untuk operasi floating point menunjukkan bagaimana perbandingan NaN diperlakukan: instruksi "gt bias" mengembalikan 1 untuk perbandingan NaN , dan "lt bias" mengembalikan -1 .

Misalnya, untuk memeriksa apakah floating point x < y disarankan untuk menggunakan cmpg-float ; hasil -1 menunjukkan bahwa tes itu benar, dan nilai-nilai lain menunjukkan itu salah baik karena perbandingan yang valid atau karena salah satu nilai adalah NaN .

32..37 22t jika- uji vA, vB, + CCCC
32: jika-eq
33: jika-ne
34: jika-lt
35: jika-ge
36: jika-gt
37: jika-le
A: daftar pertama untuk menguji (4 bit)
B: daftar kedua untuk menguji (4 bit)
C: offset cabang yang ditandatangani (16 bit)
Cabang ke tujuan yang diberikan jika nilai dua register yang diberikan membandingkan seperti yang ditentukan.

Catatan: Offset cabang tidak boleh 0 . (Putaran putaran dapat dibangun secara legal baik dengan bercabang di sekitar goto mundur atau dengan memasukkan nop sebagai target sebelum cabang.)

38..3d 21t jika- uji z vAA, + BBBB
38: if-eqz
39: if-nez
3a: if-ltz
3b: if-gez
3c: if-gtz
3d: jika-lez
A: daftar untuk menguji (8 bit)
B: offset cabang yang ditandatangani (16 bit)
Cabang ke tujuan yang diberikan jika nilai register yang diberikan membandingkan dengan 0 seperti yang ditentukan.

Catatan: Offset cabang tidak boleh 0 . (Putaran putaran dapat dibangun secara legal baik dengan bercabang di sekitar goto mundur atau dengan memasukkan nop sebagai target sebelum cabang.)

3e.43 10x (tidak digunakan) (tidak digunakan)
44..51 23x arrayop vAA, vBB, vCC
44: aget
45: lebar aget
46: objek-aget
47: aget-boolean
48: aget-byte
49: aget-char
4a: aget-short
4b: aput
4c: lebar aput
4d: objek-aput
4e: aput-boolean
4f: aput-byte
50: aput-char
51: aput-short
A: daftar nilai atau pasangan; mungkin sumber atau dest (8 bit)
B: register array (8 bit)
C: daftar indeks (8 bit)
Lakukan operasi array yang diidentifikasi pada indeks yang diidentifikasi dari array yang diberikan, memuat atau menyimpan ke dalam register nilai.
52..5f 22c i instanceop vA, vB, bidang @ CCCC
52: iget
53: lebar iget
54: iget-object
55: iget-boolean
56: iget-byte
57: iget-char
58: iget-pendek
59: iput
5a: lebar iput
5b: iput-object
5c: iput-boolean
5d: iput-byte
5e: iput-char
5f: iput-short
A: daftar nilai atau pasangan; mungkin sumber atau dest (4 bit)
B: register objek (4 bit)
C: indeks referensi bidang contoh (16 bit)
Melakukan operasi bidang instance objek yang diidentifikasi dengan bidang yang diidentifikasi, memuat atau menyimpan ke dalam register nilai.

Catatan: opcode ini adalah kandidat yang masuk akal untuk menghubungkan statis, mengubah argumen lapangan menjadi offset yang lebih langsung.

60..6d 21c staticop vAA, bidang @ BBBB
60: dapatkan
61: selipkan lebar
62: sget-object
63: sget-boolean
64: sget-byte
65: sget-char
66: sget-short
67: sput
68: lebar sput
69: objek-sput
6a: sput-boolean
6b: byte-byte
6c: sput-char
6d: pendek-pendek
A: daftar nilai atau pasangan; mungkin sumber atau dest (8 bit)
B: indeks referensi bidang statis (16 bit)
Melakukan operasi bidang statis objek yang diidentifikasi dengan bidang statis yang diidentifikasi, memuat atau menyimpan ke dalam register nilai.

Catatan: opcode ini adalah kandidat yang masuk akal untuk menghubungkan statis, mengubah argumen lapangan menjadi offset yang lebih langsung.

6e..72 35c memanggil jenis {vC, vD, vE, vF, vG}, meth @ BBBB
6e: aktifkan-virtual
6f: aktifkan-super
70: aktifkan langsung
71: aktifkan-statis
72: invoke-interface
A: jumlah kata argumen (4 bit)
B: indeks referensi metode (16 bit)
C..G: register argumen (masing-masing 4 bit)
Panggil metode yang ditunjukkan. Hasilnya (jika ada) dapat disimpan dengan varian move-result* yang sesuai sebagai instruksi segera berikutnya.

invoke-virtual digunakan untuk memanggil metode virtual normal (metode yang tidak private , static , atau final , dan juga bukan konstruktor).

Ketika method_id mereferensikan metode kelas non-antarmuka, invoke-super digunakan untuk memanggil metode virtual superclass terdekat (sebagai lawan dari metode dengan method_id sama di kelas panggilan). Metode pembatasan yang sama berlaku untuk invoke-virtual .

Dalam file Dex versi 037 atau lebih baru, jika method_id merujuk ke metode antarmuka, invoke-super digunakan untuk memanggil versi yang paling spesifik, yang tidak ditimpa metode yang didefinisikan pada antarmuka itu. Metode pembatasan yang sama berlaku untuk invoke-virtual . Dalam file Dex sebelum versi 037 , memiliki method_id antarmuka adalah ilegal dan tidak terdefinisi.

invoke-direct digunakan untuk memanggil metode langsung non- static (yaitu metode instan yang sifatnya non-overridable, yaitu metode instance private atau konstruktor).

invoke-static digunakan untuk memanggil metode static (yang selalu dianggap sebagai metode langsung).

invoke-interface digunakan untuk memanggil metode interface , yaitu, pada objek yang kelas konkretnya tidak diketahui, menggunakan method_id yang merujuk ke interface .

Catatan: Opcode ini adalah kandidat yang masuk akal untuk menghubungkan statis, mengubah argumen metode menjadi offset yang lebih langsung (atau memasangkannya).

73 10x (tidak digunakan) (tidak digunakan)
74..78 3rc invoke- kind / range {vCCCC .. vNNNN}, meth @ BBBB
74: invoke-virtual / range
75: invoke-super / range
76: invoke-direct / range
77: invoke-static / range
78: invoke-interface / range
A: jumlah kata argumen (8 bit)
B: indeks referensi metode (16 bit)
C: register argumen pertama (16 bit)
N = A + C - 1
Panggil metode yang ditunjukkan. Lihat deskripsi invoke- kind pertama di atas untuk detail, peringatan, dan saran.
79..7a 10x (tidak digunakan) (tidak digunakan)
7b..8dari 12x unop vA, vB
7b: neg-int
7c: tidak-int
7d: neg-long
7e: tidak lama
7f: neg-float
80: neg-double
81: int-to-long
82: int-to-float
83: int-to-double
84: panjang ke int
85: long-to-float
86: panjang ke ganda
87: float-to-int
88: mengambang-ke-panjang
89: float-to-double
8a: dobel ke int
8b: double-to-long
8c: double-to-float
8d: int-to-byte
8e: int-to-char
8f: int-to-short
A: register tujuan atau pasangan (4 bit)
B: daftar sumber atau pasangan (4 bit)
Lakukan operasi unary yang diidentifikasi pada register sumber, menyimpan hasilnya dalam register tujuan.
90..af 23x binop vAA, vBB, vCC
90: add-int
91: sub-int
92: mul-int
93: div-int
94: rem-int
95: and-int
96: or-int
97: xor-int
98: shl-int
99: sh-int
9a: ushr-int
9b: tambah panjang
9c: sub-panjang
9d: mul-long
9e: div-long
9f: panjang-rem
a0: dan panjang
a1: atau panjang
a2: panjang xor
a3: panjang shl
a4: shr-long
a5: ushr-long
a6: add-float
a7: sub-float
a8: mul-float
a9: div-float
aa: rem-float
ab: add-double
ac: sub-dobel
iklan: mul-double
ae: div-double
af: rem-dobel
A: register tujuan atau pasangan (8 bit)
B: register atau pasangan sumber pertama (8 bit)
C: register atau pasangan sumber kedua (8 bit)
Lakukan operasi biner yang teridentifikasi pada dua register sumber, simpan hasilnya di register tujuan.

Catatan: Bertentangan dengan lainnya -long operasi matematika (yang mengambil pasangan mendaftar untuk kedua sumber pertama dan kedua mereka mereka), shl-long , shr-long , dan ushr-long mengambil sepasang mendaftar untuk sumber pertama mereka (nilai yang akan bergeser ), tetapi satu register untuk sumber kedua mereka (jarak perpindahan).

b0..cf 12x binop / 2addr vA, vB
b0: add-int / 2addr
b1: sub-int / 2addr
b2: mul-int / 2addr
b3: div-int / 2addr
b4: rem-int / 2addr
b5: dan-int / 2addr
b6: atau-int / 2addr
b7: xor-int / 2addr
b8: shl-int / 2addr
b9: shr-int / 2addr
ba: ushr-int / 2addr
bb: add-long / 2addr
bc: sub-long / 2addr
bd: mul-long / 2addr
be: div-long / 2addr
bf: rem-long / 2addr
c0: and-long / 2addr
c1: or-long / 2addr
c2: xor-long / 2addr
c3: shl-long / 2addr
c4: shr-long / 2addr
c5: ushr-long / 2addr
c6: add-float / 2addr
c7: sub-float / 2addr
c8: mul-float / 2addr
c9: div-float / 2addr
ca: rem-float / 2addr
cb: add-double / 2addr
cc: sub-dobel / 2addr
cd: mul-double / 2addr
ce: div-double / 2addr
cf: rem-double / 2addr
A: tujuan dan pasangan atau register sumber pertama (4 bit)
B: register atau pasangan sumber kedua (4 bit)
Lakukan operasi biner yang teridentifikasi pada dua register sumber, simpan hasilnya dalam register sumber pertama.

Catatan: Bertentangan dengan operasi matematika -long/2addr (yang mengambil pasangan register untuk tujuan / sumber pertama dan sumber kedua mereka), shl-long/2addr , shl-long/2addr shr-long/2addr , dan ushr-long/2addr mengambil register memasangkan untuk tujuan / sumber pertama mereka (nilai yang akan digeser), tetapi satu register untuk sumber kedua mereka (jarak pemindahan).

d0..d7 22s binop / lit16 vA, vB, # + CCCC
d0: add-int / lit16
d1: rsub-int (kurangi kurangi)
d2: mul-int / lit16
d3: div-int / lit16
d4: rem-int / lit16
d5: dan-int / lit16
d6: atau-int / lit16
d7: xor-int / lit16
A: register tujuan (4 bit)
B: register sumber (4 bit)
C: konstanta int yang ditandatangani (16 bit)
Lakukan operasi biner yang ditunjukkan pada register yang ditunjukkan (argumen pertama) dan nilai literal (argumen kedua), menyimpan hasilnya dalam register tujuan.

Catatan: rsub-int tidak memiliki akhiran karena versi ini adalah opcode utama keluarganya. Juga, lihat di bawah untuk perincian tentang semantiknya.

d8..e2 22b binop / lit8 vAA, vBB, # + CC
d8: add-int / lit8
d9: rsub-int / lit8
da: mul-int / lit8
db: div-int / lit8
dc: rem-int / lit8
dd: dan-int / lit8
de: or-int / lit8
df: xor-int / lit8
e0: shl-int / lit8
e1: shr-int / lit8
e2: ushr-int / lit8
A: register tujuan (8 bit)
B: register sumber (8 bit)
C: konstanta int yang ditandatangani (8 bit)
Lakukan operasi biner yang ditunjukkan pada register yang ditunjukkan (argumen pertama) dan nilai literal (argumen kedua), menyimpan hasilnya dalam register tujuan.

Catatan: Lihat di bawah untuk detail tentang semantik rsub-int .

e3..f9 10x (tidak digunakan) (tidak digunakan)
fa 45cc invoke-polymorphic {vC, vD, vE, vF, vG}, meth @ BBBB, proto @ HHHH A: jumlah kata argumen (4 bit)
B: indeks referensi metode (16 bit)
C: penerima (4 bit)
D..G: register argumen (masing-masing 4 bit)
H: indeks referensi prototipe (16 bit)
Meminta metode polimorfik tanda tangan yang ditunjukkan. Hasilnya (jika ada) dapat disimpan dengan varian move-result* yang sesuai sebagai instruksi segera berikutnya.

Referensi metode harus ke metode polimorfik tanda tangan, seperti java.lang.invoke.MethodHandle.invoke atau java.lang.invoke.MethodHandle.invokeExact .

Penerima harus objek yang mendukung metode polimorfik tanda tangan yang dipanggil.

Referensi prototipe menggambarkan tipe argumen yang disediakan dan tipe pengembalian yang diharapkan.

invoke-polymorphic dapat meningkatkan pengecualian saat dijalankan. Pengecualian dijelaskan dalam dokumentasi API untuk metode polimorfik tanda tangan yang dipanggil.

Hadir dalam file Dex dari versi 038 dan seterusnya.
fb 4rcc invoke-polymorphic / range {vCCCC .. vNNNN}, meth @ BBBB, proto @ HHHH A: jumlah kata argumen (8 bit)
B: indeks referensi metode (16 bit)
C: penerima (16 bit)
H: indeks referensi prototipe (16 bit)
N = A + C - 1
Meminta pegangan metode yang ditunjukkan. Lihat keterangan invoke-polymorphic atas untuk detailnya.

Hadir dalam file Dex dari versi 038 dan seterusnya.
fc 35c aktifkan-kustom {vC, vD, vE, vF, vG}, call_site @ BBBB A: jumlah kata argumen (4 bit)
B: indeks referensi situs panggilan (16 bit)
C..G: register argumen (masing-masing 4 bit)
Mengatasi dan memanggil situs panggilan yang ditunjukkan. Hasil dari doa (jika ada) dapat disimpan dengan varian move-result* yang sesuai sebagai instruksi selanjutnya.

Instruksi ini dijalankan dalam dua fase: resolusi situs panggilan dan pemanggilan lokasi panggilan.

Resolusi situs panggilan memeriksa apakah situs panggilan yang ditunjukkan memiliki instance java.lang.invoke.CallSite terkait. Jika tidak, metode bootstrap linker untuk situs panggilan yang ditunjukkan dipanggil menggunakan argumen yang ada dalam file DEX (lihat call_site_item ). Metode bootstrap linker mengembalikan contoh java.lang.invoke.CallSite yang kemudian akan dikaitkan dengan situs panggilan yang ditunjukkan jika tidak ada asosiasi. Utas lain mungkin telah membuat asosiasi terlebih dahulu, dan jika demikian eksekusi instruksi berlanjut dengan instance java.lang.invoke.CallSite terkait pertama.

Panggilan situs panggilan dilakukan pada target java.lang.invoke.MethodHandle dari contoh java.lang.invoke.CallSite diselesaikan. Target dipanggil seolah-olah mengeksekusi invoke-polymorphic (dijelaskan di atas) menggunakan metode menangani dan argumen ke instruksi invoke-custom pemanggilan sebagai argumen untuk metode yang tepat menangani pemanggilan doa.

Pengecualian yang diajukan oleh metode bootstrap linker dibungkus dengan java.lang.BootstrapMethodError . BootstrapMethodError juga dinaikkan jika:
  • metode bootstrap linker gagal mengembalikan contoh java.lang.invoke.CallSite .
  • java.lang.invoke.CallSite dikembalikan memiliki metode null menangani target.
  • metode handle target bukan tipe yang diminta.
Hadir dalam file Dex dari versi 038 dan seterusnya.
fd 3rc invoke-custom / range {vCCCC .. vNNNN}, call_site @ BBBB A: jumlah kata argumen (8 bit)
B: indeks referensi situs panggilan (16 bit)
C: register argumen pertama (16-bit)
N = A + C - 1
Selesaikan dan aktifkan situs panggilan. Lihat deskripsi permintaan invoke-custom atas untuk detailnya.

Hadir dalam file Dex dari versi 038 dan seterusnya.
fe 21c const-method-handle vAA, method_handle @ BBBB A: register tujuan (8 bit)
B: metode handle index (16 bit)
Pindahkan referensi ke pegangan metode yang ditentukan oleh indeks yang diberikan ke dalam register yang ditentukan.

Hadir dalam file Dex dari versi 039 dan seterusnya.
dari 21c const-method-type vAA, proto @ BBBB A: register tujuan (8 bit)
B: referensi prototipe metode (16 bit)
Pindahkan referensi ke metode prototipe yang ditentukan oleh indeks yang diberikan ke register yang ditentukan.

Hadir dalam file Dex dari versi 039 dan seterusnya.

format dikemas-switch-payload

Nama Format Deskripsi
ident ushort = 0x0100 mengidentifikasi pseudo-opcode
ukuran ushort jumlah entri dalam tabel
first_key int nilai case switch pertama (dan terendah)
target int [] daftar size target cabang relatif. Target relatif ke alamat opcode switch, bukan dari tabel ini.

Catatan: Jumlah total unit kode untuk instance tabel ini adalah (size * 2) + 4 .

format payload jarang-beralih-payload

Nama Format Deskripsi
ident ushort = 0x0200 mengidentifikasi pseudo-opcode
ukuran ushort jumlah entri dalam tabel
kunci int [] daftar nilai kunci size , diurutkan dari rendah ke tinggi
target int [] daftar size target cabang relatif, masing-masing sesuai dengan nilai kunci pada indeks yang sama. Target relatif ke alamat opcode switch, bukan dari tabel ini.

Catatan: Jumlah total unit kode untuk instance tabel ini adalah (size * 4) + 2 .

format isi-array-data-payload

Nama Format Deskripsi
ident ushort = 0x0300 mengidentifikasi pseudo-opcode
element_width ushort jumlah byte di setiap elemen
ukuran kamu tidak jumlah elemen dalam tabel
data ubyte [] nilai data

Catatan: Jumlah total unit kode untuk instance tabel ini adalah (size * element_width + 1) / 2 + 4 .

Rincian operasi matematika

Catatan: Operasi titik apung harus mengikuti aturan IEEE 754, menggunakan putaran ke bawah terdekat dan bertahap, kecuali jika dinyatakan sebaliknya.

Opcode C Semantik Catatan
neg-int int32 a;
hasil int32 = -a;
Unary twos-complement.
not-int int32 a;
int32 result = ~a;
Unary ones-complement.
neg-long int64 a;
int64 result = -a;
Unary twos-complement.
not-long int64 a;
int64 result = ~a;
Unary ones-complement.
neg-float float a;
float result = -a;
Floating point negation.
neg-double double a;
double result = -a;
Floating point negation.
int-to-long int32 a;
int64 result = (int64) a;
Sign extension of int32 into int64 .
int-to-float int32 a;
float result = (float) a;
Conversion of int32 to float , using round-to-nearest. This loses precision for some values.
int-to-double int32 a;
double result = (double) a;
Conversion of int32 to double .
long-to-int int64 a;
int32 result = (int32) a;
Truncation of int64 into int32 .
long-to-float int64 a;
float result = (float) a;
Conversion of int64 to float , using round-to-nearest. This loses precision for some values.
long-to-double int64 a;
double result = (double) a;
Conversion of int64 to double , using round-to-nearest. This loses precision for some values.
float-to-int float a;
int32 result = (int32) a;
Conversion of float to int32 , using round-toward-zero. NaN and -0.0 (negative zero) convert to the integer 0 . Infinities and values with too large a magnitude to be represented get converted to either 0x7fffffff or -0x80000000 depending on sign.
float-to-long float a;
int64 result = (int64) a;
Conversion of float to int64 , using round-toward-zero. The same special case rules as for float-to-int apply here, except that out-of-range values get converted to either 0x7fffffffffffffff or -0x8000000000000000 depending on sign.
float-to-double float a;
double result = (double) a;
Conversion of float to double , preserving the value exactly.
double-to-int double a;
int32 result = (int32) a;
Conversion of double to int32 , using round-toward-zero. The same special case rules as for float-to-int apply here.
double-to-long double a;
int64 result = (int64) a;
Conversion of double to int64 , using round-toward-zero. The same special case rules as for float-to-long apply here.
double-to-float double a;
float result = (float) a;
Conversion of double to float , using round-to-nearest. This loses precision for some values.
int-to-byte int32 a;
int32 result = (a << 24) >> 24;
Truncation of int32 to int8 , sign extending the result.
int-to-char int32 a;
int32 result = a & 0xffff;
Truncation of int32 to uint16 , without sign extension.
int-to-short int32 a;
int32 result = (a << 16) >> 16;
Truncation of int32 to int16 , sign extending the result.
add-int int32 a, b;
int32 result = a + b;
Twos-complement addition.
sub-int int32 a, b;
int32 result = a - b;
Twos-complement subtraction.
rsub-int int32 a, b;
int32 result = b - a;
Twos-complement reverse subtraction.
mul-int int32 a, b;
int32 result = a * b;
Twos-complement multiplication.
div-int int32 a, b;
int32 result = a / b;
Twos-complement division, rounded towards zero (that is, truncated to integer). This throws ArithmeticException if b == 0 .
rem-int int32 a, b;
int32 result = a % b;
Twos-complement remainder after division. The sign of the result is the same as that of a , and it is more precisely defined as result == a - (a / b) * b . This throws ArithmeticException if b == 0 .
and-int int32 a, b;
int32 result = a & b;
Bitwise AND.
or-int int32 a, b;
int32 result = a | b;
Bitwise OR.
xor-int int32 a, b;
int32 result = a ^ b;
Bitwise XOR.
shl-int int32 a, b;
int32 result = a << (b & 0x1f);
Bitwise shift left (with masked argument).
shr-int int32 a, b;
int32 result = a >> (b & 0x1f);
Bitwise signed shift right (with masked argument).
ushr-int uint32 a, b;
int32 result = a >> (b & 0x1f);
Bitwise unsigned shift right (with masked argument).
add-long int64 a, b;
int64 result = a + b;
Twos-complement addition.
sub-long int64 a, b;
int64 result = a - b;
Twos-complement subtraction.
mul-long int64 a, b;
int64 result = a * b;
Twos-complement multiplication.
div-long int64 a, b;
int64 result = a / b;
Twos-complement division, rounded towards zero (that is, truncated to integer). This throws ArithmeticException if b == 0 .
rem-long int64 a, b;
int64 result = a % b;
Twos-complement remainder after division. The sign of the result is the same as that of a , and it is more precisely defined as result == a - (a / b) * b . This throws ArithmeticException if b == 0 .
and-long int64 a, b;
int64 result = a & b;
Bitwise AND.
or-long int64 a, b;
int64 result = a | b;
Bitwise OR.
xor-long int64 a, b;
int64 result = a ^ b;
Bitwise XOR.
shl-long int64 a;
int32 b;
int64 result = a << (b & 0x3f);
Bitwise shift left (with masked argument).
shr-long int64 a;
int32 b;
int64 result = a >> (b & 0x3f);
Bitwise signed shift right (with masked argument).
ushr-long uint64 a;
int32 b;
int64 result = a >> (b & 0x3f);
Bitwise unsigned shift right (with masked argument).
add-float float a, b;
float result = a + b;
Floating point addition.
sub-float float a, b;
float result = a - b;
Floating point subtraction.
mul-float float a, b;
float result = a * b;
Floating point multiplication.
div-float float a, b;
float result = a / b;
Floating point division.
rem-float float a, b;
float result = a % b;
Floating point remainder after division. This function is different than IEEE 754 remainder and is defined as result == a - roundTowardZero(a / b) * b .
add-double double a, b;
double result = a + b;
Floating point addition.
sub-double double a, b;
double result = a - b;
Floating point subtraction.
mul-double double a, b;
double result = a * b;
Floating point multiplication.
div-double double a, b;
double result = a / b;
Floating point division.
rem-double double a, b;
double result = a % b;
Floating point remainder after division. This function is different than IEEE 754 remainder and is defined as result == a - roundTowardZero(a / b) * b .