Dalvik bayt kodu biçimi

Genel tasarım

  • Makine modeli ve çağrı kuralları, yaygın gerçek mimarileri ve C tarzı çağrı kurallarını yaklaşık olarak taklit etmeyi amaçlar:
    • Makine, kayıt tabanlı olduğundan çerçeveler oluşturulduktan sonra boyut olarak sabitlenir. Her çerçeve, belirli sayıdaki kaydediciden (yöntem tarafından belirtilir) ve yöntemi yürütmek için gereken tüm ek verilerden (ör. program sayacı ve yöntemi içeren .dex dosyasına referans) oluşur.
    • Bit değerleri (ör. tam sayılar ve kayan noktalı sayılar) için kullanıldığında kaydediciler 32 bit genişliğinde kabul edilir. 64 bit değerler için bitişik kaydedici çiftleri kullanılır. Kayıt çiftleri için hizalama koşulu yoktur.
    • Nesne referansları için kullanıldığında, kaydediciler tam olarak bir referans tutacak kadar geniş kabul edilir.
    • Bit gösterimi açısından (Object) null == (int) 0.
    • Bir yönteme ait N bağımsız değişken, yöntemin çağrı çerçevesinin son N kaydedicisine sırayla yerleştirilir. Geniş bağımsız değişkenler iki kayıt birimi kullanır. Örnek yöntemlerine ilk bağımsız değişken olarak bir this referansı iletilir.
  • Talimat akışındaki depolama birimi, 16 bitlik işaretsiz bir miktardır. Bazı talimatlardaki bazı bitler yoksayılır / sıfır olmalıdır.
  • Talimatlar, belirli bir türle gereksiz yere sınırlı değildir. Örneğin, 32 bitlik kayıt değerlerini yorumlamadan taşıyan talimatların, int mi yoksa float mu taşıdıklarını belirtmesi gerekmez.
  • Dizelere, türlere, alanlara ve yöntemlere yapılan referanslar için ayrı ayrı numaralandırılmış ve dizine eklenen sabit havuzları vardır.
  • Bitlik değişmez veriler, talimat akışında satır içi olarak temsil edilir.
  • Uygulamada bir yöntemin 16'dan fazla kaydıra ihtiyaç duyması yaygın olmadığından ve sekiz kaydediciden fazlasına ihtiyaç duyulması oldukça yaygın olduğundan birçok talimat yalnızca ilk 16 kaydediciyi adreslemekle sınırlıdır. Makul olduğunda talimatlar, ilk 256 kaydediciye kadar referanslara izin verir. Ayrıca bazı talimatların, v0v65535 aralığındaki kaydedicileri adresleyebilen bir çift her şey dahil move talimatı da dahil olmak üzere çok daha büyük kaydedici sayılarına olanak tanıyan varyantları vardır. İstenilen bir kaydediciyi adreslemek için bir talimat varyantının kullanılamadığı durumlarda, kaydedici içeriğinin orijinal kaydediciden düşük bir kaydediciye (işlemden önce) ve/veya düşük bir sonuç kaydediciden yüksek bir kaydediciye (işlemden sonra) taşınması beklenir.
  • Değişken uzunlukta veri yükü tutmak için kullanılan ve normal talimatlar tarafından adlandırılan çeşitli "sözde talimatlar" vardır (örneğin, fill-array-data). Bu tür talimatlarla normal yürütme akışında hiçbir zaman karşılaşılmamalıdır. Ayrıca, talimatlar çift sayılı bayt kodu ofsetlerinde (yani 4 bayt hizalanmış) bulunmalıdır. Bu koşulu karşılamak için dex oluşturma araçları, aksi takdirde hizalanmayan bir talimat varsa boşluk olarak ek bir nop talimatı yayınlamalıdır. Son olarak, zorunlu olmasa da çoğu aracın bu talimatları yöntemlerin sonunda yayınlaması beklenir. Aksi takdirde, bu talimatlar etrafında dallanma oluşturmak için ek talimatlara ihtiyaç duyulabilir.
  • Çalışan bir sisteme yüklendiğinde bazı talimatlar değiştirilebilir. Bu, yükleme sırasında statik bağlantı optimizasyonu olarak biçimlerini değiştirir. Bu, bağlantı bilindiğinde daha hızlı yürütme işlemine olanak tanır. Önerilen varyantlar için ilişkili talimatlar biçimleri belgesine bakın. "Önerilen" kelimesi dikkatli bir şekilde kullanılmıştır. Bu önerileri uygulamak zorunlu değildir.
  • Kullanıcı dostu söz dizimi ve akılda kalıcı kelimeler:
    • Argümanlar için hedef ve ardından kaynak sıralaması.
    • Bazı işlem kodlarında, üzerinde çalıştıkları türleri belirten bir belirsizlik giderici ad soneki bulunur:
      • Türe genel 32 bit kod komutları işaretlenmez.
      • Türe genel 64 bit işlem kodlarının sonuna -wide eklenir.
      • Türe özgü işlem kodlarının sonuna türleri (veya basit bir kısaltma) eklenir. Bu türlerden biri: -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 birbirinin aynısı işlemleri ayırt etmek için anlam karışıklığını gideren bir son ek bulunur. Bu son ekler, ana adlardan eğik çizgi ("/") ile ayrılır ve temel olarak, yürütülebilir dosyaları oluşturan ve yorumlayan koddaki statik sabitlerle bire bir eşleme yapılmasını sağlamak için (yani, kullanıcılar için belirsizliği azaltmak için) kullanılır.
    • Buradaki açıklamalarda, bir değerin genişliği (ör. bir sabitin aralığını veya adreslenebilecek kaydedici sayısını belirtir) 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 (bir yazmaç değerini taşıma) belirten temel opcode'dur.
      • "wide", geniş (64 bit) veriler üzerinde çalıştığını belirten ad son ekidir.
      • "from16", kaynak olarak 16 bitlik bir kayıt referansı olan bir varyantı belirten opcode son ekidir.
      • "vAA", hedef kayıttır (işlem tarafından ima edilir; yine, kural hedef bağımsız değişkenlerinin her zaman önce gelmesidir) ve v0v255 aralığında olmalıdır.
      • "vBBBB", v0 - v65535 aralığında olması gereken kaynak kayıtçıdır.
  • Çeşitli talimat biçimleri ("Op & Format" altında listelenmiştir) ve opcode söz dizimi hakkında daha fazla bilgi için talimat biçimleri belgesine bakın.
  • Bayt kodunu daha geniş bir perspektifte ele almak için .dex dosya biçimi belgesine göz atın.

Bytecode kümesinin özeti

İşlem ve Biçim Hafıza güçlendirici / Söz dizimi Argümanlar Açıklama
00 10x nop   Atık döngüleri.

Not: Veri içeren sözde talimatlar bu kod komutuyla etiketlenir. Bu durumda, kod komutu biriminin yüksek değerli baytı verilerin türünü gösterir. Aşağıdaki "packed-switch-payload Biçim", "sparse-switch-payload Biçim" ve "fill-array-data-payload Biçim" bölümlerine bakın.

01 12x vA, vB'yi taşı A: hedef kaydedici (4 bit)
B: kaynak kaydedici (4 bit)
Nesne olmayan bir sicildeki içeriği başka bir sicile taşıma
02 22x move/from16 vAA, vBBBB A: hedef kaydedici (8 bit)
B: kaynak kaydedici (16 bit)
Nesne olmayan bir sicildeki içeriği başka bir sicile taşıma
03 32x move/16 vAAAA, vBBBB A: hedef kaydedici (16 bit)
B: kaynak kaydedici (16 bit)
Nesne olmayan bir sicildeki içeriği başka bir sicile taşıma
04 12x move-wide vA, vB A: hedef kayıt çifti (4 bit)
B: kaynak kayıt çifti (4 bit)
Bir kayıt çiftinin içeriğini başka bir kayıt çiftine taşıma.

Not: vN'den vN-1 veya vN+1'e geçmek yasaldır. Bu nedenle, uygulama geliştiricilerin hiçbir şey yazılmadan önce bir kayıt çiftinin her iki yarısının da okunmasını sağlaması gerekir.

05 22x move-wide/from16 vAA, vBBBB A: hedef kaydedici çifti (8 bit)
B: kaynak kaydedici çifti (16 bit)
Bir kayıt çiftinin içeriğini başka bir kayıt çiftine taşıma.

Not: Uygulamayla ilgili dikkat edilmesi gereken hususlar, yukarıdaki move-wide ile aynıdır.

06 32x move-wide/16 vAAAA, vBBBB A: hedef kaydedici çifti (16 bit)
B: kaynak kaydedici çifti (16 bit)
Bir kayıt çiftinin içeriğini başka bir kayıt çiftine taşıma.

Not: Uygulamayla ilgili dikkat edilmesi gereken hususlar, yukarıdaki move-wide ile aynıdır.

07 12x move-object vA, vB A: hedef kaydedici (4 bit)
B: kaynak kaydedici (4 bit)
Nesne içeren bir sicil defterinin içeriğini başka bir sicil defterine taşıma.
08 22x move-object/from16 vAA, vBBBB A: hedef kaydedici (8 bit)
B: kaynak kaydedici (16 bit)
Nesne içeren bir sicildeki içeriği başka bir sicile taşıma.
09 32x move-object/16 vAAAA, vBBBB A: hedef kaydedici (16 bit)
B: kaynak kaydedici (16 bit)
Nesne içeren bir sicildeki içeriği başka bir sicile taşıma.
0a 11x move-result vAA A: hedef kaydedici (8 bit) En son invoke-kind'nin tek kelimelik, nesne olmayan sonucunu belirtilen kayda taşıyın. Bu, sonucu (tek kelimelik, nesne olmayan) yok sayılmaması gereken bir invoke-kind'den hemen sonra talimat olarak yapılmalıdır. Başka bir yerde yapılması geçersizdir.
0b 11x move-result-wide vAA A: hedef kaydedici çifti (8 bit) En son invoke-kind işlevinin çift kelimelik sonucunu belirtilen kaydedici çiftine taşıyın. Bu işlem, sonucu (çift kelime) yoksayılmaması gereken bir invoke-kind'den hemen sonra gelen talimat olarak yapılmalıdır. Başka bir yerde yapılması geçersizdir.
0c 11x move-result-object vAA A: hedef kaydedici (8 bit) En son invoke-kind sonucunun nesne sonucunu belirtilen kaydediciye taşıyın. Bu, sonucu (nesne) yoksayılmaması gereken bir invoke-kind veya filled-new-array'den hemen sonra talimat olarak yapılmalıdır. Başka bir yerde yapılması geçersizdir.
0 gün 11x move-exception vAA A: hedef kaydedici (8 bit) Yeni yakalanan bir istisnayı belirli bir kayda kaydedin. Bu, yakalanan istisnasının yok sayılmaması gereken istisna işleyicilerinin ilk talimatı olmalıdır ve bu talimat yalnızca bir istisna işleyicisinin ilk talimatı olarak gerçekleşmelidir; başka bir yerde geçersizdir.
0e 10x return-void   void yönteminden dönme.
0f 11x return vAA A: döndürülen değer kaydedicisi (8 bit) Tek genişlikli (32 bit) nesne olmayan değer döndüren bir yöntemden dönme.
10 11x return-wide vAA A: döndürülen değer kaydedici çifti (8 bit) Çift genişlikli (64 bit) değer döndüren bir yöntemden dönme.
11 11x return-object vAA A: döndürülen değer kaydedicisi (8 bit) Nesne döndüren bir yöntemden dönme.
12 11n const/4 vA, #+B A: hedef kaydedici (4 bit)
B: işaretli tam sayı (4 bit)
Belirtilen değişmez değeri (32 bit işaretli olarak genişletilmiş) belirtilen kaydediciye taşıyın.
13 21 sn. const/16 vAA, #+BBBB A: hedef kaydedici (8 bit)
B: işaretli int (16 bit)
Belirtilen değişmez değeri (32 bit işaretli olarak genişletilmiş) belirtilen kaydediciye taşıyın.
14 31i const vAA, #+BBBBBBBB A: hedef kaydedici (8 bit)
B: rastgele 32 bit sabit
Belirtilen değişmez değeri belirtilen kayda taşır.
15 21 saat const/high16 vAA, #+BBBB0000 A: hedef kaydedici (8 bit)
B: işaretli int (16 bit)
Belirtilen değişmez değeri (32 bit için sağdan sıfıra genişletilmiş) belirtilen kaydediciye taşıyın.
16 21 saniye const-wide/16 vAA, #+BBBB A: hedef kaydedici (8 bit)
B: işaretli int (16 bit)
Belirtilen değişmez değeri (64 bit işaretli olarak genişletilmiş) belirtilen kaydedici çiftine taşıyın.
17 31i const-wide/32 vAA, #+BBBBBBBB A: hedef kaydedici (8 bit)
B: işaretli int (32 bit)
Belirtilen değişmez değeri (64 bit işaretli olarak genişletilmiş) belirtilen kaydedici çiftine taşıyın.
18 51l const-wide vAA, #+BBBBBBBBBBBBBBBB A: hedef kaydedici (8 bit)
B: keyfi çift genişlikli (64 bit) sabit
Belirtilen değişmez değeri belirtilen kaydedici çiftine taşır.
19 21:00 const-wide/high16 vAA, #+BBBB000000000000 A: hedef kaydedici (8 bit)
B: işaretli int (16 bit)
Belirtilen değişmez değeri (sağdan sıfıra uzatılmış 64 bit) belirtilen kaydedici çiftine taşıyın.
1a 21c const-string vAA, string@BBBB A: hedef kaydedici (8 bit)
B: dize dizini
Belirtilen dizin tarafından belirtilen dizeye ait referansı belirtilen kaydediciye taşır.
1b 31c const-string/jumbo vAA, string@BBBBBBBB A: hedef kaydedici (8 bit)
B: dize dizini
Belirtilen dizin tarafından belirtilen dizeye ait referansı belirtilen kaydediciye taşır.
1c 21c const-class vAA, type@BBBB A: hedef kaydedici (8 bit)
B: tür dizini
Belirtilen dizin tarafından belirtilen sınıfa ait bir referansı belirtilen kaydediciye taşır. Belirtilen türün ilkel olması durumunda, bu, ilkel türün dejenere sınıfına referans depolar.
1 gün 11x monitor-enter vAA A: referans içeren kaydedici (8 bit) Belirtilen nesnenin monitörünü edinin.
1e 11x monitor-exit vAA A: referans içeren kaydedici (8 bit) Belirtilen nesnenin monitörünü serbest bırakın.

Not: Bu talimatın istisna oluşturması gerekiyorsa bunu bilgisayar talimatın ötesine geçmiş gibi yapmalıdır. Bunu, talimatın başarılı bir şekilde (bir anlamda) yürütüldüğü ve istisna, talimattan sonra ancak bir sonraki talimatın çalıştırılma şansı elde etmeden önce atıldığından düşünmek yararlı olabilir. Bu tanım, bir yöntemin monitör temizleme kapsayıcısını (ör. finally) engellemesini, Thread.stop()'un geçmişteki uygulanması nedeniyle ortaya çıkabilecek keyfi istisnaları ele almanın bir yolu olarak, aynı zamanda uygun monitör hijyenine sahip olmayı da yönetirken söz konusu bloğun monitör temizliği olarak yapın.

1f 21c check-cast vAA, type@BBBB A: referans içeren kayıt (8 bit)
B: tür dizini (16 bit)
Belirtilen kayıttaki referans belirtilen türe atanamıyorsa ClassCastException atayın.

Not: A her zaman bir referans (basit değer değil) olması gerektiğinden, B basit bir türü referans ediyorsa bu işlem çalışma zamanında başarısız olur (yani bir istisna atar).

20 22c instance-of vA, vB, type@CCCC A: hedef kaydedici (4 bit)
B: referans içeren kaydedici (4 bit)
C: tür dizini (16 bit)
Belirtilen referans, belirtilen türün bir örneğiyse 1 belirli hedef kaydında, aksi takdirde 0 kaydedilir.

Not: B her zaman bir referans (basit değer değil) olması gerektiğinden, C basit bir türe atıfta bulunuyorsa bu her zaman 0'ın depolanmasıyla sonuçlanır.

21 12x dizi uzunluğu vA, vB A: hedef kaydedici (4 bit)
B: dizi referansı içeren kaydedici (4 bit)
Belirtilen dizinin uzunluğunu, girişlerde belirtilen hedef kaydında depolayın
22 21c new-instance vAA, type@BBBB A: hedef kaydedici (8 bit)
B: tür dizini
Belirtilen türün yeni bir örneğini oluşturup bu örneğe ait referansı hedefte saklayın. Tür, dizi olmayan bir sınıfa işaret etmelidir.
23 22c yeni-dizi vA, vB, tür@CCCC A: hedef kaydedici (4 bit)
B: boyut kaydedici
C: tür dizini
Belirtilen tür ve boyutta yeni bir dizi oluşturun. Tür, bir dizi türü olmalıdır.
24 35c filled-new-array {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 dizini (16 bit)
C..G: bağımsız değişken kayıtları (her biri 4 bit)
Belirtilen tür ve boyuttaki bir dizi oluşturup bu diziyi sağlanan içeriklerle doldurun. Tür, dizi türü olmalıdır. Dizideki içerikler tek kelimeden oluşmalıdır (yani long veya double dizileri kabul edilmez ancak referans türleri kabul edilir). Oluşturulan örnek, yöntem çağırma talimatlarının sonuçlarını depoladığı şekilde "sonuç" olarak depolanır. Bu nedenle, oluşturulan örnek hemen ardından gelen bir move-result-object talimatıyla (kullanılacaksa) bir kayda taşınmalıdır.
25 3rc filled-new-array/range {vCCCC .. vNNNN}, type@BBBB A: dizi boyutu ve bağımsız değişken kelime sayısı (8 bit)
B: tür dizini (16 bit)
C: ilk bağımsız değişken kaydı (16 bit)
N = A + C - 1
Belirtilen tür ve boyuttaki bir dizi oluşturup bu diziyi sağlanan içeriklerle doldurun. Açıklamalar ve kısıtlamalar, yukarıda açıklanan filled-new-array ile aynıdır.
26 31t fill-array-data vAA, +BBBBBBBB ("fill-array-data-payload Biçimi" bölümünde aşağıda belirtildiği şekilde ek veri içerebilir) A: dizi referansı (8 bit)
B: tablo verilerine yönelik işaretli "dallanma" ofseti sözde talimatı (32 bit)
Belirtilen diziyi belirtilen verilerle doldurun. Referans, bir primitif dizisine ait olmalıdır ve veri tablosu, tür açısından bu diziyle eşleşmeli ve diziye sığabilecekten fazla öğe içermemelidir. Yani dizi tablodan daha büyük olabilir ve bu durumda, dizideki yalnızca ilk öğeler ayarlanır, geri kalanlar ise olduğu gibi bırakılır.
27 11x throw vAA A: istisna içeren kaydedici (8 bit)
Belirtilen istisnayı gönderin.
28 10t git +AA A: işaretli dal ofseti (8 bit) Belirtilen talimata koşulsuz olarak atla.

Not: Şube ofseti 0 olmamalıdır. (Döngü döngüsü, goto/32 ile veya dallamadan önce hedef olarak bir nop ekleyerek yasal olarak oluşturulabilir.)

29 20t goto/16 +AAAA A: işaretli dal ofseti (16 bit)
Belirtilen talimata koşulsuz olarak atla.

Not: Şube ofseti 0 olmamalıdır. (Döngü döngüsü, goto/32 ile veya dallamadan önce hedef olarak bir nop ekleyerek yasal olarak oluşturulabilir.)

2a 30t goto/32 +AAAAAAAA A: işaretli dal ofseti (32 bit)
Belirtilen talimata koşulsuz olarak atla.
2b 31t packed-switch vAA, +BBBBBBBB ("packed-switch-payload Biçimi" bölümünde aşağıda belirtildiği şekilde ek veri içerecek şekilde) A: test için kaydol
B: tablo verilerine işaretli "dal" ofseti sözde talimatı (32 bit)
Belirli bir tam sayı aralığındaki her değere karşılık gelen bir ofset tablosu kullanarak belirli bir kaydedicideki değere göre yeni bir talimata atlayabilir veya eşleşme yoksa bir sonraki talimata atlayabilirsiniz.
2c 31t sparse-switch vAA, +BBBBBBBB ("sparse-switch-payload Biçimi" bölümünde aşağıda belirtildiği şekilde ek veri içerecek şekilde) A: test için kaydol
B: tablo verilerine işaretli "dal" ofseti sözde talimatı (32 bit)
Değer-ofset çiftlerinden oluşan sıralı bir tablo kullanarak belirli bir kaydedicideki değere göre yeni bir talimata atlayabilir veya eşleşme yoksa bir sonraki talimata geçebilirsiniz.
2d..31 23x cmpkind vAA, vBB, vCC
2d: cmpl-float (lt bias)
2e: cmpg-float (gt bias)
2f: cmpl-double (lt bias)
30: cmpg-double (gt bias)
31: cmp-long
A: hedef kaydedici (8 bit)
B: ilk kaynak kaydedici veya çift
C: ikinci kaynak kaydedici veya çift
Belirtilen kayan nokta veya long karşılaştırmasını gerçekleştirin. b == c ise a'yi 0, b > c ise 1, b < c ise -1 olarak ayarlayın. Kayan nokta işlemleri için listelenen "bias", NaN karşılaştırmalarının nasıl değerlendirildiğini belirtir: "gt bias" talimatları NaN karşılaştırmaları için 1 döndürür ve "lt bias" talimatları -1 döndürür.

Örneğin, kayan noktalı olup olmadığını kontrol etmek için x < y cmpg-float kullanmanızı öneririz. -1 sonucu, testin doğru olduğunu, diğer değerler ise geçerli bir karşılaştırma nedeniyle veya değerlerden biri NaN olduğu için testin yanlış olduğunu gösterir.

32..37 22t if-test vA, vB, +CCCC
32: if-eq
33: if-ne
34: if-lt
35: if-ge
36: if-gt
37: if-le
A: test edilecek ilk kayıt (4 bit)
B: test edilecek ikinci kayıt (4 bit)
C: işaretli dal ofseti (16 bit)
Belirtilen iki yazmaçtaki değerler belirtildiği gibi karşılaştırılırsa belirli bir hedefe dallanır.

Not: Şube ofseti 0 olmamalıdır. (Döngü döngüsü, geriye dönük bir goto etrafında dallanıp dallanıp ayrılarak veya dallanmadan önce hedef olarak bir nop ekleyerek yasal olarak oluşturulabilir.)

38..3d 21t if-testz vAA, +BBBB
38: if-eqz
39: if-nez
3a: if-ltz
3b: if-gez
3c: if-gtz
3d: if-lez
A: test için kayıt (8 bit)
B: imzalı dal ofseti (16 bit)
Belirtilen kayıtçının değeri belirtilen şekilde 0 ile karşılaştırılırsa belirli bir hedefe dallanır.

Not: Şube ofseti 0 olmamalıdır. (Döngü döngüsü, geriye dönük bir goto etrafında dallanıp dallanıp ayrılarak veya dallanmadan önce hedef olarak bir nop ekleyerek yasal olarak oluşturulabilir.)

3e..43 10x (unused)   (unused)
44..51 23x arrayop vAA, vBB, vCC
44: aget
45: aget-wide
46: aget-object
47: aget-boolean
48: aget-byte
49: aget-char
4a: aget-short
4b: aput
4c: aput-wide
4d: aput-object
4e: aput-boolean
4f: aput-byte
50: aput-char
51: aput-short
A: değer kaydedicisi veya çifti; kaynak veya hedef olabilir (8 bit)
B: dizi kaydedicisi (8 bit)
C: dizin kaydedicisi (8 bit)
Tanımlanan dizi işlemini, belirli bir dizinin tanımlanan dizininde gerçekleştirerek değer kaydına yükleyin veya kaydedin.
52..5f 22c iinstanceop vA, vB, field@CCCC
52: iget
53: iget-wide
54: iget-object
55: iget-boolean
56: iget-byte
57: iget-char
58: iget-short
59: iput
5a: iput-wide
5b: iput-object
5c: iput-boolean
5d: iput-byte
5e: iput-char
5f: iput-short
A: değer kaydedicisi veya çifti; kaynak veya hedef olabilir (4 bit)
B: nesne kaydedicisi (4 bit)
C: örnek alan referans dizini (16 bit)
Tanımlanmış nesne örneği alan işlemini, tanımlanmış alanla gerçekleştirerek değeri değer kaydına yükleyin veya kaydedin.

Not: Bu işlem kodları, alan bağımsız değişkenini daha doğrudan bir ofset olacak şekilde değiştirerek statik bağlantı için uygun adaylardır.

60..6d 21c sstaticop vAA, field@BBBB
60: sget
61: sget-wide
62: sget-object
63: sget-boolean
64: sget-byte
65: sget-char
66: sget-short
67: sput
68: sput-wide
69: sput-object
6a: sput-boolean
6b: sput-byte
6c: sput-char
6d: sput-short
A: değer kaydedicisi veya çifti; kaynak veya hedef olabilir (8 bit)
B: statik alan referans dizini (16 bit)
Tanımlanmış statik alanla tanımlanmış nesne statik alan işlemini gerçekleştirerek değeri değer kaydediciye yükleyin veya kaydedin.

Not: Bu işlem kodları, alan bağımsız değişkenini daha doğrudan bir ofset olacak şekilde değiştirerek statik bağlantı için uygun adaylardır.

6e..72 35c invoke-kind {vC, vD, vE, vF, vG}, meth@BBBB
6e: invoke-virtual
6f: invoke-super
70: invoke-direct
71: invoke-static
72: invoke-interface
A: bağımsız değişken kelime sayısı (4 bit)
B: yöntem referans dizini (16 bit)
C..G: bağımsız değişken kayıtları (her biri 4 bit)
Belirtilen yöntemi çağırın. Sonuç (varsa) hemen sonraki talimat olarak uygun bir move-result* varyantıyla birlikte saklanabilir.

invoke-virtual, static, private veya bir kurucu olmayan normal bir sanal yöntemi çağırmak için kullanılır.

method_id, arayüz olmayan bir sınıfın yöntemine referans verdiğinde invoke-super, en yakın üst sınıfın sanal yöntemini çağırmak için kullanılır (çağrıcı sınıftaki aynı method_id ile çağrılan yöntemin aksine). invoke-virtual ile aynı yöntem kısıtlamaları geçerlidir.

037 veya sonraki sürümlerdeki Dex dosyalarında, method_id bir arayüz yöntemini belirtiyorsa invoke-super, söz konusu arayüzde tanımlanan yöntemin en spesifik, geçersiz kılınmamış sürümünü çağırmak için 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 arayüzünün olması yasa dışıdır ve tanımlanmamıştır.

invoke-direct, doğrudan olmayan bir 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.static

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

invoke-interface, interface yöntemini çağırmak için kullanılır. Yani, interface'a atıfta bulunan bir method_id kullanılarak, somut sınıfı bilinmeyen bir nesnede.

Not: Bu kod komutları, statik bağlantı için makul adaylardır. Bu kod komutları, yöntem bağımsız değişkenini daha doğrudan bir ofset (veya çifti) olacak şekilde değiştirir.

73 10x (unused)   (unused)
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: bağımsız değişken kelime sayısı (8 bit)
B: yöntem referans dizini (16 bit)
C: ilk bağımsız değişken 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çıklamaya bakın.
79..7a 10x (unused)   (unused)
7b..8f 12x unop vA, vB
7b: neg-int
7c: not-int
7d: neg-long
7e: not-long
7f: neg-float
80: neg-double
81: int-to-long
82: int-to-float
83: int-to-double
84: long-to-int
85: long-to-float
86: long-to-double
87: float-to-int
88: float-to-long
89: float-to-double
8a: double-to-int
8b: double-to-long
8c: double-to-float
8d: int-to-byte
8e: int-to-char
8f: int-to-short
A: hedef kaydedici veya çift (4 bit)
B: kaynak kaydedici veya çift (4 bit)
Tanımlanmış tek adımlı işlemi kaynak kaydedicide gerçekleştirip sonucu hedef kaydedicide depolar.
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: shr-int
9a: ushr-int
9b: add-long
9c: sub-long
9d: mul-long
9e: div-long
9f: rem-long
a0: and-long
a1: or-long
a2: xor-long
a3: shl-long
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-double
ad: mul-double
ae: div-double
af: rem-double
A: hedef kaydedici veya çift (8 bit)
B: ilk kaynak kaydedici veya çift (8 bit)
C: ikinci kaynak kaydedici veya çift (8 bit)
Tanımlanan ikili işlemi iki kaynak kaydedicide gerçekleştirip sonucu hedef kaydedicide depolar.

Not: Diğer -long matematik işlemlerinin (hem ilk hem de ikinci kaynak için kaydedici çifti kullanan) aksine, shl-long, shr-long ve ushr-long, ilk kaynakları (kaydırılacak değer) için bir kaydedici çifti, ancak ikinci kaynakları (kaydırma mesafesi) için tek bir kaydedici kullanır.

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: and-int/2addr
b6: or-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-double/2addr
cd: mul-double/2addr
ce: div-double/2addr
cf: rem-double/2addr
A: hedef ve ilk kaynak kaydedici veya çift (4 bit)
B: ikinci kaynak kaydedici veya çift (4 bit)
Tanımlanmış ikili işlemi iki kaynak kaydedicide gerçekleştirip sonucu ilk kaynak kaydedicide depolar.

Not: Diğer -long/2addr matematik işlemlerinin aksine (hem hedef/ilk kaynak hem de ikinci kaynak için kaydedici çifti alır), shl-long/2addr, shr-long/2addr ve ushr-long/2addr, hedef/ilk kaynak (kaydırılacak değer) için bir kaydedici çifti, ancak ikinci kaynak (kaydırma mesafesi) için tek bir kaydedici alır.

d0..d7 22 saniye binop/lit16 vA, vB, #+CCCC
d0: add-int/lit16
d1: rsub-int (ters çıkarma)
d2: mul-int/lit16
d3: div-int/lit16
d4: rem-int/lit16
d5: and-int/lit16
d6: or-int/lit16
d7: xor-int/lit16
A: hedef kaydedici (4 bit)
B: kaynak kaydedici (4 bit)
C: işaretli tamsayı sabit (16 bit)
Belirtilen kaydedicide (ilk bağımsız değişken) ve değişmez değerde (ikinci bağımsız değişken) belirtilen ikili işlemi gerçekleştirip sonucu hedef kaydedicide depolar.

Not: rsub-int, ailesinin ana kod komutu olduğundan son ek içermez. Ayrıca, anlamsal özellikleriyle ilgili ayrıntılar için aşağıya bakın.

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: and-int/lit8
de: or-int/lit8
df: xor-int/lit8
e0: shl-int/lit8
e1: shr-int/lit8
e2: ushr-int/lit8
A: hedef kaydedici (8 bit)
B: kaynak kaydedici (8 bit)
C: işaretli tam sayı sabit (8 bit)
Belirtilen kaydedicide (ilk bağımsız değişken) ve değişmez değerde (ikinci bağımsız değişken) belirtilen ikili işlemi gerçekleştirip sonucu hedef kaydedicide depolar.

Not: rsub-int semantikleriyle ilgili ayrıntıları aşağıda bulabilirsiniz.

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

Metot referansı, java.lang.invoke.MethodHandle.invoke veya java.lang.invoke.MethodHandle.invokeExact gibi imza polimorfik bir yönteme ait 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öndürülen türleri açıklar.

invoke-polymorphic bayt kodu yürütüldüğünde istisnalar oluşturabilir. İstisnalar, çağrılan polimorfik imza yönteminin API dokümanlarında açıklanmıştır.

038 sürümünden itibaren Dex dosyalarında bulunur.
fb 4rcc invoke-polymorphic/range {vCCCC .. vNNNN}, meth@BBBB, proto@HHHH A: bağımsız değişken kelime sayısı (8 bit)
B: yöntem referans dizini (16 bit)
C: alıcı (16 bit)
H: prototip referans dizini (16 bit)
N = A + C - 1
Belirtilen yöntem işleyicisini çağırın. Ayrıntılar için yukarıdaki invoke-polymorphic açıklamasına bakın.

038 sürümünden itibaren Dex dosyalarında bulunur.
fc 35c invoke-custom {vC, vD, vE, vF, vG}, call_site@BBBB A: bağımsız değişken kelime sayısı (4 bit)
B: çağrı sitesi referans dizini (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* varyantıyla saklanabilir.

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

Çağrı sitesi çözme işlemi, belirtilen çağrı sitesinin ilişkili bir java.lang.invoke.CallSite örneği olup olmadığını kontrol eder. Aksi takdirde, 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 (call_site_item bölümüne bakın). Bootstrap bağlayıcı yöntemi, ilişkilendirme yoksa belirtilen çağrı sitesiyle ilişkilendirilecek bir java.lang.invoke.CallSite örneği döndürür. Başka bir iş parçacığı önceden ilişkilendirme yapmış olabilir. Bu durumda, talimatların yürütülmesi ilk ilişkilendirilen java.lang.invoke.CallSite örneğiyle devam eder.

Site çağrısı, çözüldüğü java.lang.invoke.CallSite örneğin java.lang.invoke.MethodHandle hedefinde yapılır. Hedef, yöntem adını ve invoke-custom talimatının bağımsız değişkenlerini tam bir yöntem adı çağrısının bağımsız değişkenleri olarak kullanarak invoke-polymorphic'ü (yukarıda açıklanmıştır) yürütüyormuş gibi çağrılır.

Bootstrap bağlayıcı yöntemi tarafından oluşturulan istisnalar bir java.lang.BootstrapMethodError içine alınır. BootstrapMethodError, aşağıdaki durumlarda da gösterilir:
  • önyükleme bağlayıcı yöntemi bir java.lang.invoke.CallSite örneği döndürmez.
  • döndürülen java.lang.invoke.CallSite, null yöntemi
  • yöntem adı hedefi istenen türde değil.
038 sürümünden itibaren Dex dosyalarında bulunur.
fd 3rc invoke-custom/range {vCCCC .. vNNNN}, call_site@BBBB A: bağımsız değişken kelime sayısı (8 bit)
B: çağrı sitesi referans dizini (16 bit)
C: ilk bağımsız değişken kaydedicisi (16 bit)
N = A + C - 1
Bir çağrı sitesini çözümleyip çağırın. Ayrıntılar için yukarıdaki invoke-custom açıklamasına bakın.

038 sürümünden itibaren Dex dosyalarında bulunur.
fe 21c const-method-handle vAA, method_handle@BBBB A: hedef kaydedici (8 bit)
B: yöntem tutamaç dizini (16 bit)
Belirtilen dizin tarafından belirtilen yöntem tutamacına ait referansı belirtilen kaydediciye taşır.

039 sürümünden itibaren Dex dosyalarında bulunur.
ff 21c const-method-type vAA, proto@BBBB A: hedef kaydedici (8 bit)
B: yöntem prototipi referansı (16 bit)
Belirtilen dizin tarafından belirtilen yöntem prototipine ait referansı belirtilen kaydediciye taşıyın.

039 sürümünden itibaren Dex dosyalarında bulunur.

paketlenmiş-anahtar-yük biçimi

Ad Biçimi Açıklama
ident ushort = 0x0100 Sözde işlevi tanımlama
beden ushort tablodaki girişlerin sayısı
first_key int ilk (ve en düşük) switch case değeri
hedefler int[] size göreli dal hedeflerinin listesi. Hedefler bu tablonun değil, anahtar kod komutunun adresine göredir.

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

seyrek-anahtar-yük biçimi

Ad Biçimi Açıklama
ident ushort = 0x0200 Sözde işlevi tanımlama
beden ushort tablodaki girişlerin sayısı
anahtar int[] size anahtar değerlerinin düşükten yükseğe doğru sıralanmış listesi
hedefler int[] size göreli dal hedefinin listesi. Her biri aynı dizindeki anahtar değerine karşılık gelir. Hedefler, bu tablonun değil, anahtar kod komutunun adresine göredir.

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

fill-array-data-payload biçimi

Ad Biçimi Açıklama
ident ushort = 0x0300 Sözde işlevi tanımlama
element_width ushort her öğedeki bayt sayısı
beden uint tablodaki öğe sayısı
aktarma ubyte[] veri değerleri

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

Matematiksel işlem ayrıntıları

Not: Yüzen nokta işlemleri, aksi belirtilmediği sürece en yakına yuvarlama ve kademeli alt taşma yöntemini kullanarak IEEE 754 kurallarına uymalıdır.

İşlem kodu C Anlamları Notlar
neg-int int32 a;
int32 sonuç = -a;
İkilik tabanda tekli tamamlayıcı.
not-int int32 a;
int32 sonuç = ~a;
Birli birler tamamlayıcısı.
neg-long int64 a;
int64 sonuç = -a;
İkilik tabanda tekli tamamlayıcı.
not-long int64 a;
int64 sonuç = ~a;
Birli birler tamamlayıcısı.
neg-float float a;
float result = -a;
Kayan noktalı eksi değer.
neg-double double a;
double result = -a;
Kayan noktalı eksi değer.
int-to-long int32 a;
int64 result = (int64) a;
int32 uzantısının int64 olarak imzalanmasıdır.
int-to-float int32 a;
float result = (float) a;
En yakın değere yuvarlama kullanılarak int32 değerinin float değerine dönüştürülmesi. Bu durumda bazı değerlerde hassasiyet kaybedilir.
int-to-double int32 a;
double sonuç = (double) a;
int32'ün double'e dönüştürülmesi.
long-to-int int64 a;
int32 sonuç = (int32) a;
int64, int32 olarak kısaltılır.
long-to-float int64 a;
float sonuç = (float) a;
En yakın değere yuvarlama kullanılarak int64 değerinin float değerine dönüştürülmesi. Bu işlem, bazı değerlerde hassasiyeti kaybeder.
uzun-çift int64 a;
double sonuç = (double) a;
En yakın değere yuvarlama kullanılarak int64 değerinin double değerine dönüştürülmesi. Bu durumda bazı değerlerde hassasiyet kaybedilir.
float-to-int float a;
int32 sonuç = (int32) a;
Sıfıra yuvarlama kullanılarak float değerinin int32 değerine dönüştürülmesi. NaN ve -0.0 (negatif sıfır) ise 0 tam sayısına dönüştürülür. Sonsuzluk ve temsil edilemeyecek kadar büyük bir büyüklüğü olan değerler, işarete bağlı olarak 0x7fffffff veya -0x80000000 olarak dönüştürülür.
float-to-long float a;
int64 result = (int64) a;
Sıfıra yuvarlama kullanılarak float değerinin int64 değerine dönüştürülmesi. Aralık dışındaki değerlerin işarete bağlı olarak 0x7fffffffffffffff veya -0x8000000000000000 olarak dönüştürülmesi dışında, float-to-int ile aynı özel durum kuralları burada geçerlidir.
float-to-double float a;
double result = (double) a;
Değeri tam olarak koruyarak float değerini double değerine dönüştürme.
double-to-int double a;
int32 result = (int32) a;
Sıfıra yuvarlama kullanılarak double değerinin int32 değerine dönüştürülmesi. Burada, float-to-int ile aynı özel durum kuralları geçerlidir.
çiftten uzun double a;
int64 result = (int64) a;
Sıfıra yuvarlama kullanılarak double değerinin int64 değerine dönüştürülmesi. Burada, float-to-long ile aynı özel durum kuralları geçerlidir.
double-to-float double a;
float result = (float) a;
En yakın değere yuvarlama kullanılarak double değerinin float değerine dönüştürülmesi. Bu işlem, bazı değerlerde hassasiyeti kaybeder.
int-to-byte int32 a;
int32 sonuç = (a << 24) >> 24;
int32 değerinin int8 olarak kısaltılması, sonucun genişletildiğini gösterir.
int-to-char int32 a;
int32 sonuç = a & 0xffff;
İşaret uzantısı olmadan int32 değerinin uint16 değerine kısaltılması.
int-to-short int32 a;
int32 sonuç = (a << 16) >> 16;
int32 değerinin int16 olarak kısaltılması, sonucun genişletildiğini gösterir.
add-int int32 a, b;
int32 sonuç = a + b;
İkilik tamamlayıcı toplama.
alt int int32 a, b;
int32 sonuç = a - b;
İkilik tamamlayıcı çıkarma.
rsub-int int32 a, b;
int32 sonuç = b - a;
İkilik tamamlayıcı ters çıkarma.
mul-int int32 a, b;
int32 sonuç = a * b;
İkilik tamamlayıcı çarpma.
div-int int32 a, b;
int32 sonuç = a / b;
Sıfıra yuvarlanmış (yani tam sayı olacak şekilde kısaltılmış) ikilik tamamlayıcı bölme. Bu, b == 0 ise ArithmeticException değerini döndürür.
rem-int int32 a, b;
int32 sonuç = a % b;
Bölme işleminden sonra ikilik tamamlayıcı kalan. Sonuç işareti, a ile aynıdır ve daha net bir şekilde result == a - (a / b) * b olarak tanımlanır. Bu, b == 0 ise ArithmeticException değerini döndürür.
and-int int32 a, b;
int32 result = a & b;
Bit tabanlı VE.
or-int int32 a, b;
int32 sonuç = a | b;
Bit tabanlı VEYA.
xor-int int32 a, b;
int32 sonuç = a ^ b;
Bit tabanlı ÇOKEĞER.
shl-int int32 a, b;
int32 sonuç = a << (b & 0x1f);
Bit kaydırma (maskeli bağımsız değişkenle).
shr-int int32 a, b;
int32 sonuç = a >> (b & 0x1f);
Bit düzeyinde sağa doğru işaretli kaydırma (maskeli bağımsız değişkenle).
ushr-int uint32 a, b;
int32 result = a >> (b & 0x1f);
Bitsel işaretsiz sağ kaydırma (maskeli bağımsız değişkenle).
add-long int64 a, b;
int64 sonuç = a + b;
İkilik tamamlayıcı toplama.
alt uzun int64 a, b;
int64 result = a - b;
İkilik tamamlayıcı çıkarma.
mul-long int64 a, b;
int64 sonuç = a * b;
İkilik tamamlayıcı çarpma.
div-long int64 a, b;
int64 sonuç = a / b;
Sıfıra yuvarlanmış (yani tam sayı olacak şekilde kısaltılmış) ikilik tamamlayıcı bölme. Bu, b == 0 ise ArithmeticException değerini döndürür.
rem-long int64 a, b;
int64 result = a % b;
Bölme işleminden sonra ikilik tamamlayıcı kalan. Sonuç işareti, a ile aynıdır ve daha net bir şekilde result == a - (a / b) * b olarak tanımlanır. Bu, b == 0 ise ArithmeticException değerini döndürür.
and-long int64 a, b;
int64 result = a & b;
Bit tabanlı VE.
or-long int64 a, b;
int64 sonuç = a | b;
Bit tabanlı VEYA.
xor-long int64 a, b;
int64 sonuç = a ^ b;
Bit tabanlı ÇOKEĞER.
shl-long int64 a;
int32 b;
int64 sonuç = a << (b & 0x3f);
Bit kaydırma (maskeli bağımsız değişkenle).
shr-long int64 a;
int32 b;
int64 sonuç = a >> (b & 0x3f);
Bit düzeyinde sağa doğru işaretli kaydırma (maskeli bağımsız değişkenle).
ushr-long uint64 a;
int32 b;
int64 result = a >> (b & 0x3f);
Bitlik işaretsiz sağ kaydırma (maskeli bağımsız değişkenle).
add-float float a, b;
float sonuç = a + b;
Kayan nokta toplama.
alt kayan nokta float a, b;
float sonuç = a - b;
Kayan nokta çıkarma işlemi.
mul-float float a, b;
float sonuç = a * b;
Kayan nokta çarpımı.
div-float float a, b;
float sonuç = a / b;
Kayan nokta bölme işlemi.
rem-float float a, b;
float result = a % b;
Bölme işleminden sonra kalan kayan nokta değeri. Bu işlev, IEEE 754 artık değerinden farklıdır ve result == a - roundTowardZero(a / b) * b olarak tanımlanır.
add-double double a, b;
double result = a + b;
Kayan nokta ekleme.
yarım çift double a, b;
double result = a - b;
Kayan nokta çıkarma işlemi.
mul-double double a, b;
double result = a * b;
Kayan nokta çarpımı.
div-double double a, b;
double result = a / b;
Kayan nokta bölme işlemi.
rem-double double a, b;
double result = a % b;
Bölme işleminden sonra kalan kayan nokta değeri. Bu işlev, IEEE 754 artık değerinden farklıdır ve result == a - roundTowardZero(a / b) * b olarak tanımlanır.