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, #+BBBB0000op vAA, #+BBBB000000000000 | ||
21c | op vAA, wpisz@BBBBop vAA, pole@BBBBop vAA, uchwyt_metody@BBBBop vAA, proto@BBBBop 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@CCCCop 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 @BBBBNiezwykł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@BBBBNiezwykł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@BBBBNiezwykł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@BBBBop {vCCCC .. vNNNN}, witryna@BBBBop {vCCCC .. vNNNN}, wpisz@BBBB gdzie | |
3 rms | op {vCCCC .. vNNNN}, vtaboff@BBBB gdzie | sugerowany format statycznie połączonych instrukcji invoke-virtual i invoke-super w formacie 3rc | |
3rmi | op {vCCCC .. vNNNN}, inline@BBBB gdzie | 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 | invoke-polimorficzny/zakres |
AA| op BBBB lo BBBB BBBB BBBB cześć | 51l | op vAA, #+BBBBBBBBBBBBBB | stała szeroka |