이 페이지에서는 Dalvik Executable 형식과 Dalvik 바이트 코드에서 사용하는 명령어 형식을 나열합니다. 이는 바이트 코드 참조 문서와 함께 사용되어야 합니다.
비트 단위 설명
형식 표의 첫 번째 열에는 형식의 비트 단위 레이아웃이 나열됩니다. 레이아웃은 16비트 코드 단위를 나타내는, 공백으로 구분된 '단어' 한 개 이상으로 구성됩니다. 한 단어의 각 문자는 4비트로 표시되어 상위 비트부터 하위 비트까지 읽을 수 있으며 세로 막대('|
')가 군데군데 배치되어 읽는 데 도움이 됩니다. 'A
'부터 순서대로 나오는 대문자는 형식 내 필드를 나타내는 데 사용되어 형식이 구문 열에 의해 더욱 구체적으로 정의될 수 있습니다. 'op
'라는 용어는 형식 내에서 8비트 명령 코드의 위치를 나타내는 데 사용됩니다. 슬래시가 있는 0('Ø
')은 지정된 위치에서 모든 비트가 0이어야 함을 나타내는 데 사용됩니다.
대부분의 경우 문자 부여는 이전 코드 단위에서 이후 코드 단위로 진행되며, 코드 단위 내에서는 낮은 순서에서 높은 순서로 진행됩니다. 그러나 이 일반적인 규칙에는 유사한 의미가 있는 부분에 관한 명명이 여러 명령 형식에서 동일하게 이루어지도록 처리하기 위한 몇 가지 예외가 있습니다. 이러한 경우는 형식 설명에 명시되어 있습니다.
예를 들어 'B|A|op CCCC
' 형식은 형식이 2개의 16비트 코드 단위로 구성됨을 나타냅니다. 첫 번째 단어는 하위 8비트의 명령 코드와 상위 8비트의 4비트 값 쌍으로 구성되며, 두 번째 단어는 단일 16비트 값으로 구성됩니다.
형식 ID
형식 표의 두 번째 열은 형식에 관한 짧은 식별자를 나타내며, 이 식별자는 다른 문서 및 코드에서 형식을 식별하는 데 사용됩니다.
대부분의 형식 ID는 3자로 구성되며 두 자리 숫자 뒤에 문자가 옵니다. 첫 번째 숫자는 형식의 16비트 코드 단위 수를 나타냅니다. 두 번째 숫자는 형식에 포함된 최대 레지스터 수(일부 형식은 가변적인 레지스터 수를 수용할 수 있으므로 최댓값임)를 나타내며, 특별히 지정된 'r
'은 레지스터 범위가 인코딩되었음을 나타냅니다. 마지막 문자는 연상하는 데 도움이 되도록 형식으로 인코딩된 추가 데이터의 유형을 나타냅니다. 예를 들어 '21t
' 형식은 길이가 2이고, 레지스터 참조를 1개 포함하며, 분기 타겟을 추가로 포함합니다.
추천 정적 연결 형식에는 's
' 접미어가 추가되어 총 4자가 됩니다. 마찬가지로 추천 '인라인' 연결 형식에도 'i
' 접미어가 추가됩니다. (이 문맥에서 인라인 연결은 정적 연결과 유사하지만 머신의 구현과 더 직접적인 관련이 있습니다.)
마지막으로, 몇 가지 독특한 추천 형식(예:
'20bc
')에는 형식 ID로 표현되는 두 개의 데이터가 포함됩니다.
유형 코드 문자의 전체 목록은 다음과 같습니다. 형식에 따라 크기가 다른 형식도 있습니다.
니모닉 | 비트 크기 | 의미 |
---|---|---|
b | 8 | 즉시 부호가 있는 바이트 |
c | 16, 32 | 상수 풀 색인 |
f | 16 | 인터페이스 상수(정적으로 연결된 형식에서만 사용됨) |
h | 16 | 즉시 부호가 있는 hat(32비트 또는 64비트 값의 상위 비트로, 하위 비트는 모두 0 임) |
i | 32 | 즉시 부호가 있는 int 또는 32비트 float |
l | 64 | 즉시 부호가 있는 long 또는 64비트 double |
m | 16 | 메서드 상수(정적으로 연결된 형식에서만 사용됨) |
n | 4 | 즉시 부호가 있는 니블 |
s | 16 | 즉시 부호가 있는 short |
t | 8, 16, 32 | 분기 타겟 |
x | 0 | 추가 데이터 없음 |
구문
형식 표의 세 번째 열은 지정된 형식을 사용하는 명령의 인간 중심 구문을 나타냅니다. 각 명령은 이름이 지정된 명령 코드로 시작하며, 선택적으로 뒤에 쉼표로 구분되는 하나 이상의 인수가 있습니다.
인수가 첫 번째 열의 필드를 참조할 때마다 필드의 문자가 구문에 표시되며 필드의 4비트마다 한 번씩 반복됩니다. 예를 들어 첫 번째 열에 'BB
'라고 표시된 8비트 필드는 구문 열에서도 'BB
'로 표시됩니다.
레지스터 이름을 지정하는 인수는 'vX
' 형식을 갖습니다. 레지스터에 'r
' 접두어를 사용하여 Dalvik Executable 형식을 구현할 수 있는, (가상이 아닌) 아키텍처와의 충돌을 피하기 위해 접두사로 더 일반적인 'r
' 대신 'v
'를 선택했습니다. (즉, 이 결정을 통해 완곡어법을 사용할 필요 없이 가상 레지스터와 실제 레지스터를 함께 말할 수 있습니다.)
리터럴 값을 나타내는 인수는 '#+X
' 형식을 갖습니다. 일부 형식은 상위 비트에 0이 아닌 비트만 있는 리터럴을 나타냅니다. 이 경우, 0은 비트 단위 표현으로 나타나지 않지만 구문에 명시적으로 표현됩니다.
상대 명령 주소 오프셋을 나타내는 인수는 '+X
' 형식을 갖습니다.
리터럴 상수 풀 색인을 나타내는 인수는 'kind
'가 어떤 상수 풀이 참조되고 있는지 나타내는 kind@X
' 형식을 갖습니다. 이러한 형식을 명시적으로 사용하는 각 명령 코드는 한 유형의 상수만 허용합니다. 명령 코드 참조를 확인하여 대응 관계를 파악할 수 있습니다. 상수 풀의 유형은 'string
'(문자열 풀 색인), 'type
'(유형 풀 색인), 'field
'(필드 풀 색인), 'meth
'(메서드 풀 색인) 및 'site
'(호출 사이트 색인)입니다.
상수 풀 색인의 표현과 유사하게, 사전 연결된 오프셋 또는 색인을 나타내는 추천(선택사항) 형식도 있습니다. 추천하는 사전 연결된 값으로는 vtable 오프셋('vtaboff
'로 지정됨)과 필드 오프셋('fieldoff
'로 지정됨)의 두 가지 유형이 있습니다.
형식 값이 명시적으로 구문의 일부가 아니며, 변형을 대신 선택하는 경우 각 변형은 접두어 '[X=N]
'을 포함하여 나열되어(예: '[A=2]
') 대응 관계를 나타냅니다.
형식
형식 | ID | 구문 | 적용되는 주요 명령 코드 |
---|---|---|---|
해당 사항 없음 | 00x | N/A |
사용되지 않은 명령 코드에 사용되는 의사 형식입니다. 중단점 명령 코드에 공칭 형식으로 사용할 것을 권장합니다. |
ØØ|op | 10x | op |
|
B|A|op | 12x | op vA, vB |
|
11n | op vA, #+B |
||
AA|op | 11x | op vAA |
|
10t | op +AA |
goto | |
ØØ|op AAAA | 20t | op +AAAA |
goto/16 |
AA|op BBBB | 20bc | op AA, kind@BBBB |
정적으로 확인된 인증 오류의 추천 형식입니다. A는 오류 유형이고 B는 유형에 적합한 표의 색인입니다(예: 메서드 없음 오류의 메서드 참조). |
AA|op BBBB | 22x | op vAA, vBBBB |
|
21t | op vAA, +BBBB |
||
21s | op vAA, #+BBBB |
||
21h | 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 | 23x | op vAA, vBB, vCC |
|
22b | op vAA, vBB, #+CC |
||
B|A|op CCCC | 22t | op vA, vB, +CCCC |
|
22s | op vA, vB, #+CCCC |
||
22c | op vA, vB, type@CCCCop vA, vB, field@CCCC |
instance-of | |
22cs | op vA, vB, fieldoff@CCCC |
22c 형식의 정적으로 연결된 필드 액세스 명령어에 관한 추천 형식 | |
ØØ|op AAAAlo AAAAhi | 30t | 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 | 35c | [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문자가 특이하게 부여된 이유는 개수 및 참조 색인이 3rc 형식과 동일한 라벨을 갖도록 하기 위해서입니다. |
|
35ms | [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문자가 특이하게 부여된 이유는 개수 및 참조 색인이 3rms 형식과 동일한 라벨을 갖도록 하기 위해서입니다. |
정적으로 연결된 35c 형식의 invoke-virtual 및 invoke-super 명령어에 관한 추천 형식 |
|
35mi | [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문자가 특이하게 부여된 이유는 개수 및 참조 색인이 3rmi 형식과 동일한 라벨을 갖도록 하기 위해서입니다. |
인라인 연결된 35c 형식의 invoke-static 및 invoke-virtual 명령어에 관한 추천 형식 |
|
AA|op BBBB CCCC | 3rc | op {vCCCC .. vNNNN}, meth@BBBBop {vCCCC .. vNNNN}, site@BBBBop {vCCCC .. vNNNN}, type@BBBB여기서 |
|
3rms | op {vCCCC .. vNNNN}, vtaboff@BBBB여기서 |
정적으로 연결된 3rc 형식의 invoke-virtual 및 invoke-super 명령어에 관한 추천 형식 |
|
3rmi | op {vCCCC .. vNNNN}, inline@BBBB여기서 |
인라인 연결된 3rc 형식의 invoke-static 및 invoke-virtual 명령어에 관한 추천 형식 |
|
A|G|op BBBB F|E|D|C HHHH | 45cc | [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
여기서 |
invoke-polymorphic/range |
AA|op BBBBlo BBBB BBBB BBBBhi | 51l | op vAA, #+BBBBBBBBBBBBBBBB |
const-wide |