Formaty instrukcji wykonywalnych Dalvik

Na tej stronie znajdziesz listę formatów instrukcji używanych przez format wykonywalny Dalvik (DEX) i bajtkod Dalvik. Dokument ten jest przeznaczony do użytku w połączeniu z dokumentem referencyjnym dotyczącym kodu bajtowego.

Opis bitowy

Pierwsza kolumna w tabeli formatów zawiera układ bitowy formatu. Składa się z co najmniej 1 „słowa” rozdzielonego spacjami, z których każde opisuje 16-bitową jednostkę kodu. Każdy znak w słowie reprezentuje 4 bity, odczytywane od najwyższych do najniższych. Aby ułatwić odczyt, pomiędzy bitami wstawia się pionowe kreski („|”). Litery duże w kolejności od „A” są używane do wskazywania pól w formacie (które są dalej definiowane przez kolumnę składni). Termin „op” jest używany do wskazania pozycji ośmiobitowego kodu operacyjnego w formacie. Zero z kreską („Ø”) oznacza, że wszystkie bity w wspomnianej pozycji muszą być równe 0.

W większości przypadków literowanie odbywa się od wcześniejszych jednostek kodu do późniejszych jednostek kodu oraz od niższych do wyższych rzędów w ramach jednostki kodu. Istnieją jednak pewne wyjątki od tej ogólnej zasady, które zostały wprowadzone w celu zapewnienia takiego samego nazewnictwa części o podobnym znaczeniu w różnych formatach instrukcji. Takie przypadki są wyraźnie zaznaczone w opisach formatów.

Na przykład format „B|A|op CCCC” wskazuje, że składa się on z 2 16-bitowych jednostek kodu. Pierwsze słowo składa się z kodu operacji w 8 najmniejszych bitach i pary 4-bitowych wartości w 8 największych bitach, a drugie słowo składa się z pojedynczej 16-bitowej wartości.

Identyfikatory formatów

Druga kolumna w tabeli formatów zawiera krótki identyfikator formatu, który jest używany w innych dokumentach i kodzie do identyfikacji formatu.

Większość identyfikatorów formatu składa się z 3 znaków: 2 cyfr i litery. Pierwsza cyfra wskazuje liczbę 16-bitowych jednostek kodu w formacie. Druga cyfra wskazuje maksymalną liczbę rejestrów, które zawiera format (maksymalna, ponieważ niektóre formaty mogą zawierać zmienną liczbę rejestrów), a specjalny symbol „r” wskazuje, że zakodowany jest zakres rejestrów. Ostatnia litera w pół-mnemotechniczny sposób wskazuje typ dodatkowych danych zakodowanych przez format. Na przykład format „21t” ma długość 2, zawiera jedno odwołanie do rejestru i dodatkowo zawiera docelowe rozgałęzienie.

Proponowane formaty linkowania statycznych mają dodatkowy przyrostek „s”, co daje w sumie 4 znaki. Podobnie sugerowane formaty linków „wstawionych” mają dodatkowy przyrostek „i”. (W tym kontekście linkowanie w tekście jest podobne do linkowania stałego, ale z bardziej bezpośrednim powiązaniem z implementacją maszyny). Na koniec kilka dziwnych sugerowanych formatów (np. „20bc”) zawierają 2 elementy danych, które są reprezentowane przez identyfikator formatu.

Pełna lista liter kodów typu: Pamiętaj, że niektóre formularze mają różne rozmiary w zależności od formatu:

Mnemotechnika Rozmiary bitów Znaczenie
B 8 natychmiastowy podpisany byte
C 16, 32 indeks puli stałej
F 16 stałe interface (używane tylko w przypadku formatów powiązanych statycznie);
h 16 natychmiastowa hat (bity o większej wadze wartości 32- lub 64-bitowej; bity o mniejszej wadze są wszystkie 0)
I 32 natychmiastowy podpisany int lub liczba zmiennoprzecinkowa 32-bitowa
L 64 natychmiastowo podpisany long lub 64-bitowa podwójna precyzja
min 16 stałe method (używane tylko w przypadku formatów z linkiem statycznym);
n 4 immediate signed nibble
s 16 immediate signed short
T 8, 16, 32 branch target
x 0 brak dodatkowych danych

Składnia

Trzecia kolumna tabeli formatów zawiera zrozumiałą dla człowieka składnię instrukcji, które wykorzystują wskazany format. Każda instrukcja rozpoczyna się nazwą kodu operacji, a opcjonalnie po niej następuje co najmniej jeden argument, oddzielony przecinkami.

Wszędzie tam, gdzie argument odnosi się do pola z pierwszej kolumny, w składni jest wskazywana litera tego pola, powtarzana raz na każde 4 bity pola. Na przykład ośmiobitowe pole o nazwie „BB” w pierwszej kolumnie będzie też mieć nazwę „BB” w kolumnie składni.

Argumenty, które nazywają rejestr, mają postać „vX”. Zamiast bardziej typowego „r” wybrano prefiks „v”, aby uniknąć konfliktów z (niewirtualnymi) architekturami, w których można zaimplementować format wykonywalny Dalvik, który sam używa prefiksu „r” dla swoich rejestrów. (Oznacza to, że ta decyzja umożliwia mówienie o zarówno wirtualnych, jak i rzeczywistych rejestrach bez potrzeby używania zawoalowanych wyrażeń).

Argumenty, które wskazują wartość dosłowną, mają postać „#+X”. Niektóre formaty wskazują dosłowne wartości, które mają tylko niezerowe bity w bitach o wysokiej mocy; w takich przypadkach wartości zerowe są reprezentowane w składni w sposób jawny, mimo że nie występują w reprezentacji bitowej.

Argumenty, które wskazują nawzględny przesunięcie adresu instrukcji, mają postać „+X”.

Argumenty, które wskazują dosłowny wskaźnik puli stałych, mają postać „kind@X”, gdzie „kind” wskazuje, do której puli stałych się odwołuje. Każdy kod operacji, który używa takiego formatu, zezwala wyraźnie tylko na jeden rodzaj stałej. Aby ustalić odpowiednik, zapoznaj się z informacjami o kodzie operacji. Rodzaje puli stałych to „string” (indeks puli ciągu znaków), „type” (indeks puli typów), „field” (indeks puli pól), „meth” (indeks puli metod) i „site” (indeks miejsca wywołania).

Podobnie jak w przypadku reprezentacji indeksów puli stałych, istnieją też sugerowane (opcjonalne) formy, które wskazują wstępnie połączone przesunięcia lub indeksy. Istnieją 2 typy sugerowanych wartości wstępnie połączonych: przesunięcia w tabeli (oznaczone jako „vtaboff”) i przesunięcia w polu (oznaczone jako „fieldoff”).

W przypadkach, gdy wartość formatu nie jest częścią składni, a zamiast tego wybiera wariant, każdy wariant jest wymieniony z prefiksem „[X=N]” (np. „[A=2]”) w celu wskazania korespondencji.

Formaty

Format ID Składnia Wybrane obsługiwane instrukcje
Nie dotyczy 00x N/A pseudoformat używany dla nieużywanych instrukcji operacyjnych; zalecany do użycia jako format nominalny dla instrukcji operacyjnej punktu przerwania
ØØ|op 10x op  
B|A|op 12 x op vA, vB  
11n op vA, #+B  
AA|op 11x op vAA  
10 t op +AA przejdźdo
ØØ|op AAAA 20 t op +AAAA goto/16
AA|op BBBB 20 bc op AA, kind@BBBB sugerowany format dla statycznie określonych błędów weryfikacji; A to typ błędu, a B to indeks w odpowiedniej tabeli (np. odwołania do metody w przypadku błędu „nie ma takiej metody”);
AA|op BBBB 22 x op vAA, vBBBB  
21t op vAA, +BBBB  
21 s op vAA, #+BBBB  
21 godz. 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 x op vAA, vBB, vCC  
22b op vAA, vBB, #+CC  
B|A|op CCCC 22t op vA, vB, + CCCC  
22 s op vA, vB, #+CCCC  
22 c op vA, vB, type@CCCC
op vA, vB, field@CCCC
instance-of
22 s. op vA, vB, fieldoff@CCCC sugerowany format instrukcji dostępu do pola powiązanego statycznie w formacie 22c
ØØ|op AAAAlo AAAAhi 30 t 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, string@BBBBBBBB const-string/jumbo
A|G|op BBBB F|E|D|C 35 c [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

Nietypowy wybór liter odzwierciadla chęć posiadania przez licznik i indeks referencyjny tej samej etykiety co w formacie 3rc.

 
35 ms [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

Nietypowy wybór liter odzwierciadla chęć posiadania tej samej etykiety dla zliczania i indeksu odniesienia jak w formacie 3rms.

sugerowany format dla połączonych statycznie invoke-virtual oraz instrukcje dotyczące formatu 35c dla invoke-super
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

Nietypowy wybór liter odzwierciadla chęć posiadania przez licznik i indeks referencyjny tej samej etykiety jak w formacie 3rmi.

sugerowany format instrukcji invoke-static dołączonych do linku w tekście oraz invoke-virtual w formacie 35c
AA|op BBBB CCCC 3rc op {vCCCC .. vNNNN}, meth@BBBB
op {vCCCC .. vNNNN}, site@BBBB
op {vCCCC .. vNNNN}, type@BBBB

gdzie NNNN = CCCC+AA-1, czyli A określa liczbę 0..255, a C określa pierwszy rejestr

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

gdzie NNNN = CCCC+AA-1, czyli A określa liczbę 0..255, a C określa pierwszy rejestr

sugerowany format dla statycznie połączonego invoke-virtual oraz instrukcje dotyczące formatu invoke-super 3rc
3rmi op {vCCCC .. vNNNN}, inline@BBBB

gdzie NNNN = CCCC+AA-1, czyli A określa liczbę 0..255, a C określa pierwszy rejestr

sugerowany format instrukcji invoke-static i invoke-virtual w formacie 3rc
A|G|op BBBB F|E|D|C HHHH 45 cm³ [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

gdzie NNNN = CCCC+AA-1, czyli A określa liczbę 0..255, a C określa pierwszy rejestr

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