Trang này liệt kê các định dạng hướng dẫn mà định dạng tệp thực thi Dalvik (DEX) và mã byte Dalvik sử dụng. Bạn nên sử dụng tài liệu này cùng với tài liệu tham khảo về mã byte.
Nội dung mô tả theo bit
Cột đầu tiên trong bảng định dạng liệt kê bố cục bit của định dạng. Chuỗi này bao gồm một hoặc nhiều "từ" được phân tách bằng dấu cách, mỗi từ mô tả một đơn vị mã 16 bit. Mỗi ký tự trong một từ đại diện cho 4 bit, đọc từ bit cao đến bit thấp, với các thanh dọc ("|
") xen kẽ để hỗ trợ đọc. Các chữ cái viết hoa theo trình tự từ "A
" được dùng để chỉ các trường trong định dạng (sau đó được xác định thêm bằng cột cú pháp). Thuật ngữ "op
" được dùng để chỉ vị trí của một mã opcode 8 bit trong định dạng. Dấu gạch chéo trên số 0 ("Ø
") được dùng để cho biết rằng tất cả các bit phải bằng 0 ở vị trí được chỉ định.
Trong hầu hết các trường hợp, việc viết chữ sẽ bắt đầu từ các đơn vị mã trước đó đến các đơn vị mã sau đó và từ thứ tự thấp đến thứ tự cao trong một đơn vị mã. Tuy nhiên, có một vài trường hợp ngoại lệ đối với quy tắc chung này, nhằm mục đích đặt tên cho các phần có ý nghĩa tương tự nhau trên nhiều định dạng hướng dẫn. Những trường hợp này được ghi chú rõ ràng trong phần mô tả định dạng.
Ví dụ: định dạng "B|A|op CCCC
" cho biết định dạng này bao gồm hai đơn vị mã 16 bit. Từ đầu tiên bao gồm mã opcode trong 8 bit thấp và một cặp giá trị 4 bit trong 8 bit cao; còn từ thứ hai bao gồm một giá trị 16 bit.
Mã định dạng
Cột thứ hai trong bảng định dạng cho biết giá trị nhận dạng ngắn cho định dạng. Giá trị này được dùng trong các tài liệu khác và trong mã để xác định định dạng.
Hầu hết mã định dạng đều bao gồm 3 ký tự, 2 chữ số theo sau là một chữ cái. Chữ số đầu tiên cho biết số lượng đơn vị mã 16 bit theo định dạng. Số thứ hai cho biết số lượng thanh ghi tối đa mà định dạng chứa (tối đa, vì một số định dạng có thể chứa số lượng thanh ghi biến đổi), với chỉ định đặc biệt "r
" cho biết một dải thanh ghi được mã hoá. Chữ cái cuối cùng có tính chất gợi nhớ một phần cho biết loại dữ liệu bổ sung bất kỳ được định dạng mã hoá. Ví dụ: định dạng "21t
" có độ dài hai, chứa một tệp tham chiếu đăng ký và thêm một mục tiêu nhánh.
Định dạng liên kết tĩnh được đề xuất có thêm hậu tố "s
", tổng cộng là 4 ký tự. Tương tự, các định dạng liên kết "nội tuyến" được đề xuất sẽ có thêm hậu tố "i
". (Trong ngữ cảnh này, liên kết nội tuyến giống như liên kết tĩnh, ngoại trừ việc liên kết trực tiếp hơn vào quá trình triển khai của máy.)
Cuối cùng, một vài định dạng đề xuất khác lạ (ví dụ:
"20bc
") bao gồm hai phần dữ liệu, cả hai đều được biểu thị trong mã định dạng.
Sau đây là danh sách đầy đủ các chữ cái trong mã loại. Xin lưu ý rằng một số biểu mẫu có kích thước khác nhau, tuỳ thuộc vào định dạng:
Thuật nhớ | Kích thước bit | Ý nghĩa |
---|---|---|
b | 8 | byte đã ký ngay lập tức |
c | 16, 32 | chỉ số nhóm hằng số |
f | 16 | hằng số giao diện face (chỉ dùng trong các định dạng được liên kết tĩnh) |
giờ | 16 | hat có dấu ngay lập tức (các bit thứ tự cao của một giá trị 32 hoặc 64 bit; các bit thứ tự thấp đều là 0 )
|
i | 32 | int đã ký ngay lập tức hoặc dấu phẩy động 32 bit |
l | 64 | long có dấu ngay lập tức hoặc số thực 64 bit |
m | 16 | Hằng số method (chỉ dùng trong các định dạng được liên kết tĩnh) |
n | 4 | nibble đã ký ngay lập tức |
giây | 16 | video ngắn signê ngay lập tức |
t | 8, 16, 32 | mục tiêu target của nhánh |
lần | 0 | không có dữ liệu bổ sung |
Cú pháp
Cột thứ ba của bảng định dạng cho biết cú pháp hướng đến con người cho các hướng dẫn sử dụng định dạng được chỉ định. Mỗi lệnh bắt đầu bằng mã opcode được đặt tên và theo sau là một hoặc nhiều đối số (không bắt buộc), các đối số này được phân tách bằng dấu phẩy.
Bất cứ khi nào một đối số tham chiếu đến một trường trong cột đầu tiên, chữ cái cho trường đó sẽ được chỉ định trong cú pháp, lặp lại một lần cho mỗi 4 bit của trường. Ví dụ: trường 8 bit có nhãn "BB
" trong cột đầu tiên cũng sẽ có nhãn "BB
" trong cột cú pháp.
Các đối số đặt tên cho một thanh ghi có dạng "vX
".
Tiền tố "v
" được chọn thay vì "r
" phổ biến hơn chính xác là để tránh xung đột với các cấu trúc (không ảo)
mà định dạng Tệp thực thi Dalvik có thể được triển khai, chính các cấu trúc này
sử dụng tiền tố "r
" cho các thanh ghi của chúng. (Tức là quyết định này cho phép bạn nói về cả thanh ghi ảo và thanh ghi thực cùng nhau mà không cần phải diễn đạt vòng vo.)
Các đối số cho biết giá trị cố định có dạng "#+X
". Một số định dạng cho biết các giá trị cố định chỉ có các bit khác 0 trong các bit thứ tự cao; đối với các giá trị này, các bit 0 được biểu thị rõ ràng trong cú pháp, mặc dù chúng không xuất hiện trong cách biểu thị bit.
Các đối số cho biết độ dời địa chỉ lệnh tương đối có dạng "+X
".
Các đối số cho biết chỉ mục của một nhóm hằng số cố định có dạng "kind@X
", trong đó "kind
" cho biết nhóm hằng số nào đang được tham chiếu. Mỗi mã opcode sử dụng định dạng như vậy chỉ cho phép một loại hằng số một cách rõ ràng; hãy xem tài liệu tham khảo về mã opcode để tìm ra mối tương ứng. Các loại hồ chứa hằng số là "string
" (chỉ mục hồ chứa chuỗi), "type
" (chỉ mục hồ chứa kiểu), "field
" (chỉ mục hồ chứa trường), "meth
" (chỉ mục hồ chứa phương thức) và "site
" (chỉ mục vị trí gọi).
Tương tự như cách biểu thị chỉ mục của nhóm hằng số, cũng có các biểu mẫu đề xuất (không bắt buộc) cho biết các độ lệch hoặc chỉ mục được liên kết trước. Có hai loại giá trị được liên kết trước được đề xuất: độ dời bảng v (được biểu thị là "vtaboff
") và độ dời trường (được biểu thị là "fieldoff
").
Trong trường hợp giá trị định dạng không phải là một phần rõ ràng của cú pháp mà thay vào đó là chọn một biến thể, thì mỗi biến thể sẽ được liệt kê với tiền tố "[X=N]
" (ví dụ: "[A=2]
") để cho biết sự tương ứng.
Dạng thức
Định dạng | ID | Cú pháp | Các mã opcode đáng chú ý được đề cập |
---|---|---|---|
Không áp dụng | 00x | N/A |
định dạng giả được dùng cho các mã opcode không dùng đến; nên dùng làm định dạng danh nghĩa cho mã opcode điểm ngắt |
ØØ|op | 10 lần | op |
|
B|A|op | 12 lần | op vA, vB |
|
11n | op vA, #+B |
||
AA|op | 11 lần | op vAA |
|
10 tấn | op +AA |
goto | |
ØØ|op AAAA | 20 tấn | op +AAAA |
goto/16 |
AA|op BBBB | 20 TCN | op AA, kind@BBBB |
định dạng đề xuất cho các lỗi xác minh được xác định tĩnh; A là loại lỗi và B là chỉ mục vào một bảng phù hợp với loại (ví dụ: tham chiếu phương thức cho lỗi không có phương thức như vậy) |
AA|op BBBB | 22 lần | op vAA, vBBBB |
|
21t | op vAA, +BBBB |
||
21 giây | op vAA, #+BBBB |
||
21 giờ | 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 | 23 lần | op vAA, vBB, vCC |
|
22b | op vAA, vBB, #+CC |
||
B|A|op CCCC | 22t | op vA, vB, +CCCC |
|
22 giây | op vA, vB, #+CCCC |
||
22c | op vA, vB, type@CCCCop vA, vB, field@CCCC
|
instance-of | |
22cs | op vA, vB, fieldoff@CCCC |
định dạng đề xuất cho hướng dẫn truy cập trường được liên kết tĩnh có định dạng 22c | |
ØØ|op AAAAlo AAAAhi | 30 tấn | op +AAAAAAAA |
goto/32 |
ØØ|op AAAA BBBB | 32x | op phiên bản AAAA, phiên bản BBBB |
|
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 | 35 xu | [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 @BBBBLựa chọn không thông thường trong cách viết chữ ở đây phản ánh mong muốn đặt nhãn cho số lượng và chỉ mục tham chiếu giống như trong định dạng 3rc. |
|
35 mili giây | [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@BBBBLựa chọn không thông thường trong cách viết chữ ở đây phản ánh mong muốn đặt nhãn cho số lượng và chỉ mục tham chiếu giống như trong định dạng 3rms. |
định dạng đề xuất cho hướng dẫn invoke-virtual và invoke-super được liên kết tĩnh ở định dạng 35c
|
|
35 dặm | [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@BBBBLựa chọn không thông thường trong cách viết chữ ở đây phản ánh mong muốn làm cho số lượng và chỉ mục tham chiếu có cùng nhãn như trong định dạng 3rmi. |
định dạng đề xuất cho hướng dẫn invoke-static và invoke-virtual được liên kết cùng dòng ở định dạng 35c
|
|
AA|op BBBB CCCC | 3rc | op {vCCCC .. vNNNN}, meth@BBBBop {vCCCC .. vNNNN}, site@BBBBop {vCCCC .. vNNNN}, type@BBBBtrong đó |
|
3rms | op {vCCCC .. vNNNN}, vtaboff@BBBBtrong đó |
định dạng đề xuất cho hướng dẫn invoke-virtual và invoke-super được liên kết tĩnh có định dạng 3rc
|
|
3rmi | op {vCCCC .. vNNNN}, nội tuyến@BBBBtrong đó |
định dạng đề xuất cho hướng dẫn invoke-static và invoke-virtual được liên kết cùng dòng ở định dạng 3rc
|
|
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
trong đó |
invoke-polymorphic/range |
AA|op BBBBlo BBBB BBBB BBBBhi | 51 lít | op vAA, #+BBBBBBBBBBBBBBBB |
const-wide |