Dalvik yürütülebilir talimat biçimleri

Bu sayfada, Dalvik yürütülebilir (DEX) biçimi ve Dalvik bayt kodu tarafından kullanılan talimat biçimleri listelenmektedir. Bayt kodu referans dokümanı ile birlikte kullanılması amaçlanmıştır.

Bit açıklamaları

Biçim tablosunun ilk sütununda, biçimin bit düzeni listelenir. Boşlukla ayrılmış bir veya daha fazla "kelime"den oluşur. Her kelime 16 bitlik bir kod birimini tanımlar. Bir kelimedeki her karakter, dört biti temsil eder. Bu bitler, okumaya yardımcı olmak için dikey çubuklarla ("|") ayrılmış şekilde yüksek bitlerden düşük bitlere doğru okunur. "A" ile başlayan büyük harflerden oluşan sıra, biçim içindeki alanları belirtmek için kullanılır (bu alanlar daha sonra söz dizimi sütununda daha ayrıntılı şekilde tanımlanır). "op" terimi, sekiz bitlik bir kod komutunun biçim içindeki konumunu belirtmek için kullanılır. Belirtilen konumdaki tüm bitlerin sıfır olması gerektiğini belirtmek için eğik çizgiyle ayrılmış sıfır ("Ø") kullanılır.

Harfler çoğunlukla önceki kod birimlerinden sonraki kod birimlerine ve bir kod birimi içinde düşük öncelikliden yüksek öncelikliye doğru ilerler. Ancak bu genel kuralın birkaç istisnası vardır. Bu istisnalar, benzer anlamlı parçaların farklı talimat biçimlerinde aynı şekilde adlandırılması için yapılır. Bu durumlar, biçim açıklamalarında açıkça belirtilir.

Örneğin, "B|A|op CCCC" biçimi, biçimin iki 16 bit kod biriminden oluştuğunu gösterir. İlk kelime, alttaki sekiz bitte işlev kodu ve üstteki sekiz bitte bir çift dört bitlik değerden oluşur. İkinci kelime ise tek bir 16 bitlik değerden oluşur.

Biçim kimlikleri

Biçim tablosundaki ikinci sütunda, biçimin kısa tanımlayıcısını görebilirsiniz. Bu tanımlayıcı, biçimi tanımlamak için diğer belgelerde ve kodda kullanılır.

Çoğu biçim kimliği, iki basamaklı sayının ardından gelen bir harften ve üç karakterden oluşur. İlk hane, biçimdeki 16 bitlik kod birimlerinin sayısını belirtir. İkinci basamak, biçimin içerdiği maksimum kaydedici sayısını belirtir (bazı biçimler değişken sayıda kaydediciyi barındırabileceğinden maksimum değerdir). "r" özel işareti ise bir kaydedici aralığının kodlandığını gösterir. Son harf, biçim tarafından kodlanan ek verilerin türünü yarım anımsatıcı olarak belirtir. Örneğin, "21t" biçimi iki uzunluktadır, bir kayıt referansı ve ayrıca bir dal hedefi içerir.

Önerilen statik bağlantı biçimlerinde ek bir "s" son eki bulunur. Bu nedenle, bu biçimlerin toplam uzunluğu dört karakterdir. Benzer şekilde, önerilen "satır içi" bağlantı biçimlerinde ek bir "i" son eki bulunur. (Bu bağlamda satır içi bağlantı, bir makinenin uygulamasıyla daha doğrudan bağlantılar dışında sabit bağlantıya benzer.) Son olarak, önerilen birkaç sıra dışı biçim (ör. "20bc") biçim kimliğinde temsil edilen iki veri parçası içerir.

Tür kodu harflerinin tam listesi aşağıda verilmiştir. Bazı formların, biçime bağlı olarak farklı boyutlara sahip olduğunu unutmayın:

Hafıza güçlendirici Bit Boyutları Anlamı
b 8 anında imzalanan byt
c 16, 32 sabit havuz dizini
f 16 arayfaz sabitleri (yalnızca statik olarak bağlı biçimlerde kullanılır)
sa. 16 hemen imzalanmış hat (32 veya 64 bitlik bir değerin yüksek değerli bitleri; düşük değerli bitlerin tümü 0)
i 32 Anında imzalı int veya 32 bit kayan nokta
l 64) hemen imzalanan long veya 64 bit double
m 16 Yöntem sabitleri (yalnızca statik olarak bağlı biçimlerde kullanılır)
n 4 anında imzalanan nibble
s 16 immediate signed short
t 8, 16, 32 şube hedef
x 0 ek veri yok

Sözdizimi

Biçim tablosunun üçüncü sütunu, belirtilen biçimi kullanan talimatlar için kullanıcılara yönelik söz dizimi gösterir. Her talimat, adlandırılmış bir kodla başlar ve isteğe bağlı olarak virgülle ayrılmış bir veya daha fazla bağımsız değişkenle takip edilir.

Bir bağımsız değişken ilk sütundaki bir alanı ifade ettiğinde, söz konusu alanın harfi söz diziminde belirtilir ve alanın her dört biti için bir kez tekrarlanır. Örneğin, ilk sütunda "BB" olarak etiketlenmiş sekiz bitlik bir alan, söz dizimi sütununda da "BB" olarak etiketlenir.

Bir kaydediciyi adlandıran bağımsız değişkenler "vX" biçimindedir. Daha yaygın olan "r" yerine "v" ön eki, Dalvik yürütülebilir biçiminin uygulanabileceği (sanal olmayan) mimarilerle çakışmayı önlemek için seçilmiştir. Bu mimariler de kaydedicileri için "r" ön ekini kullanır. (Yani bu karar, dolaylı ifadeye gerek kalmadan hem sanal hem de gerçek kayıtlardan bahsetmeyi mümkün kılar.)

Değeri belirten bağımsız değişkenler "#+X" biçimindedir. Bazı biçimler, yalnızca yüksek değerli bitlerinde sıfır olmayan bitlere sahip olan değişmez değerleri belirtir. Bu değerlerde, sıfırlar bit gösterimde görünmese bile söz dizimi içinde açıkça temsil edilir.

Göreli bir talimat adresi ofsetini belirten bağımsız değişkenler "+X" biçimindedir.

Değişmez dize havuzu dizesini belirten bağımsız değişkenler "kind@X" biçimindedir. Burada "kind", hangi sabit dize havuzuna atıfta bulunulduğunu belirtir. Bu tür bir biçim kullanan her kod komutu, açıkça yalnızca bir tür sabit değere izin verir. Eşleşmeyi öğrenmek için kod komutu referansına bakın. Sabit havuz türleri şunlardır: "string" (dize havuzu dizini), "type" (tür havuzu dizini), "field" (alan havuzu dizini), "meth" (yöntem havuzu dizini) ve "site" (çağrı sitesi dizini).

Sabit havuz dizinlerinin temsiline benzer şekilde, önceden bağlanmış ofsetleri veya dizinleri belirten önerilen (isteğe bağlı) formlar da vardır. Önerilen iki tür önceden bağlı değer vardır: vtable ofset'leri ("vtaboff" olarak gösterilir) ve alan ofset'leri ("fieldoff" olarak gösterilir).

Bir biçim değerinin açıkça söz dizimi parçası olmadığı ancak bunun yerine bir varyantın seçildiği durumlarda her varyant "[X=N]" ön ekiyle listelenir (ör. "[A=2]") ekleyin.

Biçimler

Biçim Kimlik Sözdizimi Kapsanan Önemli Kod İşlemleri
Yok 00x N/A Kullanılmayan işlem kodları için kullanılan sanal biçim; bir kesme noktası işlem kodu için nominal biçim olarak kullanılması önerilir
ØØ|op 10 kat op  
B|A|op 12x op vA, vB  
11n op vA, #+B  
AA|op 11x op vAA  
10 ton op +AA şuraya git
ØØ|op AAAA 20 ton op +AAAA goto/16
AA|op BBBB 20bc op AA, kind@BBBB Statik olarak belirlenen doğrulama hataları için önerilen biçim; A, hata türüdür ve B, türe uygun bir tablodaki bir dizindir (ör. böyle bir yöntem yok hatası için yöntem referansları)
AA|op BBBB 22 kat op vAA, vBBBB  
21t op vAA, +BBBB  
21 saniye op vAA, #+BBBB  
21 saat op vAA, #+BBBB0000
op vAA, #+BBBB000000000000
 
21c op vAA, type@BBBB
op vAA, field@BBBB
op vAA, method_handle@BBBB
op vAA, proto@BBBB
op vAA, string@BBBB
check-cast
const-class
const-method-handle
const-method-type
const-string
AA|op CC|BB 23 kat op vAA, vBB, vCC  
22b op vAA, vBB, #+CC  
B|A|op CCCC 22t op vA, vB, +CCCC  
22 saniye op vA, vB, #+CCCC  
22c op vA, vB, type@CCCC
op vA, vB, field@CCCC
instance-of
22cs op vA, vB, fieldoff@CCCC 22c biçiminde statik olarak bağlı alan erişim talimatları için önerilen biçim
ØØ|op AAAAlo AAAAhi 30 ton op +AAAAAAAA goto/32
ØØ|op AAAA BBBB 32x op vAAAA, vBBBB  
AA|op BBBBlo BBBBhi 31i op vAA, #+BBBBBBBB  
31t op vAA, +BBBBBBBB  
31c op vAA, dize@BBBBBBBB const-string/jumbo
A|G|op BBBB F|E|D|C 35c [A=5] op {vC, vD, vE, vF, vG}, meth@BBBB
[A=5] op {vC, vD, vE, vF, vG}, site@BBBB
[A=5] op {vC, vD, vE, vF, vG}, type@BBBB
[A=4] op {vC, vD, vE, vF}, kind@BBBB
[A=3] op {vC, vD, vE}, kind@BBBB
[A=2] op {vC, vD}, kind@BBBB
[A=1] op {vC}, kind@BBBB
[A=0] op {}, kind@BBBB

Burada kullanılan sıra dışı yazım tercihi, sayının ve referans dizininin 3. biçimle aynı etikete sahip olmasını sağlama isteğini yansıtır.

 
35ms [A=5] op {vC, vD, vE, vF, vG}, vtaboff@BBBB
[A=4] op {vC, vD, vE, vF}, vtaboff@BBBB
[A=3] op {vC, vD, vE}, vtaboff@BBBB
[A=2] op {vC, vD}, vtaboff@BBBB
[A=1] op {vC}, vtaboff@BBBB

Burada kullanılan sıra dışı yazım tercihi, sayının ve referans dizininin 3rms biçimindekiyle aynı etikete sahip olmasını sağlama isteğini yansıtır.

Statik olarak bağlı invoke-virtual ve invoke-super için önerilen biçim ve 35c biçimi talimatları
35 mil [A=5] op {vC, vD, vE, vF, vG}, inline@BBBB
[A=4] op {vC, vD, vE, vF}, inline@BBBB
[A=3] op {vC, vD, vE}, inline@BBBB
[A=2] op {vC, vD}, inline@BBBB
[A=1] op {vC}, inline@BBBB

Burada kullanılan sıra dışı yazım tercihi, sayının ve referans dizininin 3rmi biçimindekiyle aynı etikete sahip olmasını sağlama isteğini yansıtır.

satır içi bağlantılı invoke-static ve invoke-virtual için önerilen biçim ve 35c biçimi talimatları
AA|op BBBB CCCC 3rc op {vCCCC .. vNNNN}, meth@BBBB
op {vCCCC .. vNNNN}, site@BBBB
op {vCCCC .. vNNNN}, type@BBBB

NNNN = CCCC+AA-1, yani A 0..255 sayısını, C ise ilk kaydı belirler

 
3rms op {vCCCC .. vNNNN}, vtaboff@BBBB

NNNN = CCCC+AA-1, yani A 0..255 sayısını, C ise ilk kaydı belirler

statik olarak bağlı invoke-virtual ve invoke-super için önerilen biçim 3rc biçimi talimatları
3rmi op {vCCCC .. vNNNN}, satır içi@BBBB

NNNN = CCCC+AA-1, yani A 0..255 sayısını, C ise ilk kaydı belirler

satır içi bağlantılı invoke-static ve invoke-virtual için önerilen biçim ve 3rc biçimi talimatları
A|G|op BBBB F|E|D|C HHHH 45cc [A=5] op {vC, vD, vE, vF, vG}, meth@BBBB, proto@HHHH
[A=4] op {vC, vD, vE, vF}, meth@BBBB, proto@HHHH
[A=3] op {vC, vD, vE}, meth@BBBB, proto@HHHH
[A=2] op {vC, vD}, meth@BBBB, proto@HHHH
[A=1] op {vC}, meth@BBBB, proto@HHHH
invoke-polymorphic
AA|op BBBB CCCC HHHH 4rcc op> {vCCCC .. vNNNN}, meth@BBBB, proto@HHHH

NNNN = CCCC+AA-1, yani A 0..255 sayısını, C ise ilk kaydı belirler

invoke-polymorphic/range
AA|op BBBBlo BBBB BBBB BBBBhi 51l op vAA, #+BBBBBBBBBBBBBBBB const-wide