Dalvik Executable 명령어 형식

이 페이지에서는 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 구문 적용되는 주요 opcode
N/A 00x N/A 사용되지 않은 opcode에 사용되는 의사 형식입니다. 중단점 opcode에 공칭 형식으로 사용할 것을 권장합니다.
ØØ|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, #+BBBB0000
op vAA, #+BBBB000000000000
 
21c op vAA, type@BBBB
op vAA, field@BBBB
op vAA, method_handle@BBBB
op vAA, proto@BBBB
op 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@CCCC
op 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-virtualinvoke-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-staticinvoke-virtual 명령어에 관한 추천 형식
AA|op BBBB CCCC 3rc op {vCCCC .. vNNNN}, meth@BBBB
op {vCCCC .. vNNNN}, site@BBBB
op {vCCCC .. vNNNN}, type@BBBB

여기서 NNNN = CCCC+AA-1, 즉 A는 수 0..255를 결정하고, C은 첫 번째 레지스터를 결정합니다.

 
3rms op {vCCCC .. vNNNN}, vtaboff@BBBB

여기서 NNNN = CCCC+AA-1, 즉 A는 수 0..255를 결정하고, C은 첫 번째 레지스터를 결정합니다.

정적으로 연결된 3rc 형식의 invoke-virtualinvoke-super 명령어에 관한 추천 형식
3rmi op {vCCCC .. vNNNN}, inline@BBBB

여기서 NNNN = CCCC+AA-1, 즉 A는 수 0..255를 결정하고, C은 첫 번째 레지스터를 결정합니다.

인라인 연결된 3rc 형식의 invoke-staticinvoke-virtual 명령어에 관한 추천 형식
A|G|op BBBB F|E|D|C HHHH45cc [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 HHHH4rcc op> {vCCCC .. vNNNN}, meth@BBBB, proto@HHHH

여기서 NNNN = CCCC+AA-1, 즉 A는 수 0..255를 결정하고, C은 첫 번째 레지스터를 결정합니다.

invoke-polymorphic/range
AA|op BBBBlo BBBB BBBB BBBBhi 51l op vAA, #+BBBBBBBBBBBBBBBB const-wide