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.
- 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
- 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,
v0
–v65535
aralığındaki kaydedicileri adresleyebilen bir çift her şey dahilmove
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 birnop
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) vev0
–v255
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 " |
|
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:
|
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 |
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 |
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. |
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: |
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: |
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 kaydediciC: 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 |
29 20t | goto/16 +AAAA | A: işaretli dal ofseti (16 bit) |
Belirtilen talimata koşulsuz olarak atla.
Not:
Şube ofseti |
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 kaydolB: 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 kaydolB: 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 çiftC: 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 |
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 |
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 |
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.
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 |
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 |
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:
|
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: |
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:
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.
|