Dalvik bayt kodu formatı

Genel tasarım

  • Makine modeli ve çağrı kuralları, ortak gerçek mimarileri ve C tarzı çağrı kurallarını yaklaşık olarak taklit etmeyi amaçlamaktadır:
    • Makine kayıt tabanlıdır ve çerçevelerin boyutu oluşturulduktan sonra sabitlenir. Her çerçeve, belirli sayıda kayıttan (yöntem tarafından belirtilen) ve ayrıca yöntemi yürütmek için gereken program sayacı ve yöntemi içeren .dex dosyasına bir referans gibi (ancak bunlarla sınırlı olmamak üzere) herhangi bir yardımcı veriden oluşur. .
    • Bit değerleri (tamsayılar ve kayan nokta sayıları gibi) için kullanıldığında, kayıtların 32 bit genişliğinde olduğu kabul edilir. Bitişik kayıt çiftleri 64 bitlik değerler için 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.
    • Bit düzeyinde gösterim açısından, (Object) null == (int) 0 .
    • Bir yöntemin N argümanı, sırasıyla yöntemin çağırma çerçevesinin son N kaydına yerleştirilir. Geniş argümanlar iki kayıt tüketir. Örnek yöntemler this referansına ilk argümanları olarak iletilir.
  • Talimat akışındaki depolama birimi 16 bitlik işaretsiz bir miktardır. Bazı talimatlardaki bazı bitler göz ardı edilir/sıfır olmalıdır.
  • Talimatlar sebepsiz yere belirli bir türle sınırlı değildir. Örneğin, 32 bitlik kayıt değerlerini yorumsuz olarak taşıyan talimatların, bunların int'leri mi yoksa kayan noktaları mı taşıdığını belirtmesi gerekmez.
  • Dizelere, türlere, alanlara ve yöntemlere yapılan başvurular için ayrı ayrı numaralandırılmış ve dizine eklenmiş sabit havuzlar vardır.
  • Bit düzeyinde değişmez veriler, talimat akışında satır içi olarak temsil edilir.
  • Pratikte bir yöntemin 16'dan fazla kayda ihtiyaç duyması alışılmadık bir durum olduğundan ve sekizden fazla kayda ihtiyaç duyulması oldukça yaygın olduğundan , birçok talimat yalnızca ilk 16 kaydın adreslenmesiyle sınırlıdır. Makul bir şekilde mümkün olduğunda, talimatlar ilk 256 kayda kadar referanslara izin verir. Ek olarak, bazı talimatların, v0v65535 aralığındaki kayıtları adresleyebilen bir çift tümünü yakala move talimatı da dahil olmak üzere, çok daha büyük kayıt sayılarına izin veren çeşitleri vardır. İstenilen bir kaydı adreslemek için bir talimat varyantının mevcut olmadığı durumlarda, kayıt içeriğinin orijinal kayıttan düşük bir kayda (işlemden önce) taşınması 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 normal talimatlarla (örneğin, fill-array-data ) anılan 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ın çift sayılı bayt kodu uzaklıklarına (yani 4 bayt hizalanmış) yerleştirilmesi gerekir. Bu gereksinimi karşılamak için, deks oluşturma araçlarının, eğer böyle bir talimat aksi takdirde hizasız olacaksa, aralayıcı olarak ekstra bir nop talimatı yayınlaması gerekir. Son olarak, zorunlu olmasa da, çoğu aracın yöntemlerin sonunda bu talimatları yayınlamayı seçmesi beklenir, aksi takdirde muhtemelen bunların etrafında dallanmak için ek talimatlara ihtiyaç duyulacaktır.
  • Çalışan bir sisteme kurulduğunda, kurulum sırasında statik bağlantı optimizasyonu olarak bazı talimatlar formatlarını değiştirerek değiştirilebilir. Bunun amacı, bağlantı bilindiğinde daha hızlı yürütmeye olanak sağlamaktır. Önerilen çeşitler için ilgili talimat formatları belgesine bakın. "Önerilen" kelimesi bilinçli olarak kullanılmıştır; bunların uygulanması zorunlu değildir.
  • İnsan sözdizimi ve anımsatıcılar:
    • Bağımsız değişkenler için önce hedef sonra kaynak sıralaması.
    • Bazı işlem kodlarının, üzerinde çalıştıkları tür(ler)i belirtmek için belirsizliği ortadan kaldıran bir ad son eki vardır:
      • Genel tip 32 bitlik işlem kodları işaretlenmemiştir.
      • Genel tür 64 bit işlem kodlarının sonuna -wide eklenir.
      • Türe özgü işlem kodlarının sonuna, aşağıdakilerden biri olan tür (veya basit bir kısaltma) eklenir: -boolean -byte -char -short -int -long -float -double -object -string -class -void .
    • Bazı işlem kodlarında, farklı talimat düzenleri veya seçenekleri olan, aslında aynı olan işlemleri ayırt etmek için belirsizliği ortadan kaldıran bir son ek bulunur. Bu son ekler, ana adlardan bir eğik çizgi (" / ") ile ayrılır ve esas olarak yürütülebilir dosyaları oluşturan ve yorumlayan kodda statik sabitlerle bire bir eşleme sağlamak (yani belirsizliği azaltmak) için mevcuttur. insanlar için).
    • Buradaki açıklamalarda, bir değerin genişliği (örneğin, bir sabitin aralığını veya muhtemelen adreslenen kayıtların sayısını gösteren), genişliğin dört biti başına bir karakterin kullanılmasıyla vurgulanır.
    • Örneğin, " move-wide/from16 vAA, vBBBB " talimatında:
      • " move " temel işlemi belirten temel işlem kodudur (bir kaydın değerini taşıyın).
      • " wide " geniş (64 bit) veriler üzerinde çalıştığını belirten isim ekidir.
      • " from16 ", kaynak olarak 16 bitlik kayıt referansına sahip bir değişkeni belirten 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ı ("İşlem ve Format" altında listelenmiştir) ve işlem kodu sözdizimiyle ilgili ayrıntılar hakkında daha fazla ayrıntı için talimat formatları belgesine bakın.
  • Bayt kodunun büyük resimde nereye uyduğu hakkında daha fazla ayrıntı için .dex dosya formatı belgesine bakın.

Bayt kodu kümesinin özeti

Operasyon ve Format Anımsatıcı / Sözdizimi Argümanlar Tanım
00 10x hayır Atık döngüleri.

Not: Veri taşıyan sözde talimatlar bu işlem koduyla etiketlenir; bu durumda işlem kodu biriminin yüksek sıralı baytı, verinin 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 taşı A: hedef kaydı (4 bit)
B: kaynak kaydı (4 bit)
Nesne olmayan bir kaydın içeriğini diğerine taşıyın.
02 22x hareket/16 vAA'dan, vBBBB A: hedef kaydı (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 kaydı (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, dolayısıyla uygulamalar herhangi bir şey yazılmadan önce kayıt çiftinin her iki yarısının da okunmasını sağlamalıdır.

05 22x geniş hareket/16 vAA'dan itibaren, 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: Uygulamayla ilgili hususlar 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: Uygulamayla ilgili hususlar yukarıdaki move-wide ile aynıdır.

07 12x nesneyi taşıma vA, vB A: hedef kaydı (4 bit)
B: kaynak kaydı (4 bit)
Bir nesne taşıyan yazmacın içeriğini diğerine taşıyın.
08 22x nesneyi taşı/16 vAA'dan, vBBBB A: hedef kaydı (8 bit)
B: kaynak kaydı (16 bit)
Bir nesne taşıyan yazmacın içeriğini diğerine taşıyın.
09 32x nesneyi taşı/16 vAAAA, vBBBB A: hedef kaydı (16 bit)
B: kaynak kaydı (16 bit)
Bir nesne taşıyan yazmacın içeriğini diğerine taşıyın.
0a 11x hareket sonucu vAA A: hedef kaydı (8 bit) En son invoke- kind tek sözcüklü nesne olmayan sonucunu belirtilen kayda taşıyın. Bu, (tek kelimeli, nesnesiz) sonucu göz ardı edilmemesi gereken bir invoke- kind hemen ardından gelen talimat olarak yapılmalıdır; başka herhangi bir yer geçersizdir.
0b 11x sonuç çapında vAA'yı taşı A: hedef kayıt çifti (8 bit) En son invoke- kind çift kelimeli sonucunu belirtilen kayıt çiftine taşıyın. Bu, (çift kelimeli) sonucu göz ardı edilmemesi gereken bir invoke- kind hemen sonraki talimat olarak yapılmalıdır; başka herhangi bir yer geçersizdir.
0c 11x sonuç nesnesini taşı vAA A: hedef kaydı (8 bit) En son invoke- kind nesne sonucunu belirtilen kayda taşıyın. Bu, (nesne) sonucu göz ardı edilmemesi gereken bir invoke- kind veya filled-new-array hemen sonra talimat olarak yapılmalıdır; başka herhangi bir yer geçersizdir.
0d 11x taşıma istisnası vAA A: hedef kaydı (8 bit) Yeni yakalanan bir istisnayı verilen kayda kaydedin. Bu, yakalanan istisnanın göz ardı edilmemesi gereken herhangi bir istisna işleyicinin ilk talimatı olmalıdır ve bu talimat yalnızca bir istisna gidericinin ilk talimatı olarak gerçekleşmelidir; başka herhangi bir yer geçersizdir.
0e 10x geri dönüş boşluğu void bir yöntemden dönüş.
0f 11x vAA'yı iade et 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: kayıt çifti dönüş değeri (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) Nesne döndürme yönteminden dönüş.
12 11n sabit/4 vA, #+B A: hedef kaydı (4 bit)
B: imzalı int (4 bit)
Verilen değişmez değeri (32 bit'e kadar işaret genişletilmiş) belirtilen kayda taşıyın.
13 21'ler const/16 vAA, #+BBBB A: hedef kaydı (8 bit)
B: imzalı int (16 bit)
Verilen değişmez değeri (32 bit'e kadar işaret genişletilmiş) belirtilen kayda taşıyın.
14 31i sabit vAA, #+BBBBBBBB A: hedef kaydı (8 bit)
B: isteğe bağlı 32 bit sabit
Verilen değişmez değeri belirtilen kayda taşıyın.
15 21 saat sabit/yüksek16 vAA, #+BBBB0000 A: hedef kaydı (8 bit)
B: imzalı int (16 bit)
Verilen değişmez değeri (sağ-sıfır-32 bit'e kadar genişletilmiş) belirtilen kayda taşıyın.
16 21'ler const-wide/16 vAA, #+BBBB A: hedef kaydı (8 bit)
B: imzalı int (16 bit)
Verilen değişmez değeri (64 bit'e kadar işaret genişletilmiş) belirtilen kayıt çiftine taşıyın.
17 31i const-wide/32 vAA, #+BBBBBBBB A: hedef kaydı (8 bit)
B: imzalı int (32 bit)
Verilen değişmez değeri (64 bit'e kadar işaret genişletilmiş) belirtilen kayıt çiftine taşıyın.
18 51l const genelinde vAA, #+BBBBBBBBBBBBBBBB A: hedef kaydı (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 21h const-wide/high16 vAA, #+BBBB000000000000 A: hedef kaydı (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 kaydı (8 bit)
B: dize dizini
Verilen dizin tarafından belirtilen dizeye yapılan bir başvuruyu belirtilen kayda taşıyın.
1b 31c const-string/jumbo vAA, string@BBBBBBBB A: hedef kaydı (8 bit)
B: dize dizini
Verilen dizin tarafından belirtilen dizeye yapılan bir başvuruyu belirtilen kayda taşıyın.
1c 21c const sınıfı vAA, type@BBBB A: hedef kaydı (8 bit)
B: tip indeksi
Verilen indeks tarafından belirtilen sınıfa yapılan bir başvuruyu belirtilen kayda taşıyın. Belirtilen türün ilkel olması durumunda, bu, ilkel türün dejenere sınıfına bir referans depolayacaktır.
1d 11x monitör-giriş vAA A: referans taşıyan kayıt (8 bit) Belirtilen nesnenin monitörünü edinin.
1e 11x monitör çı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 atması gerekiyorsa, bunu sanki 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 keyfi istisnaları ele almanın bir yolu olarak, bu bloğun kendisi için monitör temizliği olarak bir monitör temizleme tümünü yakala (örneğin, finally ) bloğunu kullanmasını mümkün kılar. Thread.stop() , uygun monitör hijyenini sağlamaya devam ederken.

1f 21c kontrol dökümü vAA, type@BBBB A: referans taşıyan kayıt (8 bit)
B: tip 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 olması (ilkel bir değer olmaması) gerektiğinden, B ilkel bir türe başvurması durumunda bu çalışma zamanında mutlaka başarısız olacaktır (yani bir istisna oluşturacaktır).

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

Not: B her zaman bir referans olması (ilkel bir değer değil) olması gerektiğinden, C ilkel bir türe başvurması durumunda bu her zaman 0 saklanmasıyla sonuçlanacaktır.

21 12x dizi uzunluğu vA, vB A: hedef kaydı (4 bit)
B: dizi referans taşıyan kayıt (4 bit)
Belirtilen dizinin uzunluğunu verilen hedef kaydında girişlerde saklayın
22 21c yeni örnek vAA, type@BBBB A: hedef kaydı (8 bit)
B: tip indeksi
Hedefte ona bir referans depolayarak belirtilen türün yeni bir örneğini oluşturun. Tür, dizi olmayan bir sınıfa başvurmalıdır.
23 22c yeni dizi vA, vB, type@CCCC A: hedef kaydı (4 bit)
B: boyut kaydı
C: tip indeksi
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 argüman kelime sayısı (4 bit)
B: tip indeksi (16 bit)
C..G: bağımsız değişken kayıtları (her biri 4 bit)
Verilen içerikle doldurarak, verilen türde ve boyutta bir dizi oluşturun. Tür bir dizi türü olmalıdır. Dizinin içeriği tek kelimeden oluşmalıdır (yani, long veya double dizileri yoktur ancak referans türleri kabul edilebilir). Oluşturulan örnek, yöntem çağırma talimatlarının sonuçlarını sakladığı gibi bir "sonuç" olarak depolanır, bu nedenle oluşturulan örnek, hemen ardından gelen move-result-object talimatıyla (eğer kullanılacaksa) bir kayda taşınmalıdır. ).
25 3rc doldurulmuş yeni dizi/aralık {vCCCC .. vNNNN}, @BBBB yazın A: dizi boyutu ve argüman kelime sayısı (8 bit)
B: tip indeksi (16 bit)
C: ilk argüman kaydı (16 bit)
N = A + C - 1
Verilen içerikle doldurarak, verilen türde ve boyutta bir dizi oluşturun. Açıklamalar ve kısıtlamalar yukarıda açıklanan filled-new-array ile aynıdır.
26 31 ton fill-array-data vAA, +BBBBBBBB (aşağıda " fill-array-data-payload Formatında" belirtilen ek verilerle) A: dizi referansı (8 bit)
B: tablo verisi sözde talimatına göre imzalı "dal" ofseti (32 bit)
Verilen diziyi belirtilen verilerle doldurun. Referans bir temel öğeler dizisine ait olmalı ve veri tablosu tip olarak onunla eşleşmeli ve diziye sığabilecek sayıdan 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 ve geri kalanı yalnız bırakılır.
27 11x vAA'yı fırlat A: istisna taşıyan kayıt (8 bit)
Belirtilen istisnayı atın.
28 10 ton +AA'ya git A: imzalı dal ofseti (8 bit) Koşulsuz olarak belirtilen talimata atlayın.

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

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

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

2a 30 ton git/32 +AAAAAAAA A: imzalı dal ofseti (32 bit)
Koşulsuz olarak belirtilen talimata atlayın.
2b 31t paketlenmiş anahtar vAA, +BBBBBBBB (aşağıda " packed-switch-payload Formatı"nda belirtilen ek verilerle) A: test etmek için kaydolun
B: tablo verisi sözde talimatına göre imzalı "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ı olarak yeni bir talimata geçin veya eşleşme yoksa bir sonraki talimata geçin.
2c 31t seyrek anahtar vAA, +BBBBBBBB (aşağıda " sparse-switch-payload Formatı"nda belirtilen ek verilerle) A: test etmek için kaydolun
B: tablo verisi sözde talimatına göre imzalı "dal" ofseti (32 bit)
Değer-kayma çiftlerinin sıralı bir tablosunu kullanarak, verilen kayıttaki değere dayalı olarak yeni bir talimata geçin veya eşleşme yoksa bir sonraki talimata geçin.
2d..31 23x cmp türü vAA, vBB, vCC
2d: cmpl-float (lt önyargı)
2e: cmpg-float (gt önyargı)
2f: cmpl-double (lt önyargı)
30: cmpg-double (gt önyargı)
31: cmp uzunluğunda
A: hedef kaydı (8 bit)
B: ilk kaynak kaydı veya çifti
C: ikinci kaynak kaydı veya çifti
a b == c ise 0 , b > c ise 1 veya b < c ise -1 ayarlayarak belirtilen kayan nokta veya long karşılaştırmayı gerçekleştirin. Kayan nokta işlemleri için listelenen "bias", NaN karşılaştırmalarının nasıl ele alındığını gösterir: NaN karşılaştırmaları için "gtbias" talimatları 1 değerini döndürür ve "ltbias" talimatları -1 değerini döndürür.

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

32..37 22t if- test vA, vB, +CCCC
32: if-eşitlik
33: eğer-neyse
34: eğer-eğer
35: eğer-ge
36: eğer-gt
37: eğer-le
A: test edilecek ilk kayıt (4 bit)
B: test edilecek ikinci kayıt (4 bit)
C: imzalı dal ofseti (16 bit)
Verilen iki kaydın değerleri belirtildiği gibi karşılaştırılırsa, verilen hedefe dallanma.

Not: Dallanma uzaklığı 0 olmamalıdır. (Bir döndürme döngüsü, geriye doğru bir goto etrafında dallanarak veya dallanmadan önce bir hedef olarak bir nop dahil edilerek yasal olarak oluşturulabilir.)

38..3g 21g if- test z vAA, +BBBB
38: if-eqz
39: eğer-nez
3a: if-ltz
3b: if-gez
3c: if-gtz
3d: if-lez
A: test etmek için kayıt olun (8 bit)
B: imzalı 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: Dallanma uzaklığı 0 olmamalıdır. (Bir döndürme döngüsü, geriye doğru bir goto etrafında dallanarak veya dallanmadan önce bir hedef olarak bir nop dahil edilerek yasal olarak oluşturulabilir.)

3e..43 10x (kullanılmıyor) (kullanılmıyor)
44..51 23x arrayop vAA, vBB, vCC
44: yaş
45: yaş çapında
46: yaş-nesnesi
47: yaş-boolean
48: yaş-bayt
49: yaş-karakter
4a: yaş-kısa
4b: giriş
4c: aput çapında
4d: aput-nesnesi
4e: aput-boolean
4f: aput-bayt
50: aput-karakter
51: aput-kısa
A: değer kaydı veya çifti; kaynak veya hedef olabilir (8 bit)
B: dizi kaydı (8 bit)
C: indeks kaydı (8 bit)
Tanımlanan dizi işlemini, verilen dizinin tanımlanan indeksinde, değer kaydına yükleyerek veya saklayarak gerçekleştirin.
52..5f 22c i exampleop vA, vB, field@CCCC
52: anladım
53: iget çapında
54: iget-nesne
55: iget-boolean
56: iget-bayt
57: iget-karakter
58: kısa olsun
59: giriş
5a: giriş çapında
5b: giriş nesnesi
5c: giriş-boole değeri
5d: giriş baytı
5e: giriş-karakter
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 indeksi (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ı, alan argümanını daha doğrudan bir ofset olacak şekilde değiştirerek statik bağlantı için makul adaylardır.

60..6d 21c s staticop vAA, field@BBBB
60: geç
61: geniş çapta
62: nesne-nesne
63: sget-boolean
64: sget-bayt
65: sget-karakter
66: kısa-kısa
67: tükürmek
68: ağız genişliğinde
69: tükürük nesnesi
6a: sput-boolean
6b: spput baytı
6c: tükürük karakteri
6d: kısa tükürük
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, değer kaydına yükleyerek veya depolayarak gerçekleştirin.

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

6e..72 35c çağırma- tür {vC, vD, vE, vF, vG}, meth@BBBB
6e: çağırma-sanal
6f: çağırma-süper
70: doğrudan çağırma
71: çağırma-statik
72: çağırma arayüzü
A: argüman kelime sayısı (4 bit)
B: yöntem referans indeksi (16 bit)
C..G: bağımsız değişken kayıtları (her biri 4 bit)
Belirtilen yöntemi çağırın. Sonuç (eğer varsa), hemen sonraki talimat olarak uygun bir move-result* değişkeniyle 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 arayüz olmayan bir sınıfın yöntemine referans verdiğinde, 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ının sürüm 037 veya sonraki sürümlerinde, method_id bir arayüz yöntemini ifade ediyorsa invoke-super , o arayüzde tanımlanan yöntemin en spesifik, geçersiz kılınmayan sürümünü çağırmak için kullanılır. invoke-virtual ile aynı yöntem kısıtlamaları geçerlidir. Sürüm 037 önceki Dex dosyalarında, method_id arayüzüne sahip olmak yasa dışı 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 private bir örnek yöntemi veya bir yapıcıyı) çağırmak için kullanılır.

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

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 çifti) olacak şekilde değiştirerek statik bağlantı için makul adaylardır.

73 10x (kullanılmıyor) (kullanılmıyor)
74..78 3rc invoke- tür / aralık {vCCCC .. vNNNN}, meth@BBBB
74: çağırma-sanal/aralık
75: çağırma-süper/aralık
76: doğrudan çağırma/aralık
77: çağırma-statik/aralık
78: çağırma arayüzü/aralığı
A: argüman kelime sayısı (8 bit)
B: yöntem 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ılmıyor) (kullanılmıyor)
7b..8f 12x vA, vB'yi
7b: negatif-int
7c: int-değil
7d: negatif-uzun
7e: uzun değil
7f: negatif kayan nokta
80: negatif-çift
81: içten uzuna
82: yüzer halden
83: ikiye katlama
84: uzundan içe doğru
85: uzun süre yüzen
86: iki katına uzun
87: float'tan int'e
88: süzülmeden uzuna
89: iki katına çıkma
8a: çiftten int'e
8b: çiftten uzuna
8c: çift-yüzer
8d: bayttan bayta
8e: karakterden karaktere
8f: içten kısaya
A: hedef kaydı veya çifti (4 bit)
B: kaynak kaydı veya çifti (4 bit)
Belirlenen tekli işlemi kaynak kayıt defterinde gerçekleştirin ve sonucu hedef kayıt defterine kaydedin.
90..af 23x binop vAA, vBB, vCC
90: eklenti
91: alt-int
92: çoklu dahili
93: böl-tam sayı
94: kalan
95: ve-int
96: or-int
97: xor-int
98: shl-int
99: shr-int
9a: ushr-int
9b: uzun ekleme
9c: yarı-uzun
9d: çok uzun
9e: div-uzun
9f: çok uzun
a0: ve-uzun
a1: veya-uzun
a2: xor-uzun
a3: shl-uzun
a4: kısa-uzun
a5: uşr-uzun
a6: kayan nokta ekleme
a7: alt kayan nokta
a8: çoklu şamandıra
a9: div-float
aa: rem-float
ab: çift ekle
ac: alt-çift
reklam: mul-double
ae: div-double
af: rem-çift
A: hedef kaydı veya çifti (8 bit)
B: ilk kaynak kaydı veya çifti (8 bit)
C: ikinci kaynak yazmacı veya çifti (8 bit)
Belirlenen ikili işlemi iki kaynak kayıt üzerinde gerçekleştirin ve sonucu hedef kayıt defterinde saklayın.

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

b0..cf 12x binop /2addr vA, vB
b0: eklenti/2addr
b1: alt-int/2addr
b2: çoklu-int/2addr
b3: div-int/2addr
b4: kalan-dahili/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: eklenti-uzun/2addr
BC: alt-uzun/2addr
bd: çoklu-uzun/2addr
şöyle: div-uzun/2addr
bf: rem-long/2addr
c0: ve-uzun/2addr
c1: veya-uzun/2addr
c2: xor-uzun/2addr
c3: shl-uzun/2addr
c4: shr-uzun/2addr
c5: uşr-uzun/2addr
c6: kayan nokta/2addr ekle
c7: alt kayan nokta/2addr
c8: çoklu kayan nokta/2addr
c9: div-float/2addr
ca: rem-float/2addr
cb: add-double/2addr
cc: alt-çift/2addr
CD: mul-double/2addr
ce: div-double/2addr
cf: rem-double/2addr
A: hedef ve ilk kaynak kaydı veya çifti (4 bit)
B: ikinci kaynak kaydı veya çifti (4 bit)
Tanımlanan ikili işlemi iki kaynak yazmacı üzerinde gerçekleştirin ve sonucu birinci kaynak yazmacına kaydedin.

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

d0..d7 22s binop /lit16 vA, vB, #+CCCC
d0: eklenti/lit16
d1: rsub-int (tersten çıkarma)
d2: çoklu-int/lit16
d3: böl-int/lit16
d4: kalan/lit16
d5: ve-int/lit16
d6: or-int/lit16
d7: xor-int/lit16
A: hedef kaydı (4 bit)
B: kaynak kaydı (4 bit)
C: imzalı int sabiti (16 bit)
Belirtilen kayıt defterinde (ilk argüman) ve değişmez değerde (ikinci argüman) belirtilen ikili işlemi gerçekleştirin ve sonucu hedef kayıt defterinde saklayın.

Not: rsub-int bir son eki yoktur çünkü bu sürüm, ailesinin ana işlem kodudur. Ayrıca anlambilimiyle 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: çoklu-int/lit8
db: div-int/lit8
DC: kalan-dahili/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 kaydı (8 bit)
B: kaynak kaydı (8 bit)
C: imzalı int sabiti (8 bit)
Belirtilen kayıt defterinde (ilk argüman) ve değişmez değerde (ikinci argüman) belirtilen ikili işlemi gerçekleştirin ve sonucu hedef kayıt defterinde saklayın.

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

e3..f9 10x (kullanılmıyor) (kullanılmıyor)
fa 45cc çağrı-polimorfik {vC, vD, vE, vF, vG}, meth@BBBB, proto@HHHH A: argüman kelime sayısı (4 bit)
B: yöntem 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ç (eğer varsa), hemen sonraki talimat olarak uygun bir move-result* değişkeniyle saklanabilir.

Yöntem referansı, 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 referansı, 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 istisnalara neden olabilir. İstisnalar, çağrılan imza polimorfik yöntemine ilişkin API belgelerinde açıklanmaktadır.

Sürüm 038 itibaren Dex dosyalarında sunun.
fb 4rcc çağrı-polimorfik/aralık {vCCCC .. vNNNN}, meth@BBBB, proto@HHHH A: argüman kelime sayısı (8 bit)
B: yöntem 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çıklamasına bakın.

Sürüm 038 itibaren Dex dosyalarında sunun.
fc 35c özel çağrı {vC, vD, vE, vF, vG}, call_site@BBBB A: argüman kelime sayısı (4 bit)
B: çağrı sitesi referans indeksi (16 bit)
C..G: bağımsız değişken kayıtları (her biri 4 bit)
Belirtilen çağrı sitesini çözer ve çağırır. Çağrının sonucu (varsa), hemen sonraki talimat olarak uygun bir move-result* değişkeniyle saklanabilir.

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

Ç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, hiçbir ilişkilendirme yoksa daha sonra belirtilen çağrı sitesiyle ilişkilendirilecek bir java.lang.invoke.CallSite örneğini döndürür. İlişkilendirmeyi ilk önce başka bir iş parçacığı yapmış olabilir ve bu durumda talimatın yürütülmesi, ilişkilendirilen ilk 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, tam bir yöntem tanıtıcısı çağrısının argümanları olarak yöntem tanıtıcısını ve invoke-custom talimatının argümanlarını kullanarak 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 ortaya çıkan istisnalar, java.lang.BootstrapMethodError içine sarılır. Aşağıdaki durumlarda da BootstrapMethodError hatası oluşur:
  • önyükleme bağlayıcı yöntemi bir java.lang.invoke.CallSite örneğini döndürmede başarısız oluyor.
  • döndürülen java.lang.invoke.CallSite null bir yöntem tanıtıcı hedefine sahip.
  • yöntem tanıtıcısı hedefi istenen türde değil.
Sürüm 038 itibaren Dex dosyalarında sunun.
fd 3rc invoke-custom/range {vCCCC .. vNNNN}, call_site@BBBB A: argüman kelime sayısı (8 bit)
B: çağrı sitesi referans indeksi (16 bit)
C: ilk argüman kaydı (16 bit)
N = A + C - 1
Bir çağrı sitesini çözümleyin 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 sunun.
fe 21c const-method-handle vAA, method_handle@BBBB A: hedef kaydı (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 kayda taşıyın.

Sürüm 039 itibaren Dex dosyalarında sunun.
ff 21c const-yöntem türü vAA, proto@BBBB A: hedef kaydı (8 bit)
B: yöntem prototip referansı (16 bit)
Verilen indeks tarafından belirtilen yöntem prototipine yapılan bir referansı belirtilen kayda taşıyın.

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

paketlenmiş anahtar yükü biçimi

İsim Biçim Tanım
kimlik kısa = 0x0100 sözde işlem kodunu tanımlama
boyut kısa tablodaki giriş sayısı
ilk_anahtar int ilk (ve en düşük) anahtar durumu değeri
hedefler int[] size göre şube hedeflerinin 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 anahtar yükü biçimi

İsim Biçim Tanım
kimlik kısa = 0x0200 sözde işlem kodunu tanımlama
boyut kısa tablodaki giriş sayısı
anahtarlar int[] size anahtarı değerlerinin listesi, düşükten yükseğe sıralanmış
hedefler int[] her biri aynı dizindeki anahtar değere karşılık gelen size göre dallanma hedeflerinin 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 dizisi-veri-yük formatı

İsim Biçim Tanım
kimlik kısa = 0x0300 sözde işlem kodunu tanımlama
element_width kısa her öğedeki bayt sayısı
boyut uint tablodaki öğe sayısı
veri ubayt[] 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 ayrıntıları

Not: Kayan nokta işlemleri, aksi belirtilmediği sürece, en yakına ve kademeli alt akışı kullanan IEEE 754 kurallarına uygun olmalıdır.

İşlem kodu C Semantiği Notlar
negatif-int int32a;
int32 sonuç = -a;
Tekli ikiler-tümleyen.
int-değil int32a;
int32 sonuç = ~a;
Tekli olanlar-tamamlayıcı.
negatif uzun int64a;
int64 sonuç = -a;
Tekli ikiler-tümleyen.
uzun değil int64a;
int64 sonuç = ~a;
Tekli olanlar-tamamlayıcı.
negatif kayan nokta şamandıra a;
kayan sonuç = -a;
Kayan nokta olumsuzlaması.
negatif-çift çift ​​a;
çift ​​sonuç = -a;
Kayan nokta olumsuzlaması.
uzundan uzuna int32a;
int64 sonuç = (int64) a;
int32 int64 işaret uzantısı.
yörüngeye int32 a;
şamandıra sonucu = (şamandıra) A;
int32 float ile Şamandıra Dönüştürülmesi. Bu, bazı değerler için hassasiyeti kaybeder.
iki katına çıkar int32 a;
çift ​​sonuç = (çift) a;
int32 double dönüştürülmesi.
uzun süren int64 a;
int32 sonuç = (int32) a;
int64 int32 kesilmesi.
uzun süredir int64 a;
şamandıra sonucu = (şamandıra) A;
int64 float ile Şamandıra Dönüştürülmesi. Bu, bazı değerler için hassasiyeti kaybeder.
uzun süredir katlanacak int64 a;
çift ​​sonuç = (çift) a;
Yuvarlaktan yoksun kullanılarak int64 double dönüştürülmesi. Bu, bazı değerler için hassasiyeti kaybeder.
ıvır zıvır şamandıra a;
int32 sonuç = (int32) a;
Yuvarlak Toward-Zero kullanarak float int32 dönüştürülmesi. NaN ve -0.0 (negatif sıfır) 0 tam sayısına dönüşür. İşarete bağlı olarak temsil edilecek çok büyük bir büyüklüğe sahip 0x7fffffff ve değerler temsil edilmektedir -0x80000000
uzun süren yüzer şamandıra a;
int64 sonuç = (int64) a;
Yuvarlak Toward-Zero kullanarak float int64 dönüştürülmesi. float-to-int aynı özel durum kuralları, menzil dışı değerlerin işarete bağlı olarak 0x7fffffffffffffff veya -0x8000000000000000 dönüştürülmesi dışında burada uygulanır.
yüzer şamandıra a;
çift ​​sonuç = (çift) a;
float double dönüştürülmesi, değeri tam olarak koruyarak.
iki kat çift ​​a;
int32 sonuç = (int32) a;
Toward-Zero kullanılarak double int32 dönüştürülmesi. Aynı özel vaka kuralları, float-to-int için de burada başvurun.
iki kat çift ​​a;
int64 sonuç = (int64) a;
Toward-Zero kullanılarak double int64 dönüştürülmesi. float-to-long göre aynı özel vaka kuralları burada başvurun.
iki yüzlü çift ​​a;
şamandıra sonucu = (şamandıra) A;
float yoksulluk kullanarak double şamandıra dönüşümü. Bu, bazı değerler için hassasiyeti kaybeder.
bayt int32 a;
int32 sonuç = (a << 24) >> 24;
int32 int8 kesilmesi, sonucu genişleten işaret.
sadakat int32 a;
int32 sonuç = A & 0xffff;
İşaret uzantısı olmadan int32 uint16 kesilmesi.
Kısa int32 a;
int32 sonuç = (A << 16) >> 16;
int32 int16 kesilmesi, sonucu genişleten işaret.
eklenti int32 a, b;
Int32 sonuç = a + b;
Two-tamamlama ekleme.
alt int32 a, b;
Int32 sonuç = a - b;
Two-Competting Çıkarma.
rsub-int int32 a, b;
Int32 sonuç = b - a;
Two-Competting Ters Çıkarma.
mul int32 a, b;
Int32 sonuç = a * b;
Two-tamamlama çarpımı.
diva int32 a, b;
Int32 sonuç = A / B;
Sıfıra doğru yuvarlanan ikili tamamlama bölümü (yani, tamsayı olarak kesilmiş). Bu, b == 0 ise ArithmeticException atar.
rem-int int32 a, b;
Int32 sonuç = A % B;
Bölümden sonra ikili tamamlama kaldı. Sonucun işareti a ile aynıdır ve daha kesin olarak result == a - (a / b) * b olarak tanımlanır. Bu, b == 0 ise ArithmeticException atar.
ve int32 a, b;
Int32 sonuç = A & B;
Bitsel ve.
ya da int32 a, b;
Int32 sonuç = A | B;
Bitsel veya.
xor-int int32 a, b;
Int32 sonuç = a ^ b;
Bitsel xor.
SHL-INT int32 a, b;
int32 sonuç = a << (b & 0x1f);
Sol (maskeli argüman ile) bitsel kayma.
SHR-Int int32 a, b;
int32 sonuç = A >> (b & 0x1f);
Bitwise imzalı vites sağ (maskeli argüman ile).
USHR-UN uint32 a, b;
int32 sonuç = A >> (b & 0x1f);
Bitwise imzasız vites sağ (maskeli argüman ile).
eklemek int64 a, b;
Int64 sonuç = a + b;
Two-tamamlama ekleme.
uzun boylu int64 a, b;
Int64 sonuç = a - b;
Two-Competting Çıkarma.
çok uzun int64 a, b;
Int64 sonuç = a * b;
Two-tamamlama çarpımı.
divan int64 a, b;
Int64 sonuç = A / B;
Sıfıra doğru yuvarlanan ikili tamamlama bölümü (yani, tamsayı olarak kesilmiş). Bu, b == 0 ise ArithmeticException atar.
rem uzunluğunda int64 a, b;
Int64 sonuç = A % B;
Bölümden sonra ikili tamamlama kaldı. Sonucun işareti a ile aynıdır ve daha kesin olarak result == a - (a / b) * b olarak tanımlanır. Bu, b == 0 ise ArithmeticException atar.
ve uzun int64 a, b;
Int64 sonuç = A&B;
Bitsel ve.
uzun süren int64 a, b;
Int64 sonuç = A | B;
Bitsel veya.
xor uzunluğunda int64 a, b;
Int64 sonuç = a ^ b;
Bitsel xor.
shl uzunluğunda int64 a;
INT32 B;
int64 sonuç = a << (b & 0x3f);
Sol (maskeli argüman ile) bitsel kayma.
SHR-Long int64 a;
INT32 B;
int64 sonuç = a >> (b & 0x3f);
Bitwise imzalı vites sağ (maskeli argüman ile).
ushr uzunluğunda uint64 A;
INT32 B;
int64 sonuç = a >> (b & 0x3f);
Bitwise imzasız vites sağ (maskeli argüman ile).
eklenti float a, b;
şamandıra sonucu = a + b;
Yüzen nokta ilavesi.
alt yüzeyli float a, b;
şamandıra sonucu = a - b;
Yüzen nokta çıkarma.
mul float float a, b;
şamandıra sonucu = a * b;
Yüzen nokta çarpımı.
bölme float a, b;
şamandıra sonucu = A / B;
Yüzen nokta bölümü.
rem yüzey float a, b;
şamandıra sonucu = A % B;
Bölümden sonra kayan nokta kalan. Bu işlev IEEE 754'ten farklıdır ve result == a - roundTowardZero(a / b) * b .
iki katına çıkar çift ​​a, b;
çift ​​sonuç = a + b;
Yüzen nokta ilavesi.
iki katına çıkmış çift ​​a, b;
çift ​​sonuç = a - b;
Yüzen nokta çıkarma.
mul-double çift ​​a, b;
çift ​​sonuç = a * b;
Yüzen nokta çarpımı.
iki katlı çift ​​a, b;
çift ​​sonuç = A / B;
Yüzen nokta bölümü.
rem-çift çift ​​a, b;
Çift sonuç = A % B;
Bölümden sonra kayan nokta kalan. Bu işlev IEEE 754'ten farklıdır ve result == a - roundTowardZero(a / b) * b .