Dalvik 실행 가능한 명령어 형식

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

이 페이지는 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, #+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
체크 캐스트
상수 클래스
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@CCCC
op 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@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-virtual invoke-super 명령에 대한 제안 형식
3rmi op {vCCCC .. vNNNN}, 인라인@BBBB

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

형식 3rc의 인라인 링크된 invoke-staticinvoke-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

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

호출 다형성/범위
AA| op BBBB 로 BBBB BBBB BBBB 하이 51리터 op vAA, #+BBBBBBBBBBBBBBBB 상수 전체