이 페이지는 Dalvik 실행 파일 형식과 Dalvik 바이트코드에서 사용하는 명령어 형식을 나열합니다. 바이트코드 참조 문서 와 함께 사용하기 위한 것입니다.
비트 설명
형식 테이블의 첫 번째 열에는 형식의 비트 레이아웃이 나열됩니다. 이것은 각각 16비트 코드 단위를 설명하는 하나 이상의 공백으로 구분된 "단어"로 구성됩니다. 단어의 각 문자는 읽기를 돕기 위해 산재된 수직 막대(" |
")와 함께 상위 비트에서 하위 비트로 읽히는 4비트를 나타냅니다. " A
"에서 순서대로 대문자는 형식 내의 필드를 나타내는 데 사용됩니다(그런 다음 구문 열에 의해 추가로 정의됨). " op
"라는 용어는 형식 내에서 8비트 opcode의 위치를 나타내는 데 사용됩니다. 슬래시 0(" Ø
")은 표시된 위치에서 모든 비트가 0이어야 함을 나타내는 데 사용됩니다.
대부분의 경우 레터링은 코드 단위 내에서 이전 코드 단위에서 이후 코드 단위로, 낮은 순서에서 높은 순서로 진행됩니다. 그러나 이 일반 규칙에는 몇 가지 예외가 있습니다. 이는 유사한 의미의 부분 이름을 다른 명령 형식에서 동일하게 만들기 위해 수행됩니다. 이러한 경우는 형식 설명에 명시적으로 명시되어 있습니다.
예를 들어 " B|A| op CCCC
" 형식은 형식이 2개의 16비트 코드 단위로 구성되어 있음을 나타냅니다. 첫 번째 단어는 하위 8비트의 opcode와 상위 8비트의 4비트 값 쌍으로 구성됩니다. 두 번째 단어는 단일 16비트 값으로 구성됩니다.
형식 ID
형식 테이블의 두 번째 열은 형식에 대한 짧은 식별자를 나타내며 다른 문서 및 코드에서 형식을 식별하는 데 사용됩니다.
대부분의 형식 ID는 3자, 2자리 숫자 다음에 문자로 구성됩니다. 첫 번째 숫자는 형식의 16비트 코드 단위 수를 나타냅니다. 두 번째 숫자는 형식에 포함된 최대 레지스터 수(일부 형식은 가변 수의 레지스터를 수용할 수 있기 때문에 최대)를 나타내며 특수 지정 " r
"은 레지스터 범위가 인코딩됨을 나타냅니다. 마지막 문자는 세미 니모닉 방식으로 형식으로 인코딩된 추가 데이터의 유형을 나타냅니다. 예를 들어, 형식 " 21t
"는 길이가 2이고 하나의 레지스터 참조를 포함하며 추가로 분기 대상을 포함합니다.
제안된 정적 연결 형식에는 추가 " s
" 접미사가 있어 총 4자가 됩니다. 유사하게, 제안된 "인라인" 연결 형식에는 추가 " i
" 접미사가 있습니다. (이 맥락에서 인라인 링크는 기계의 구현에 더 직접적으로 연결된다는 점을 제외하고는 정적 링크와 같습니다.) 마지막으로, 몇 가지 이상한 제안 형식(예: " 20bc
")에는 두 가지 데이터가 포함되어 있으며 둘 다 형식 ID로 표시됩니다. .
유형 코드 문자의 전체 목록은 다음과 같습니다. 일부 양식은 형식에 따라 크기가 다릅니다.
니모닉 | 비트 크기 | 의미 |
---|---|---|
비 | 8 | 즉시 서명 |
씨 | 16, 32 | c 상수 풀 인덱스 |
에프 | 16 | 인터페이스 상수 (정적으로 연결된 형식에서만 사용됨) |
시간 | 16 | 즉시 부호 있는 h at (32비트 또는 64비트 값의 상위 비트, 하위 비트는 모두 0 ) |
나 | 32 | 즉시 서명된 i nt 또는 32비트 부동 소수점 |
엘 | 64 | 즉시 서명된 롱 또는 64비트 이중 |
중 | 16 | 메서드 상수(정적으로 연결된 형식에서만 사용됨 ) |
N | 4 | 즉시 서명된 n ibble |
에스 | 16 | 즉시 서명된 s hort |
티 | 8, 16, 32 | 분기 대상 |
엑스 | 0 | 추가 데이터 없음 |
통사론
형식 테이블의 세 번째 열은 표시된 형식을 사용하는 명령어에 대한 인간 중심 구문을 나타냅니다. 각 명령어는 명명된 opcode로 시작하고 선택적으로 쉼표로 구분된 하나 이상의 인수가 뒤따릅니다.
인수가 첫 번째 열의 필드를 참조할 때마다 해당 필드의 문자는 구문에 표시되며 필드의 각 4비트에 대해 한 번씩 반복됩니다. 예를 들어, 첫 번째 열에 " BB
"로 레이블이 지정된 8비트 필드는 구문 열에서도 " BB
"로 레이블이 지정됩니다.
레지스터의 이름을 지정하는 인수의 형식은 " v X
"입니다. 접두사 " v
"는 레지스터에 접두사 " r
"을 사용하는 Dalvik 실행 파일 형식이 구현될 수 있는 (가상이 아닌) 아키텍처와 충돌을 피하기 위해 정확히 더 일반적인 " r
" 대신 선택되었습니다. (즉, 이 결정은 말을 생략할 필요 없이 가상 레지스터와 실제 레지스터 모두에 대해 이야기하는 것을 가능하게 합니다.)
리터럴 값을 나타내는 인수의 형식은 " #+ X
"입니다. 일부 형식은 상위 비트에 0이 아닌 비트만 있는 리터럴을 나타냅니다. 이러한 경우 0은 비트 표현에 나타나지 않더라도 구문에 명시적으로 표시됩니다.
상대 명령어 주소 오프셋을 나타내는 인수는 " + X
" 형식을 갖습니다.
리터럴 상수 풀 인덱스를 나타내는 인수는 " kind @ X
" 형식을 가지며, 여기서 " kind
"는 참조되는 상수 풀을 나타냅니다. 이러한 형식을 사용하는 각 opcode는 명시적으로 한 종류의 상수만 허용합니다. 대응을 파악하려면 opcode 참조를 참조하십시오. 상수 풀의 종류는 " string
"(문자열 풀 인덱스), " type
"(유형 풀 인덱스), " field
"(필드 풀 인덱스), " meth
"(메서드 풀 인덱스) 및 " site
"(호출 사이트 인덱스)입니다. ).
상수 풀 인덱스의 표현과 유사하게 미리 연결된 오프셋 또는 인덱스를 나타내는 제안된(선택 사항) 형식도 있습니다. 제안된 미리 연결된 값에는 두 가지 유형이 있습니다. vtable 오프셋(" vtaboff
"로 표시) 및 필드 오프셋(" fieldoff
"로 표시).
형식 값이 명시적으로 구문의 일부가 아니지만 대신 변형을 선택하는 경우 각 변형은 대응을 나타내기 위해 접두사 " [ X = N ]
"(예: " [A=2]
")과 함께 나열됩니다. .
형식
체재 | ID | 통사론 | 주목할만한 Opcode 적용 |
---|---|---|---|
해당 없음 | 00x | N/A | 사용되지 않은 opcode에 사용되는 의사 형식. 중단점 opcode의 명목 형식으로 사용하도록 제안됨 |
ØØ| op | 10배 | op | |
나|아| op | 12배 | op vA, vB | |
11n | op vA, #+B | ||
AA| op | 11x | op vAA | |
10톤 | op +AA | 이동 | |
ØØ| op AAAA | 20톤 | op +AAAA | goto/16 |
AA| op BBBB | 기원전 20년 | op AA, 종류@BBBB | 정적으로 결정된 검증 오류에 대해 제안된 형식; A는 오류 유형이고 B는 유형에 적합한 테이블에 대한 인덱스입니다(예: 그러한 메소드가 없는 오류에 대한 메소드 참조) |
AA| op BBBB | 22배 | op vAA, vBBBB | |
21톤 | op vAA, +BBBB | ||
21초 | op vAA, #+BBBB | ||
21시간 | op vAA, #+BBBB0000op vAA, #+BBBB000000000000 | ||
21c | op vAA, type@BBBBop vAA, field@BBBBop vAA, method_handle@BBBBop vAA, proto@BBBBop vAA, string@BBBB | 체크 캐스트 상수 클래스 const 메서드 핸들 const 메서드 유형 상수 문자열 | |
AA| op CC|BB | 23배 | op vAA, vBB, vCC | |
22b | op vAA, vBB, #+CC | ||
나|아| op CCCC | 22톤 | op vA, vB, +CCCC | |
22초 | op vA, vB, #+CCCC | ||
22c | op vA, vB, type@CCCCop vA, vB, field@CCCC | 대신에 | |
22cs | op vA, vB, fieldoff@CCCC | 형식 22c의 정적으로 연결된 필드 액세스 지침에 대한 제안 형식 | |
ØØ| op AAAA lo AAAA 안녕하세요 | 30톤 | op +아아아아아아 | goto/32 |
ØØ| op AAAA BBBB | 32배 | op vAAAA, vBBBB | |
AA| op BBBB 로 BBBB 하이 | 31i | op vAA, #+BBBBBBBB | |
31톤 | op vAA, +BBBBBBBB | ||
31c | op vAA, string@BBBBBBBB | 상수 문자열/점보 | |
아|지| 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 명령에 대한 제안 형식 | |
35미 | [ 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}, 인라인@BBBB 여기서 | 형식 3rc의 인라인 링크된 invoke-static 및 invoke-virtual 명령어에 대해 제안된 형식 | |
아|지| 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 | 호출 다형성 |
AA| op BBBB CCCC HHHH | 4rcc | op> {vCCCC .. vNNNN}, meth@BBBB, proto@HHHH 여기서 | 호출 다형성/범위 |
AA| op BBBB 로 BBBB BBBB BBBB 하이 | 51리터 | op vAA, #+BBBBBBBBBBBBBBBB | 상수 전체 |