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 |