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.
- 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
- 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,
v0
–v65535
aralığındaki kayıtları adresleyebilen bir çift tümünü yakalamove
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 birnop
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
",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ı ("İş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 " | |
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: |
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 |
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 |
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, |
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: |
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: |
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ığı |
29 20 ton | git/16 +AAAA | A: imzalı dal ofseti (16 bit) | Koşulsuz olarak belirtilen talimata atlayın. Not: Dallanma uzaklığı |
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 kaydolunB: 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 kaydolunB: 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 çiftiC: 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 |
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ığı |
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ığı |
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. Dex dosyalarının sürüm 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 aç 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 |
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 |
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: |
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: |
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:
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 . |