Formaty instrukcji wykonywalnych Dalvik

Ta strona zawiera listę formatów instrukcji używanych w formacie pliku wykonywalnego Dalvik (DEX) i kodzie bajtowym Dalvik. Należy go używać w połączeniu z dokumentem referencyjnym kodu bajtowego .

Opisy bitowe

Pierwsza kolumna w tabeli formatów zawiera bitowy układ formatu. Składa się z jednego lub większej liczby oddzielonych spacjami „słów”, z których każde opisuje 16-bitową jednostkę kodu. Każdy znak w słowie reprezentuje cztery bity, odczytywane od najwyższych do najniższych bitów, z pionowymi kreskami („ | ”) przeplatanymi, aby ułatwić czytanie. Wielkie litery w kolejności od „ A ” są używane do wskazania pól w formacie (które następnie są dalej definiowane przez kolumnę składni). Termin „ op ” używany jest do wskazania pozycji ośmiobitowego kodu operacji w formacie. Przekreślone zero („ Ø ”) służy do wskazania, że ​​wszystkie bity muszą mieć wartość zero we wskazanej pozycji.

W przeważającej części liternictwo przechodzi od wcześniejszych jednostek kodu do późniejszych jednostek kodu, a od niższego do wyższego rzędu w obrębie jednostki kodu. Istnieje jednak kilka wyjątków od tej ogólnej zasady, które wprowadzono, aby nazewnictwo części o podobnym znaczeniu było takie samo w różnych formatach instrukcji. Przypadki te są wyraźnie odnotowane w opisach formatów.

Na przykład format „ B|A| op CCCC ” wskazuje, że format składa się z dwóch 16-bitowych jednostek kodu. Pierwsze słowo składa się z kodu operacji w ośmiu dolnych bitach i pary czterobitowych wartości w ośmiu najwyższych bitach; a drugie słowo składa się z pojedynczej wartości 16-bitowej.

Sformatuj identyfikatory

Druga kolumna w tabeli formatów wskazuje krótki identyfikator formatu, który jest używany w innych dokumentach oraz w kodzie w celu identyfikacji formatu.

Większość identyfikatorów formatów składa się z trzech znaków, dwóch cyfr i litery. Pierwsza cyfra wskazuje liczbę 16-bitowych jednostek kodu w formacie. Druga cyfra wskazuje maksymalną liczbę rejestrów, jaką zawiera format (maksymalna, ponieważ niektóre formaty mogą pomieścić zmienną liczbę rejestrów), ze specjalnym oznaczeniem „ r ” wskazującym, że zakodowany jest zakres rejestrów. Ostatnia litera pół-mnemonicznie wskazuje typ dodatkowych danych zakodowanych w tym formacie. Na przykład format „ 21t ” ma długość dwa, zawiera jedno odwołanie do rejestru i dodatkowo zawiera cel rozgałęzienia.

Sugerowane formaty linków statycznych mają dodatkowy przyrostek „ s ”, co daje w sumie cztery znaki. Podobnie sugerowane formaty linków „inline” mają dodatkowy przyrostek „ i ”. (W tym kontekście łączenie inline przypomina łączenie statyczne, z wyjątkiem bardziej bezpośrednich powiązań z implementacją maszyny.) Na koniec kilka dziwacznych sugerowanych formatów (np. „ 20bc ”) zawiera dwa fragmenty danych, które są reprezentowane w identyfikatorze formatu .

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

Mnemoniczny Rozmiary bitów Oznaczający
B 8 natychmiast podpisano przez yte
C 16, 32 stały indeks puli
F 16 stałe interfejsu (używane tylko w formatach połączonych statycznie)
H 16 natychmiastowe h at ze znakiem (najważniejsze bity o wartości 32- lub 64-bitowej; wszystkie bity o niższym znaczeniu mają 0 )
I 32 natychmiastowy znak i nt lub 32-bitowy float
l 64 natychmiast podpisany długi lub 64-bitowy podwójny
M 16 stałe metody (używane tylko w formatach połączonych statycznie)
N 4 natychmiast podpisany n ibble
S 16 natychmiast podpisano s hort
T 8, 16, 32 oddział t arget
X 0 żadnych dodatkowych danych

Składnia

Trzecia kolumna tabeli formatów wskazuje składnię zorientowaną na człowieka dla instrukcji korzystających ze wskazanego formatu. Każda instrukcja zaczyna się od nazwanego kodu operacji i opcjonalnie następuje po jednym lub większej liczbie argumentów oddzielonych przecinkami.

Wszędzie tam, gdzie argument odnosi się do pola z pierwszej kolumny, w składni wskazywana jest litera tego pola, powtarzana raz dla każdych czterech bitów pola. Na przykład ośmiobitowe pole oznaczone „ BB ” w pierwszej kolumnie będzie również oznaczone jako „ BB ” w kolumnie składni.

Argumenty nadające nazwę rejestrowi mają postać „ v X ”. Przedrostek „ v ” został wybrany zamiast bardziej powszechnego „ r ” dokładnie po to, aby uniknąć konfliktu z (niewirtualnymi) architekturami, w których można zaimplementować format Dalvik Executable, które same używają przedrostka „ r ” w swoich rejestrach. (Oznacza to, że ta decyzja umożliwia łączenie zarówno rejestrów wirtualnych, jak i rzeczywistych, bez konieczności ich omawiania).

Argumenty wskazujące wartość dosłowną mają postać „ #+ X ”. Niektóre formaty wskazują literały, które w bitach wyższego rzędu mają tylko niezerowe bity; w tym przypadku zera są jawnie reprezentowane w składni, mimo że nie pojawiają się w reprezentacji bitowej.

Argumenty wskazujące względne przesunięcie adresu instrukcji mają postać „ + X ”.

Argumenty wskazujące dosłowny indeks stałej puli mają postać „ kind @ X ”, gdzie „ kind ” wskazuje, do której stałej puli się odnosimy. Każdy kod operacji, który używa takiego formatu, wyraźnie dopuszcza tylko jeden rodzaj stałej; zobacz odwołanie do kodu operacji, aby znaleźć zgodność. Rodzaje pul stałych to „ string ” (indeks puli ciągów), „ type ” (indeks puli typów), „ field ” (indeks puli pól), „ meth ” (indeks puli metod) i „ site ” (indeks witryny wywołującej ).

Podobnie jak w przypadku reprezentacji stałych indeksów puli, sugerowane są również (opcjonalne) formy wskazujące wstępnie połączone przesunięcia lub indeksy. Istnieją dwa typy sugerowanych wartości wstępnie połączonych: przesunięcia vtable (oznaczane jako „ vtaboff ”) i przesunięcia pól (oznaczane jako „ fieldoff ”).

W przypadkach, gdy wartość formatu nie jest jawną częścią składni, ale zamiast tego wybiera wariant, każdy wariant jest wyświetlany z przedrostkiem „ [ X = N ] ” (np. „ [A=2] ”), aby wskazać zgodność .

Formaty

Format ID Składnia Omówiono ważne kody operacji
Nie dotyczy 00x N/A pseudoformat używany dla nieużywanych kodów operacji; sugerowany do użycia jako nominalny format kodu operacji punktu przerwania
ØŘ| op 10x op
B|A| op 12x op vA, vB
11n op vA, #+B
AA| op 11x op vAA
10t op +AA iść do
ØŘ| op AAAA 20t op +AAAA przejdź/16
AA| na BBBB 20 p.n.e op AA, miły@BBBB sugerowany format statycznie określonych błędów weryfikacji; A to typ błędu, a B to indeks tabeli odpowiedniego typu (np. odniesienia do metod w przypadku błędu „nie-takiej metody”)
AA| na BBBB 22x op vAA, vBBBB
21t op vAA, +BBBB
21s op vAA, #+BBBB
21h op vAA, #+BBBB0000
op vAA, #+BBBB000000000000
21c op vAA, wpisz@BBBB
op vAA, pole@BBBB
op vAA, uchwyt_metody@BBBB
op vAA, proto@BBBB
op vAA, string@BBBB
rzut kontrolny
klasa stała
uchwyt metody stałej
typ-metody stałej
ciąg-stały
AA| op CC|BB 23x op vAA, vBB, vCC
22b op vAA, vBB, #+CC
B|A| na CCCC 22t op vA, vB, +CCCC
22 s op vA, vB, #+CCCC
22c op vA, vB, typ@CCCC
op vA, vB, pole@CCCC
wystąpienie
22cs op vA, vB, Fieldoff@CCCC sugerowany format statycznie połączonych instrukcji dostępu do pola w formacie 22c
ØŘ| op AAAA lo AAAA cześć 30t op +AAAAAAAA przejdź/32
ØŘ| o AAAA BBBB 32x op vAAAA, vBBBB
AA| op BBBB lo BBBB cześć 31i op vAA, #+BBBBBBBB
31t op vAA, +BBBBBBBB
31c op vAA, string@BBBBBBBB ciąg stały/jumbo
A|G| op BBBB F|E|D|C 35c [ A=5 ] op {vC, vD, vE, vF, vG}, met@BBBB
[ A=5 ] op {vC, vD, vE, vF, vG}, miejsce@BBBB
[ A=5 ] op {vC, vD, vE, vF, vG}, typ@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

Niezwykły wybór liternictwa odzwierciedla tutaj chęć, aby liczebność i indeks referencyjny miały tę samą etykietę, 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

Niezwykły wybór liter odzwierciedla tutaj chęć, aby liczba i indeks referencyjny miały tę samą etykietę, co w formacie 3rms.

sugerowany format statycznie połączonych instrukcji invoke-virtual i invoke-super w formacie 35c
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

Niezwykły wybór liternictwa odzwierciedla tutaj chęć, aby liczba i indeks referencyjny miały tę samą etykietę, co w formacie 3rmi.

sugerowany format inline połączonych instrukcji invoke-static i invoke-virtual w formacie 35c
AA| na BBBB CCCC 3rc op {vCCCC .. vNNNN}, met@BBBB
op {vCCCC .. vNNNN}, witryna@BBBB
op {vCCCC .. vNNNN}, wpisz@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 statycznie połączonych instrukcji invoke-virtual i invoke-super w formacie 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 inline połączonych instrukcji invoke-static i invoke-virtual w formacie 3rc
A|G| op BBBB F|E|D|C HHHH 45cc [ A=5 ] op {vC, vD, vE, vF, vG}, met@BBBB, proto@HHHH
[ A=4 ] op {vC, vD, vE, vF}, met@BBBB, proto@HHHH
[ A=3 ] op {vC, vD, vE}, met@BBBB, proto@HHHH
[ A=2 ] op {vC, vD}, met@BBBB, proto@HHHH
[ A=1 ] op {vC}, met@BBBB, proto@HHHH
invoke-polimorficzny
AA| op BBBB CCCC HHHH 4rcc op> {vCCCC .. vNNNN}, met@BBBB, proto@HHHH

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

invoke-polimorficzny/zakres
AA| op BBBB lo BBBB BBBB BBBB cześć 51l op vAA, #+BBBBBBBBBBBBBB stała szeroka