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, #+BBBB0000op vAA, #+BBBB000000000000
|
||
| 21c | op vAA, type@BBBBop vAA, field@BBBBop vAA, method_handle@BBBBop vAA, proto@BBBBop 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@CCCCop 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@BBBBNietypowy 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@BBBBNietypowy 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@BBBBNietypowy 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@BBBBop {vCCCC .. vNNNN}, site@BBBBop {vCCCC .. vNNNN}, type@BBBBgdzie |
|
| 3 rms | op {vCCCC .. vNNNN}, vtaboff@BBBBgdzie |
sugerowany format dla statycznie połączonego invoke-virtual
oraz instrukcje dotyczące formatu invoke-super 3rc
|
|
| 3rmi | op {vCCCC .. vNNNN}, inline@BBBBgdzie |
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 |
invoke-polymorphic/range |
| AA|op BBBBlo BBBB BBBB BBBBhi | 51 l | op vAA, #+BBBBBBBBBBBBBBBB |
const-wide |