Dalvik bayt kodu

Genel tasarım

  • Makine modeli ve çağrı kuralları, genel gerçek mimarileri ve C tarzı çağrı kurallarını yaklaşık olarak taklit etmek içindir:
    • Makine kayıt tabanlıdır ve çerçeveler oluşturulduktan sonra boyut olarak sabitlenir. Her çerçeve, belirli sayıda kayıttan (yönteme göre belirlenir) ve yöntemi yürütmek için gerekli olan (ancak bunlarla sınırlı olmayan) program sayacı ve yöntemi içeren .dex dosyasına bir referans gibi herhangi bir ek veriden oluşur. .
    • Bit değerleri (tam sayılar ve kayan nokta sayıları gibi) için kullanıldığında, yazmaçlar 32 bit genişliğinde kabul edilir. 64 bitlik değerler için bitişik kayıt çiftleri kullanılır. Kayıt çiftleri için hizalama gerekliliği yoktur.
    • Nesne referansları için kullanıldığında, kayıtların tam olarak böyle bir referansı tutacak kadar geniş olduğu kabul edilir.
    • Bitsel gösterim açısından, (Object) null == (int) 0 .
    • Bir yöntemin N bağımsız değişkeni, sırayla yöntemin çağırma çerçevesinin son N kaydında bulunur. Geniş argümanlar iki kayıt tüketir. Örnek yöntemleri, ilk argümanları olarak this referansına iletilir.
  • Komut akışındaki depolama birimi, 16 bitlik işaretsiz bir miktardır. Bazı komutlardaki bazı bitler yok sayılır/sıfır olmalıdır.
  • Talimatlar, belirli bir türle karşılıksız olarak sınırlı değildir. Örneğin, 32 bitlik kayıt değerlerini yorumlamadan hareket ettiren komutların, hareketli intler mi yoksa kayanlar mı olduklarını belirtmeleri gerekmez.
  • Dizelere, türlere, alanlara ve yöntemlere yapılan başvurular için ayrı ayrı numaralandırılmış ve dizine alınmış sabit havuzlar vardır.
  • Bit düzeyinde değişmez veriler, talimat akışında satır içi olarak temsil edilir.
  • Uygulamada, bir yöntemin 16'dan fazla kayda ihtiyaç duyması nadir olduğundan ve sekizden fazla kayda ihtiyaç duyması oldukça yaygın olduğundan, birçok talimat sadece ilk 16 kaydı adreslemekle sınırlıdır. Makul olarak mümkün olduğunda, talimatlar ilk 256 kayda kadar referanslara izin verir. Ek olarak, bazı komutların, v0move aralığındaki kayıtları v65535 bir çift tümünü yakalama talimatı da dahil olmak üzere, çok daha büyük kayıt sayılarına izin veren varyantları vardır. İstenen bir kaydı adreslemek için bir talimat değişkeninin mevcut olmadığı durumlarda, kayıt içeriğinin orijinal kayıttan düşük bir kayda taşınması (işlemden önce) ve/veya düşük sonuç kaydından yüksek bir kayda taşınması beklenir. kayıt olun (işlemden sonra).
  • Değişken uzunluklu veri yüklerini tutmak için kullanılan ve düzenli talimatlarla (örneğin, fill-array-data ) atıfta bulunulan birkaç "sözde talimat" vardır. Normal yürütme akışı sırasında bu tür talimatlarla asla karşılaşılmamalıdır. Ek olarak, talimatlar çift sayılı bayt kodu ofsetlerinde (yani, 4 bayt hizalı) bulunmalıdır. Bu gereksinimi karşılamak için, dex oluşturma araçları, böyle bir talimat aksi takdirde hizalanmayacaksa, aralayıcı olarak fazladan bir nop talimatı vermelidir. Son olarak, gerekli olmasa da, çoğu aracın bu talimatları yöntemlerin sonunda yayınlamayı seçmesi beklenir, çünkü aksi takdirde bunların etrafında dallanmak için ek talimatlara ihtiyaç duyulabilirdi.
  • Çalışan bir sisteme kurulduğunda, kurulum zamanı statik bağlantı optimizasyonu olarak bazı talimatlar değiştirilebilir ve formatları değiştirilir. Bu, bağlantı bilindiğinde daha hızlı yürütmeye izin vermek içindir. Önerilen varyantlar için ilgili talimat formatları belgesine bakın. "Önerilen" kelimesi bilinçli olarak kullanılır; bunları uygulamak zorunlu değildir.
  • İnsan sözdizimi ve anımsatıcılar:
    • Argümanlar için hedef-sonra-kaynak sıralaması.
    • Bazı işlem kodları, üzerinde çalıştıkları tür(ler)i belirtmek için belirsizliği gideren bir ad son ekine sahiptir:
      • Genel tip 32 bit işlem kodları işaretsizdir.
      • Genel tip 64 bit işlem kodlarının sonuna -wide eklenir.
      • Türe özgü işlem kodları, türleriyle (veya basit bir kısaltmayla) son ekler: -boolean -byte -char -short -int -long -float -double -string -object -void -class
    • Bazı işlem kodlarında, farklı talimat düzenleri veya seçenekleri olan, aksi takdirde özdeş işlemleri ayırt etmek için belirsizliği gideren bir sonek bulunur. Bu son ekler, ana adlardan bir eğik çizgi (" / ") ile ayrılır ve esas olarak, kodda yürütülebilir dosyaları oluşturan ve yorumlayan statik sabitlerle bire bir eşleme yapmak için (yani belirsizliği azaltmak için) bulunur. insanlar için).
    • Buradaki açıklamalarda, bir değerin genişliği (örneğin, bir sabitin aralığını veya adreslenebilecek kayıtların sayısını gösteren), dört bit genişlik başına bir karakter kullanılarak vurgulanır.
    • Örneğin, " move-wide/from16 vAA, vBBBB " talimatında:
      • " move ", temel işlemi gösteren temel işlem kodudur (bir kaydın değerini taşıma).
      • " wide ", geniş (64 bit) veriler üzerinde çalıştığını belirten ad son ekidir.
      • " from16 ", kaynak olarak 16 bitlik kayıt referansına sahip bir varyantı gösteren işlem kodu son ekidir.
      • " vAA ", v0v255 aralığında olması gereken hedef kaydıdır (işlem tarafından ima edilir; yine kural, hedef bağımsız değişkenlerinin her zaman önce gelmesidir).
      • " vBBBB ", v0v65535 aralığında olması gereken kaynak kaydıdır.
  • Çeşitli talimat formatları ("Op & Format" altında listelenmiştir) ve ayrıca opcode sözdizimi hakkında daha fazla ayrıntı için talimat formatları belgesine bakın.
  • Bayt kodunun büyük resme sığdığı yer hakkında daha fazla ayrıntı için .dex dosya biçimi belgesine bakın.

Bayt kodu kümesinin özeti

İşlem ve Biçim Anımsatıcı / Sözdizimi Argümanlar Tanım
00 10x hayır Atık döngüleri.

Not: Veri taşıyan sözde komutlar bu işlem koduyla etiketlenir, bu durumda işlem kodu biriminin yüksek sıralı baytı verilerin doğasını gösterir. Aşağıdaki " packed-switch-payload Formatı", " sparse-switch-payload Formatı" ve " fill-array-data-payload Formatı"na bakın.

01 12x vA, vB'yi hareket ettir A: hedef kayıt (4 bit)
B: kaynak kaydı (4 bit)
Nesne olmayan bir kaydın içeriğini diğerine taşıyın.
02 22x hareket/dan16 vAA, vBBBB A: hedef kayıt (8 bit)
B: kaynak kaydı (16 bit)
Nesne olmayan bir kaydın içeriğini diğerine taşıyın.
03 32x hareket/16 vAAAA, vBBBB A: hedef register (16 bit)
B: kaynak kaydı (16 bit)
Nesne olmayan bir kaydın içeriğini diğerine taşıyın.
04 12x hareket çapında vA, vB A: hedef kayıt çifti (4 bit)
B: kaynak kayıt çifti (4 bit)
Bir kayıt çiftinin içeriğini diğerine taşıyın.

Not: v N v N-1 veya v N+1 geçmek yasaldır, bu nedenle uygulamalar herhangi bir şey yazılmadan önce bir kayıt çiftinin her iki yarısının da okunmasını sağlamalıdır.

05 22x geniş hareket/dan16 vAA, vBBBB A: hedef kayıt çifti (8 bit)
B: kaynak kayıt çifti (16 bit)
Bir kayıt çiftinin içeriğini diğerine taşıyın.

Not: Uygulama konuları, yukarıdaki move-wide ile aynıdır.

06 32x geniş hareket/16 vAAAA, vBBBB A: hedef kayıt çifti (16 bit)
B: kaynak kayıt çifti (16 bit)
Bir kayıt çiftinin içeriğini diğerine taşıyın.

Not: Uygulama konuları, yukarıdaki move-wide ile aynıdır.

07 12x hareket nesnesi vA, vB A: hedef kayıt (4 bit)
B: kaynak kaydı (4 bit)
Nesne taşıyan bir kaydın içeriğini diğerine taşıyın.
08 22x hareket nesnesi/from16 vAA, vBBBB A: hedef kayıt (8 bit)
B: kaynak kaydı (16 bit)
Nesne taşıyan bir kaydın içeriğini diğerine taşıyın.
09 32x hareket nesnesi/16 vAAAA, vBBBB A: hedef register (16 bit)
B: kaynak kaydı (16 bit)
Nesne taşıyan bir kaydın içeriğini diğerine taşıyın.
0a 11x taşıma sonucu vAA A: hedef kayıt (8 bit) En son invoke- kind tek kelimelik nesne olmayan sonucunu belirtilen kayıt defterine taşıyın. Bu, (tek sözcük, nesne olmayan) sonucu göz ardı edilmeyecek bir invoke- kind hemen sonra talimat olarak yapılmalıdır; başka bir yer geçersizdir.
0b 11x hareket sonuç çapında vAA A: hedef kayıt çifti (8 bit) En son invoke- kind çift kelimeli sonucunu belirtilen kayıt çiftine taşıyın. Bu, (çift sözcük) sonucu göz ardı edilmeyecek bir invoke- kind hemen sonra talimat olarak yapılmalıdır; başka bir yer geçersizdir.
0c 11x taşıma-sonuç-nesne vAA A: hedef kayıt (8 bit) En son invoke- kind nesne sonucunu belirtilen kayıt defterine taşıyın. Bu, (nesne) sonucu göz ardı edilmeyecek olan bir invoke- kind veya filled-new-array hemen sonra talimat olarak yapılmalıdır; başka bir yer geçersizdir.
0 gün 11x hareket istisnası vAA A: hedef kayıt (8 bit) Yeni yakalanmış bir istisnayı verilen kayıt defterine kaydedin. Bu, yakalanan istisna göz ardı edilmeyecek herhangi bir istisna işleyicisinin ilk talimatı olmalıdır ve bu talimat yalnızca bir istisna işleyicisinin ilk talimatı olarak gerçekleşmelidir; başka bir yer geçersizdir.
0e 10x dönüş-boş Bir void yönteminden dönüş.
0f 11x dönüş vAA A: dönüş değeri kaydı (8 bit) Tek genişlikli (32 bit) nesne olmayan değer döndürme yönteminden dönüş.
10 11x dönüş çapında vAA A: dönüş değeri kayıt çifti (8 bit) Çift genişlikli (64 bit) değer döndürme yönteminden dönüş.
11 11x dönüş nesnesi vAA A: dönüş değeri kaydı (8 bit) Bir nesne döndürme yönteminden dönüş.
12 11n const/4 vA, #+B A: hedef kayıt (4 bit)
B: imzalı int (4 bit)
Verilen değişmez değeri (işaret-genişletilmiş 32 bite) belirtilen kayıt defterine taşıyın.
13 21s const/16 vAA, #+BBBB A: hedef kayıt (8 bit)
B: imzalı int (16 bit)
Verilen değişmez değeri (işaret-genişletilmiş 32 bite) belirtilen kayıt defterine taşıyın.
14 31i const vAA, #+BBBBBBBB A: hedef kayıt (8 bit)
B: keyfi 32 bit sabit
Verilen değişmez değeri belirtilen kayıt defterine taşıyın.
15 21 saat const/high16 vAA, #+BBBB0000 A: hedef kayıt (8 bit)
B: imzalı int (16 bit)
Verilen değişmez değeri (sağ-sıfır-32 bite genişletilmiş) belirtilen kayıt defterine taşıyın.
16 21s const-wide/16 vAA, #+BBBB A: hedef kayıt (8 bit)
B: imzalı int (16 bit)
Verilen değişmez değeri (işaret-64 bit'e genişletilmiş) belirtilen kayıt çiftine taşıyın.
17 31i const-wide/32 vAA, #+BBBBBBBB A: hedef kayıt (8 bit)
B: imzalı int (32 bit)
Verilen değişmez değeri (işaret-64 bit'e genişletilmiş) belirtilen kayıt çiftine taşıyın.
18 51l const-wide vAA, #+BBBBBBBBBBBBBBBB A: hedef kayıt (8 bit)
B: isteğe bağlı çift genişlikli (64 bit) sabit
Verilen değişmez değeri belirtilen kayıt çiftine taşıyın.
19 21s const-wide/high16 vAA, #+BBBB000000000000 A: hedef kayıt (8 bit)
B: imzalı int (16 bit)
Verilen değişmez değeri (sağ-sıfır-64 bit'e genişletilmiş) belirtilen kayıt çiftine taşıyın.
1a 21c const-string vAA, string@BBBB A: hedef kayıt (8 bit)
B: dizi dizini
Verilen dizin tarafından belirtilen dizeye bir başvuruyu belirtilen kayıt defterine taşıyın.
1b 31c const-string/jumbo vAA, string@BBBBBBBB A: hedef kayıt (8 bit)
B: dizi dizini
Verilen dizin tarafından belirtilen dizeye bir başvuruyu belirtilen kayıt defterine taşıyın.
1c 21c const-sınıfı vAA, type@BBBB A: hedef kayıt (8 bit)
B: tür indeksi
Verilen dizin tarafından belirtilen sınıfa bir başvuruyu belirtilen kayıt defterine taşıyın. Belirtilen türün ilkel olması durumunda, bu, ilkel türün dejenere sınıfına bir başvuru depolayacaktır.
1 gün 11x monitör-giriş vAA A: referans taşıyan kayıt (8 bit) Belirtilen nesne için monitörü edinin.
1e 11x monitörden çıkış vAA A: referans taşıyan kayıt (8 bit) Belirtilen nesne için monitörü serbest bırakın.

Not: Bu talimatın bir istisna oluşturması gerekiyorsa, bunu bilgisayar zaten talimatı geçmiş gibi yapmalıdır. Bunu, talimatın başarılı bir şekilde yürütülmesi (bir anlamda) ve istisnanın talimattan sonra ancak bir sonraki çalıştırma şansı elde etmeden önce atılması olarak düşünmek faydalı olabilir. Bu tanım, bir yöntemin, Thread.stop() tarihsel uygulaması nedeniyle ortaya çıkabilecek rastgele istisnaları ele almanın bir yolu olarak, o bloğun kendisi için monitör temizliği olarak bir monitör temizleme tümünü yakalama (örneğin, finally ) bloğunu kullanmasını mümkün kılar. Thread.stop() , yine de uygun izleme hijyenine sahip olmayı başarır.

1f 21c check-cast vAA, type@BBBB A: referans taşıyan kayıt (8 bit)
B: tür indeksi (16 bit)
Verilen kayıttaki referans belirtilen türe dönüştürülemiyorsa bir ClassCastException atın.

Not: A her zaman bir başvuru (ve ilkel bir değer değil) olması gerektiğinden, B ilkel bir türe atıfta bulunuyorsa, bu mutlaka çalışma zamanında başarısız olur (yani bir istisna atar).

20 22c vA, vB, type@CCCC örneği A: hedef kayıt (4 bit)
B: referans taşıyan kayıt (4 bit)
C: tür indeksi (16 bit)
Belirtilen referans verilen tipin bir örneğiyse, verilen hedef kaydı 1 veya değilse 0 saklayın.

Not: B her zaman bir başvuru (ve ilkel bir değer değil) olması gerektiğinden, C ilkel bir türe başvuruyorsa, bu her zaman 0 depolanmasıyla sonuçlanır.

21 12x dizi uzunluğu vA, vB A: hedef kayıt (4 bit)
B: dizi referans taşıyan kayıt (4 bit)
Belirtilen dizinin uzunluğunu verilen hedefte saklayın, girişlerde
22 21c yeni örnek vAA, type@BBBB A: hedef kayıt (8 bit)
B: tür indeksi
Hedefte buna bir referans depolayarak belirtilen türde yeni bir örnek oluşturun. Tür, dizi olmayan bir sınıfa başvurmalıdır.
23 22c yeni dizi vA, vB, type@CCCC A: hedef kayıt (4 bit)
B: boyut kaydı
C: dizini yazın
Belirtilen tür ve boyutta yeni bir dizi oluşturun. Tür, bir dizi türü olmalıdır.
24 35c doldurulmuş-yeni-dizi {vC, vD, vE, vF, vG}, type@BBBB A: dizi boyutu ve bağımsız değişken kelime sayısı (4 bit)
B: tür indeksi (16 bit)
C..G: argüman kayıtları (her biri 4 bit)
Verilen içerikle doldurarak, verilen tür ve boyutta bir dizi oluşturun. Tür, bir dizi türü olmalıdır. Dizinin içeriği tek sözcüklü olmalıdır (yani, long veya double dizileri olmamalıdır, ancak başvuru türleri kabul edilebilir). Oluşturulan örnek, yöntem çağırma talimatlarının sonuçlarını depolamasıyla aynı şekilde bir "sonuç" olarak depolanır, bu nedenle oluşturulan örnek, hemen takip eden bir move-result-object talimatıyla (eğer kullanılacaksa) bir kayıt defterine taşınmalıdır. ).
25 3rc doldurulmuş-yeni-dizi/aralık {vCCCC .. vNNNN}, type@BBBB A: dizi boyutu ve bağımsız değişken kelime sayısı (8 bit)
B: tür indeksi (16 bit)
C: ilk argüman kaydı (16 bit)
N = A + C - 1
Verilen içerikle doldurarak, verilen tür ve boyutta bir dizi oluşturun. Açıklamalar ve kısıtlamalar, yukarıda açıklanan filled-new-array ile aynıdır.
26 31t fill-array-data vAA, +BBBBBBBB (aşağıda " fill-array-data-payload Format"ta belirtilen ek verilerle birlikte) A: dizi referansı (8 bit)
B: tablo verisi sözde talimatına göre işaretli "dal" ofseti (32 bit)
Verilen diziyi belirtilen verilerle doldurun. Referans, bir ilkel dizisine olmalıdır ve veri tablosu, onunla tür olarak eşleşmeli ve diziye sığacak olandan daha fazla öğe içermemelidir. Diğer bir deyişle, dizi tablodan daha büyük olabilir ve eğer öyleyse, dizinin yalnızca başlangıç ​​öğeleri ayarlanır, kalanlar yalnız bırakılır.
27 11x vAA atmak A: istisna taşıyan kayıt (8 bit)
Belirtilen istisnayı atın.
28 10t +AA'ya git A: imzalı şube ofseti (8 bit) Koşulsuz olarak belirtilen talimata atlayın.

Not: Dal ofseti 0 olmamalıdır. (Bir döndürme döngüsü yasal olarak goto/32 ile veya daldan önce bir hedef olarak bir nop dahil edilerek oluşturulabilir.)

29 20t git/16 +AAAA A: imzalı dal ofseti (16 bit)
Koşulsuz olarak belirtilen talimata atlayın.

Not: Dal ofseti 0 olmamalıdır. (Bir döndürme döngüsü yasal olarak goto/32 ile veya daldan önce bir hedef olarak bir nop dahil edilerek oluşturulabilir.)

2a 30t git/32 +AAAAAAAA A: imzalı şube ofseti (32 bit)
Koşulsuz olarak belirtilen talimata atlayın.
2b 31t paket anahtarlı vAA, +BBBBBBBB (aşağıda " packed-switch-payload Formatında" belirtilen ek verilerle birlikte) A: test etmek için kaydolun
B: tablo verisi sözde talimatına göre işaretli "dal" ofseti (32 bit)
Belirli bir integral aralığındaki her bir değere karşılık gelen bir ofset tablosu kullanarak verilen kayıttaki değere dayalı yeni bir talimata atlayın veya eşleşme yoksa bir sonraki talimata geçin.
2c 31t seyrek anahtarlı vAA, +BBBBBBBB (aşağıda " sparse-switch-payload Biçimi"nde belirtilen ek verilerle birlikte) A: test etmek için kaydolun
B: tablo verisi sözde talimatına göre işaretli "dal" ofseti (32 bit)
Sıralı bir değer-ofset çiftleri tablosu kullanarak, verilen kayıttaki değere dayalı olarak yeni bir talimata atlayın veya eşleşme yoksa bir sonraki talimata geçin.
2d..31 23x cmp türü vAA, vBB, vCC
2d: cmpl-float (lt sapma)
2e: cmpg-float (gt önyargı)
2f: cmpl-double (lt sapma)
30: cmpg-double (gt önyargı)
31: cmp uzunluğunda
A: hedef kayıt (8 bit)
B: ilk kaynak kaydı veya çifti
C: ikinci kaynak kaydı veya çifti
Belirtilen kayan nokta veya long karşılaştırmayı gerçekleştirin, b == c ise a 0 , b > c ise 1 veya b < c ise -1 ayarlayın. Kayan nokta işlemleri için listelenen "önyargı", NaN karşılaştırmalarının nasıl ele alındığını gösterir: NaN karşılaştırmaları için "gt önyargı" komutları 1 döndürür ve "lt sapma" komutları -1 döndürür.

Örneğin, kayan nokta x < y olup olmadığını kontrol etmek için cmpg-float kullanılması tavsiye edilir; -1 sonucu, testin doğru olduğunu ve diğer değerler, geçerli bir karşılaştırma nedeniyle veya değerlerden birinin NaN olması nedeniyle yanlış olduğunu gösterir.

32..37 22t if- testi vA, vB, +CCCC
32: if-eq
33: eğer-ne
34: if-lt
35: eğer-ge
36: if-gt
37: eğer-le
A: test etmek için ilk kayıt (4 bit)
B: test edilecek ikinci kayıt (4 bit)
C: işaretli dal ofseti (16 bit)
Verilen iki kaydın değerleri belirtilen şekilde karşılaştırılırsa, verilen hedefe dallanır.

Not: Dal ofseti 0 olmamalıdır. (Bir dönüş döngüsü yasal olarak ya geriye doğru bir gidiş etrafında goto ya da daldan önce bir hedef olarak bir nop dahil edilerek oluşturulabilir.)

38..3d 21t if- z testi vAA, +BBBB
38: if-eqz
39: if-nez
3a: if-ltz
3b: if-gez
3c: if-gtz
3d: if-lez
A: test etmek için kaydolun (8 bit)
B: işaretli dal ofseti (16 bit)
Verilen kaydın değeri belirtildiği gibi 0 ile karşılaştırılırsa, verilen hedefe dallanır.

Not: Dal ofseti 0 olmamalıdır. (Bir dönüş döngüsü yasal olarak ya geriye doğru bir gidiş etrafında goto ya da daldan önce bir hedef olarak bir nop dahil edilerek oluşturulabilir.)

3e..43 10x (kullanılmamış) (kullanılmamış)
44..51 23x Arrayop vAA, vBB, vCC
44: yaş
45: yaş çapında
46: aget-nesne
47: aget-boole
48: aget-bayt
49: aget-char
4a: aget-kısa
4b: aput
4c: geniş kapsamlı
4d: aput-nesne
4e: aput-boole
4f: aput-bayt
50: aput-char
51: aput-kısa
A: değer kaydı veya çifti; kaynak veya hedef olabilir (8 bit)
B: dizi kaydı (8 bit)
C: dizin kaydı (8 bit)
Belirlenen dizi işlemini, verilen dizinin tanımlanmış dizininde gerçekleştirin, değer kaydına yükleyin veya depolayın.
52.5f 22c i instanceop vA, vB, field@CCCC
52: iget
53: iget çapında
54: iget nesnesi
55: iget-boole
56: iget-bayt
57: iget-char
58: iget-kısa
59: giriş
5a: giriş çapında
5b: iput nesnesi
5c: iput-boole
5d: iput-bayt
5e: iput-char
5f: giriş-kısa
A: değer kaydı veya çifti; kaynak veya hedef olabilir (4 bit)
B: nesne kaydı (4 bit)
C: örnek alan referans dizini (16 bit)
Tanımlanan nesne örneği alan işlemini tanımlanan alanla gerçekleştirin, değer kaydına yükleyin veya kaydedin.

Not: Bu işlem kodları, statik bağlantı için makul adaylardır ve alan argümanını daha doğrudan bir ofset olacak şekilde değiştirir.

60..6d 21c s staticop vAA, alan@BBBB
60: sget
61: geniş kapsamlı
62: sget-nesne
63: sget-boole
64: sget-bayt
65: sget-char
66: sget-kısa
67: tükürmek
68: geniş ağızlı
69: tükürük nesnesi
6a: boolean
6b: sput-bayt
6c: sput-char
6d: kısa
A: değer kaydı veya çifti; kaynak veya hedef olabilir (8 bit)
B: statik alan referans indeksi (16 bit)
Tanımlanan nesne statik alan işlemini tanımlanan statik alanla gerçekleştirin, değer kaydına yükleyin veya kaydedin.

Not: Bu işlem kodları, statik bağlantı için makul adaylardır ve alan argümanını daha doğrudan bir ofset olacak şekilde değiştirir.

6e..72 35c çağırma türü {vC, vD, vE, vF, vG}, meth@BBBB
6e: invoke-sanal
6f: süper çağırma
70: doğrudan çağırma
71: invoke-statik
72: çağırma arayüzü
A: argüman kelime sayısı (4 bit)
B: metot referans indeksi (16 bit)
C..G: argüman kayıtları (her biri 4 bit)
Belirtilen yöntemi çağırın. Sonuç (varsa), hemen sonraki talimat olarak uygun bir move-result* varyantı ile saklanabilir.

invoke-virtual normal bir sanal yöntemi ( private , static veya final olmayan ve aynı zamanda yapıcı olmayan bir yöntem) çağırmak için kullanılır.

method_id , arabirim olmayan bir sınıfın yöntemine başvurduğunda, en yakın üst sınıfın sanal yöntemini çağırmak için invoke-super kullanılır (çağıran sınıfta aynı method_id sahip olanın aksine). invoke-virtual ile aynı yöntem kısıtlamaları geçerlidir.

Dex dosyaları sürüm 037 veya sonraki sürümlerde, method_id bir arabirim yöntemine atıfta bulunuyorsa, bu arabirimde tanımlanan yöntemin en belirgin, geçersiz kılınmamış sürümünü çağırmak için invoke-super kullanılır. invoke-virtual ile aynı yöntem kısıtlamaları geçerlidir. 037 sürümünden önceki Dex dosyalarında, method_id arabirimine sahip olmak yasa dışıdır ve tanımsızdır.

invoke-direct , static olmayan bir doğrudan yöntemi (yani, doğası gereği geçersiz kılınamayan bir örnek yöntemi, yani bir private örnek yöntemi veya bir kurucu) çağırmak için kullanılır.

invoke-static , static bir yöntemi (her zaman doğrudan bir yöntem olarak kabul edilir) çağırmak için kullanılır.

invoke-interface , bir interface yöntemini çağırmak için kullanılır, yani somut sınıfı bilinmeyen bir nesne üzerinde, bir interface atıfta bulunan bir method_id kullanarak.

Not: Bu işlem kodları, yöntem argümanını daha doğrudan bir ofset (veya bunun bir çifti) olacak şekilde değiştirerek, statik bağlantı için makul adaylardır.

73 10x (kullanılmamış) (kullanılmamış)
74..78 3rc invoke- tür /aralık {vCCCC .. vNNNN}, meth@BBBB
74: invoke-sanal/aralık
75: çağırma-süper/aralık
76: doğrudan çağırma/aralık
77: invoke-static/aralık
78: çağırma arayüzü/aralığı
A: argüman kelime sayısı (8 bit)
B: metot referans indeksi (16 bit)
C: ilk argüman kaydı (16 bit)
N = A + C - 1
Belirtilen yöntemi çağırın. Ayrıntılar, uyarılar ve öneriler için yukarıdaki ilk invoke- kind açıklamasına bakın.
79..7a 10x (kullanılmamış) (kullanılmamış)
7b..8f 12x açma vA, vB
7b: neg-int
7c: int değil
7d: neg-uzun
7e: uzun değil
7f: negatif şamandıra
80: negatif-çift
81: int-to-long
82: int-to-float
83: int-to-double
84: uzun-int
85: uzun yüzer
86: uzundan çifte
87: float-to-int
88: şamandıradan uzuna
89: şamandıradan çifte
8a: double-to-int
8b: ikiden uzuna
8c: çift yüzer
8d: int-to-byte
8e: karakterden karaktere
8f: int-kısa
A: hedef kayıt veya çift (4 bit)
B: kaynak kaydı veya çifti (4 bit)
Belirlenen tekli işlemi kaynak kaydında gerçekleştirin, sonucu hedef kaydında saklayın.
90..af 23x binop vAA, vBB, vCC
90: ekleme
91: alt int
92: çoklu-int
93: div-int
94: kalan
95: ve-int
96: or-int
97: xor-int
98: shl-int
99: shr-int
9a: ushr-int
9b: uzun ekleme
9c: alt uzun
9d: çok uzun
9e: div-uzun
9f: rem-uzun
a0: ve-uzun
a1: veya-uzun
a2: xor-uzun
a3: shl-uzun
a4: shr-uzun
a5: ushr-uzun
a6: ekleme-şamandıra
a7: alt şamandıra
a8: çoklu şamandıra
a9: div-şamandıra
aa: yeniden yüzer
ab: çift ekle
ac: alt çift
reklam: mul-double
ae: div-double
af: rem-double
A: hedef kayıt veya çift (8 bit)
B: ilk kaynak kaydı veya çifti (8 bit)
C: ikinci kaynak kaydı veya çifti (8 bit)
Belirlenen ikili işlemi iki kaynak kaydında gerçekleştirin ve sonucu hedef kaydında saklayın.

Not: Diğer -long matematiksel işlemlerin (hem birinci hem de ikinci kaynakları için kayıt çiftleri alan) aksine, shl- shl-long , shr-long ve ushr-long ilk kaynakları için bir kayıt çifti alır (kaydırılacak değer ), ancak ikinci kaynakları için tek bir kayıt (kaydırma mesafesi).

b0..cf 12x binop /2addr vA, vB
b0: eklenti/2addr
b1: alt int/2addr
b2: çoklu int/2addr
b3: div-int/2addr
b4: kalan int/2addr
b5: ve-int/2addr
b6: or-int/2addr
b7: xor-int/2addr
b8: shl-int/2addr
b9: shr-int/2addr
ba: ushr-int/2addr
bb: ekleme-uzun/2addr
bc: alt-uzun/2addr
bd: çok uzun/2addr
olmak: div-uzun/2addr
bf: rem-uzun/2addr
c0: ve-uzun/2addr
c1: veya-uzun/2addr
c2: xor-uzun/2addr
c3: shl-uzun/2addr
c4: shr-uzun/2addr
c5: ushr-uzun/2addr
c6: add-float/2addr
c7: alt şamandıra/2addr
c8: çoklu şamandıra/2addr
c9: div-şamandıra/2addr
ca: rem-float/2addr
cb: add-double/2addr
cc: alt-double/2addr
cd: mul-double/2addr
ce: div-çift/2addr
bkz: rem-double/2addr
A: hedef ve ilk kaynak kaydı veya çifti (4 bit)
B: ikinci kaynak kaydı veya çifti (4 bit)
Belirlenen ikili işlemi iki kaynak kaydında gerçekleştirin, sonucu ilk kaynak kaydında saklayın.

Not: Diğer -long/2addr matematiksel işlemlerinin (hem hedef/ilk kaynağı hem de ikinci kaynağı için kayıt çiftleri alan) aksine, shl-long/2addr , shr-long/2addr ve ushr-long/2addr bir kayıt alır hedef/ilk kaynak (kaydırılacak değer) için çift, ancak ikinci kaynakları (değiştirme mesafesi) için tek bir kayıt.

d0..d7 22s binop /lit16 vA, vB, #+CCCC
d0: eklenti/lit16
d1: rsub-int (ters çıkarma)
d2: çoklu-int/lit16
d3: div-int/lit16
d4: rem-int/lit16
d5: ve-int/lit16
d6: or-int/lit16
d7: xor-int/lit16
A: hedef kayıt (4 bit)
B: kaynak kaydı (4 bit)
C: imzalı int sabiti (16 bit)
Belirtilen kayıt (birinci bağımsız değişken) ve değişmez değer (ikinci bağımsız değişken) üzerinde belirtilen ikili işlemi gerçekleştirin ve sonucu hedef kaydında saklayın.

Not: Bu sürüm ailesinin ana işlem kodu olduğundan rsub-int bir son eki yoktur. Ayrıca, semantiğiyle ilgili ayrıntılar için aşağıya bakın.

d8..e2 22b binop /lit8 vAA, vBB, #+CC
d8: eklenti/lit8
d9: rsub-int/lit8
da: mul-int/lit8
db: div-int/lit8
dc: rem-int/lit8
dd: ve-int/lit8
de: or-int/lit8
df: xor-int/lit8
e0: shl-int/lit8
e1: shr-int/lit8
e2: ushr-int/lit8
A: hedef kayıt (8 bit)
B: kaynak kaydı (8 bit)
C: imzalı int sabiti (8 bit)
Belirtilen kayıt (birinci bağımsız değişken) ve değişmez değer (ikinci bağımsız değişken) üzerinde belirtilen ikili işlemi gerçekleştirin ve sonucu hedef kaydında saklayın.

Not: rsub-int semantiğiyle ilgili ayrıntılar için aşağıya bakın.

e3..f9 10x (kullanılmamış) (kullanılmamış)
45cc invoke-polimorfik {vC, vD, vE, vF, vG}, meth@BBBB, proto@HHHH A: argüman kelime sayısı (4 bit)
B: metot referans indeksi (16 bit)
C: alıcı (4 bit)
D..G: bağımsız değişken kayıtları (her biri 4 bit)
H: prototip referans indeksi (16 bit)
Belirtilen imza polimorfik yöntemini çağırın. Sonuç (varsa), hemen sonraki talimat olarak uygun bir move-result* varyantı ile saklanabilir.

Yöntem başvurusu, java.lang.invoke.MethodHandle.invoke veya java.lang.invoke.MethodHandle.invokeExact gibi bir imza polimorfik yöntemine olmalıdır.

Alıcı, çağrılan imza polimorfik yöntemini destekleyen bir nesne olmalıdır.

Prototip başvurusu, sağlanan bağımsız değişken türlerini ve beklenen dönüş türünü açıklar.

invoke-polymorphic bayt kodu, yürütüldüğünde istisnalar oluşturabilir. İstisnalar, çağrılan imza polimorfik yöntemi için API belgelerinde açıklanmıştır.

Sürüm 038 itibaren Dex dosyalarında bulunur.
fb 4rcc invoke-polimorfik/aralık {vCCCC .. vNNNN}, meth@BBBB, proto@HHHH A: argüman kelime sayısı (8 bit)
B: metot referans indeksi (16 bit)
C: alıcı (16 bit)
H: prototip referans indeksi (16 bit)
N = A + C - 1
Belirtilen yöntem tanıtıcısını çağırın. Ayrıntılar için yukarıdaki invoke-polymorphic açıklamaya bakın.

Sürüm 038 itibaren Dex dosyalarında bulunur.
fc 35c invoke-özel {vC, vD, vE, vF, vG}, call_site@BBBB A: argüman kelime sayısı (4 bit)
B: site referans dizinini çağır (16 bit)
C..G: argüman kayıtları (her biri 4 bit)
Belirtilen çağrı sitesini çözer ve çağırır. Çağırmanın sonucu (varsa), hemen sonraki talimat olarak uygun bir move-result* varyantı ile saklanabilir.

Bu talimat iki aşamada yürütülür: arama sitesi çözümlemesi ve arama sitesi çağırma.

Çağrı sitesi çözümlemesi, belirtilen çağrı sitesinin ilişkili bir java.lang.invoke.CallSite örneğine sahip olup olmadığını kontrol eder. Değilse, belirtilen çağrı sitesi için önyükleme bağlayıcı yöntemi, DEX dosyasında bulunan bağımsız değişkenler kullanılarak çağrılır (bkz. call_site_item ). Önyükleme bağlayıcı yöntemi, herhangi bir ilişki yoksa belirtilen çağrı sitesiyle ilişkilendirilecek bir java.lang.invoke.CallSite örneği döndürür. İlişkilendirmeyi ilk önce başka bir iş parçacığı yapmış olabilir ve eğer öyleyse talimatın yürütülmesi ilk ilişkili java.lang.invoke.CallSite örneğiyle devam eder.

Çağrı sitesi çağrısı, çözümlenen java.lang.invoke.CallSite örneğinin java.lang.invoke.MethodHandle hedefinde yapılır. Hedef, yöntem tanıtıcısı ve tam bir yöntem tanıtıcı çağrısına ilişkin bağımsız değişkenler olarak invoke-custom yönergeye ilişkin bağımsız değişkenler kullanılarak, invoke-polymorphic (yukarıda açıklanmıştır) yürütülüyormuş gibi çağrılır.

Önyükleme bağlayıcı yöntemi tarafından oluşturulan özel durumlar bir java.lang.BootstrapMethodError içine sarılır. Bir BootstrapMethodError ayrıca şu durumlarda ortaya çıkar:
  • önyükleme bağlayıcı yöntemi bir java.lang.invoke.CallSite örneğini döndüremiyor.
  • döndürülen java.lang.invoke.CallSite , null bir yöntem tanıtıcı hedefine sahip.
  • yöntem tanıtıcı hedefi istenen türde değil.
Sürüm 038 itibaren Dex dosyalarında bulunur.
fd 3rc invoke-özel/aralık {vCCCC .. vNNNN}, call_site@BBBB A: argüman kelime sayısı (8 bit)
B: site referans dizinini çağır (16 bit)
C: ilk argüman kaydı (16-bit)
N = A + C - 1
Bir çağrı sitesini çözün ve çağırın. Ayrıntılar için yukarıdaki invoke-custom açıklamasına bakın.

Sürüm 038 itibaren Dex dosyalarında bulunur.
fe 21c const-method-handle vAA, method_handle@BBBB A: hedef kayıt (8 bit)
B: yöntem tanıtıcı dizini (16 bit)
Verilen dizin tarafından belirtilen yöntem tanıtıcısına bir başvuruyu belirtilen kayıt defterine taşıyın.

Sürüm 039 itibaren Dex dosyalarında bulunur.
ff 21c const-yöntem tipi vAA, proto@BBBB A: hedef kayıt (8 bit)
B: yöntem prototip referansı (16 bit)
Verilen dizin tarafından belirtilen yöntem prototipine bir başvuruyu belirtilen kayıt defterine taşıyın.

Sürüm 039 itibaren Dex dosyalarında bulunur.

paketlenmiş-anahtar-yük formatı

İsim Biçim Tanım
kimlik kısa = 0x0100 sözde işlem kodunu belirleme
boyut kısa tablodaki giriş sayısı
ilk_anahtar int ilk (ve en düşük) anahtar durumu değeri
hedefler int[] size göreli dal hedefleri listesi. Hedefler, bu tablonun değil, anahtar işlem kodunun adresine göredir.

Not: Bu tablonun bir örneği için toplam kod birimi sayısı (size * 2) + 4 .

seyrek anahtarlı yük biçimi

İsim Biçim Tanım
kimlik kısa = 0x0200 sözde işlem kodunu belirleme
boyut kısa tablodaki giriş sayısı
anahtarlar int[] düşükten yükseğe sıralanmış size anahtar değerlerinin listesi
hedefler int[] her biri aynı dizindeki anahtar değere karşılık gelen size göreli dal hedefleri listesi. Hedefler, bu tablonun değil, anahtar işlem kodunun adresine göredir.

Not: Bu tablonun bir örneği için toplam kod birimi sayısı (size * 4) + 2 .

dolgu-dizi-veri-yük formatı

İsim Biçim Tanım
kimlik kısa = 0x0300 sözde işlem kodunu belirleme
element_width kısa her elemandaki bayt sayısı
boyut uint tablodaki eleman sayısı
veri ubyte[] veri değerleri

Not: Bu tablonun bir örneği için toplam kod birimi sayısı (size * element_width + 1) / 2 + 4 .

Matematiksel işlem detayları

Not: Kayan nokta işlemleri, aksi belirtilmedikçe, en yakına yuvarlak ve kademeli alt akış kullanan IEEE 754 kurallarına uymalıdır.

işlem kodu C Semantik Notlar
olumsuz-int int32a;
int32 sonuç = -a;
Tekli ikili-tamamlayıcı.
int değil int32a;
int32 sonuç = ~a;
Tekli olanlar-tamamlayıcı.
neg-uzun int64a;
int64 sonucu = -a;
Tekli ikili-tamamlayıcı.
uzun değil int64a;
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 .