이 페이지에서는 Dalvik Executable (DEX) 형식과 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 | opvA, vB | |
| 11n | opvA, #+B | ||
| AA|op | 11x | opvAA | |
| 10t | op+AA | goto | |
| ØØ|op AAAA | 20t | op+AAAA | goto/16 | 
| AA|op BBBB | 20bc | opAA, kind@BBBB | 정적으로 확인된 인증 오류의 추천 형식입니다. A는 오류 유형이고 B는 유형에 적합한 표의 색인입니다(예: 메서드 없음 오류의 메서드 참조). | 
| AA|op BBBB | 22x | opvAA, vBBBB | |
| 21t | opvAA, +BBBB | ||
| 21s | opvAA, #+BBBB | ||
| 21h | opvAA, #+BBBB0000opvAA, #+BBBB000000000000 | ||
| 21c | opvAA, type@BBBBopvAA, field@BBBBopvAA, method_handle@BBBBopvAA, proto@BBBBopvAA, string@BBBB | check-cast const-class const-method-handle const-method-type const-string | |
| AA|op CC|BB | 23x | opvAA, vBB, vCC | |
| 22b | opvAA, vBB, #+CC | ||
| B|A|op CCCC | 22t | opvA, vB, +CCCC | |
| 22s | opvA, vB, #+CCCC | ||
| 22c | opvA, vB, type@CCCCopvA, vB, field@CCCC | instance-of | |
| 22cs | opvA, vB, fieldoff@CCCC | 22c 형식의 정적으로 연결된 필드 액세스 명령어에 관한 추천 형식 | |
| ØØ|op AAAAlo AAAAhi | 30t | op+AAAAAAAA | goto/32 | 
| ØØ|op AAAA BBBB | 32x | opvAAAA, vBBBB | |
| AA|op BBBBlo BBBBhi | 31i | opvAA, #+BBBBBBBB | |
| 31t | opvAA, +BBBBBBBB | ||
| 31c | opvAA, 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 | opvAA, #+BBBBBBBBBBBBBBBB | const-wide | 
