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.
- 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
- 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,
v0
–move
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 birnop
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
",v0
–v255
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
",v0
–v65535
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 " | |
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: |
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 |
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 |
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, |
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: |
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: |
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 |
29 20t | git/16 +AAAA | A: imzalı dal ofseti (16 bit) | Koşulsuz olarak belirtilen talimata atlayın. Not: Dal ofseti |
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 kaydolunB: 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 kaydolunB: 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 çiftiC: 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 |
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 |
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 |
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. Dex dosyaları sürüm 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 |
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 |
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 |
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: |
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:
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 . |