Định dạng hướng dẫn thực thi Dalvik

Trang này liệt kê các định dạng hướng dẫn được sử dụng bởi định dạng thực thi Dalvik (DEX) và mã byte Dalvik. Nó được sử dụng cùng với tài liệu tham chiếu mã byte .

Mô tả theo bit

Cột đầu tiên trong bảng định dạng liệt kê cách bố trí theo từng bit của định dạng. Nó 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 bốn bit, đọc từ bit cao đến bit thấp, với các thanh dọc (" | ") xen kẽ để hỗ trợ việc đọc. Các chữ cái viết hoa theo thứ tự từ " A " được sử dụng để biểu thị 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 sử dụng để chỉ vị trí của opcode tám bit trong định dạng. Số 0 bị gạch chéo (" Ø ") được sử dụng để chỉ ra rằng tất cả các bit phải bằng 0 ở vị trí được chỉ định.

Phần lớn, việc viết chữ diễn ra từ các đơn vị mã trước đó đến các đơn vị mã sau và từ bậc thấp đến bậc cao trong một đơn vị mã. Tuy nhiên, có một số ngoại lệ đối với quy tắc chung này, được thực hiện để đặt tên cho các phần có ý nghĩa tương tự giống nhau trên các định dạng lệnh khác nhau. 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 " chỉ ra rằng định dạng bao gồm hai đơn vị mã 16 bit. Từ đầu tiên bao gồm opcode ở tám bit thấp và một cặp giá trị bốn bit ở tám bit cao; và từ thứ hai bao gồm một giá trị 16 bit.

ID định dạng

Cột thứ hai trong bảng định dạng cho biết mã định danh ngắn gọn cho định dạng, được sử dụng trong các tài liệu khác và trong mã để xác định định dạng.

Hầu hết các ID định dạng bao gồm ba ký tự, hai 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 trong định dạng. Chữ 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 thay đổi), với ký hiệu đặc biệt " r " cho biết rằng một phạm vi thanh ghi được mã hóa. Chữ cái cuối cùng mang tính chất bán ghi nhớ cho biết loại dữ liệu bổ sung được mã hóa theo định dạng. Ví dụ: định dạng " 21t " có độ dài hai, chứa một tham chiếu thanh ghi và ngoài ra còn chứa mục tiêu nhánh.

Các định dạng liên kết tĩnh được đề xuất có thêm hậu tố " s ", làm cho chúng có tổng cộng bốn ký tự. Tương tự, các định dạng liên kết "nội tuyến" được đề xuất 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ừ có nhiều mối liên hệ trực tiếp hơn với việc triển khai của máy.) Cuối cùng, một số định dạng được đề xuất kỳ quặc (ví dụ: " 20bc ") bao gồm hai phần dữ liệu đều được biểu thị bằng ID định dạng của nó .

Danh sách đầy đủ các chữ cái mã kiểu như sau. Lưu ý rằng một số biểu mẫu có kích thước khác nhau, tùy thuộc vào định dạng:

ghi nhớ Kích thước bit Nghĩa
b số 8 được ký ngay lập tức bởi yte
c 16, 32 c chỉ số nhóm liên tục
f 16 các hằng số giao diện (chỉ được sử dụng trong các định dạng liên kết tĩnh)
h 16 được ký ngay lập tức h tại (các bit bậc cao có giá trị 32 hoặc 64 bit; các bit bậc thấp đều là 0 )
Tôi 32 i nt được ký ngay lập tức hoặc float 32 bit
tôi 64dài ngay lập tức hoặc gấp đôi 64 bit
tôi 16 hằng số phương thức (chỉ được sử dụng trong các định dạng liên kết tĩnh)
N 4 ký ngay lập tức ibble
S 16 được ngay lập tức
t 8, 16, 32 nhánh t
x 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 tới con người đối với các hướng dẫn sử dụng định dạng được chỉ định. Mỗi lệnh bắt đầu bằng opcode được đặt tên và được theo sau tùy ý bởi một hoặc nhiều đối số, chúng được phân tách bằng dấu phẩy.

Bất cứ khi nào một đối số đề cập đến một trường từ cột đầu tiên, chữ cái của trường đó sẽ được biểu thị trong cú pháp, được lặp lại một lần cho mỗi bốn 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 gắn nhãn " BB " trong cột cú pháp.

Các đối số đặt tên cho một thanh ghi có dạng " v X ". Tiền tố " v " đã được chọn thay vì chính xác là " r " phổ biến hơn để tránh xung đột với các kiến ​​trúc (không ảo) mà định dạng Thực thi Dalvik có thể được triển khai mà chính chúng sử dụng tiền tố " r " cho các thanh ghi của chúng. (Nghĩa là, quyết định này giúp có thể nói về cả thanh ghi ảo và thực cùng nhau mà không cần phải nói vòng vo.)

Các đối số biểu thị giá trị bằng chữ có dạng " #+ X ". Một số định dạng chỉ ra các chữ chỉ có các bit khác 0 trong các bit bậc cao của chúng; đối với những điều này, các số 0 được biểu diễn rõ ràng trong cú pháp, mặc dù chúng không xuất hiện trong cách biểu diễn theo bit.

Các đối số biểu thị độ lệch địa chỉ lệnh tương đối có dạng " + X ".

Các đối số biểu thị chỉ số nhóm hằng số theo nghĩa đen có dạng " kind @ X ", trong đó " kind " cho biết nhóm hằng số nào đang được đề cập đến. Mỗi 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; xem tài liệu tham khảo opcode để tìm ra sự tương ứng. Các loại nhóm không đổi là " string " (chỉ mục nhóm chuỗi), " type " (chỉ mục nhóm loại), " field " (chỉ mục nhóm trường), " meth " (chỉ mục nhóm phương thức) và " site " (gọi chỉ mục trang web ).

Tương tự như cách biểu thị các chỉ số nhóm không đổi, cũng có các biểu mẫu được đề xuất (tùy chọn) cho biết các chỉ số hoặc độ lệch được liên kết trước. Có hai loại giá trị được liên kết trước được đề xuất: độ lệch vtable (được biểu thị là " vtaboff ") và độ lệch 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 đó chọn một biến thể, mỗi biến thể được liệt kê với tiền tố " [ X = N ] " (ví dụ: " [A=2] ") để biểu thị sự tương ứng .

Định dạng

Định dạng NHẬN DẠNG Cú pháp Các Opcode đáng chú ý được đề cập
không áp dụng 00x N/A định dạng giả được sử dụng cho các opcode không được sử dụng; được đề xuất sử dụng làm định dạng danh nghĩa cho opcode điểm dừng
ØØ| op 10 lần op
B|A| op 12x op vA, vB
11 giờ trưa op vA, #+B
AA| op 11x op vAA
10t op +AA đi đến
ØØ| op AAAA 20t op +AAAA đi/16
AA| op BBBB 20bc op AA, loại @BBBB định dạng được đề 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à một chỉ mục trong 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 22x op vAA, vBBBB
21t op vAA, +BBBB
21 giây op vAA, #+BBBB
21h op vAA, #+BBBB0000
op vAA, #+BBBB000000000000
21c op vAA, gõ@BBBB
op vAA, field@BBBB
op vAA, phương thức_handle@BBBB
op vAA, proto@BBBB
op vAA, string@BBBB
kiểm tra
lớp const
const-phương thức-xử lý
const-phương thức-loại
chuỗi const
AA| op CC|BB 23x op vAA, vBB, vCC
22b op vAA, vBB, #+CC
B|A| op CCCC 22t op vA, vB, +CCCC
22 tuổi op vA, vB, #+CCCC
22c op vA, vB, type@CCCC
op vA, vB, field@CCCC
ví dụ của
22cs op vA, vB, fieldoff@CCCC định dạng được đề xuất cho hướng dẫn truy cập trường được liên kết tĩnh ở định dạng 22c
ØØ| op AAAA lo AAAA xin chào 30t op +AAAAAAAA đi/32
ØØ| op AAAA BBBB 32x op vAAAA, vBBBB
AA| op BBBB lo BBBB chào 31i op vAA, #+BBBBBBBB
31t op vAA, +BBBBBBBB
31c op vAA, string@BBBBBBBB chuỗi const/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

Sự lựa chọn bất thường về cách viết chữ ở đây phản ánh mong muốn làm cho số đếm và chỉ mục tham chiếu có cùng nhãn như ở đị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@BBBB

Sự lựa chọn bất thường về cách viết chữ ở đây phản ánh mong muốn làm cho số đếm và chỉ mục tham chiếu có cùng nhãn như ở định dạng 3rms.

định dạng được đề xuất cho các hướng invoke-virtualinvoke-super ở đị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@BBBB

Sự lựa chọn bất thường về cách viết chữ ở đây phản ánh mong muốn làm cho số đếm và chỉ mục tham chiếu có cùng nhãn như ở định dạng 3rmi.

định dạng được đề xuất cho các hướng dẫn invoke-staticinvoke-virtual kết nội tuyến có định dạng 35c
AA| op BBBB CCCC 3rc op {vCCCC .. vNNNN}, meth@BBBB
op {vCCCC .. vNNNN}, site@BBBB
op {vCCCC.. vNNNN}, type@BBBB

trong đó NNNN = CCCC+AA-1 , tức là A xác định số đếm 0..255C xác định thanh ghi đầu tiên

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

trong đó NNNN = CCCC+AA-1 , tức là A xác định số đếm 0..255C xác định thanh ghi đầu tiên

định dạng được đề xuất cho các hướng invoke-virtualinvoke-super ở định dạng 3rc
3rmi op {vCCCC .. vNNNN}, inline@BBBB

trong đó NNNN = CCCC+AA-1 , tức là A xác định số đếm 0..255C xác định thanh ghi đầu tiên

định dạng được đề xuất cho các hướng dẫn invoke-staticinvoke-virtual ở đị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
gọi đa hình
AA| op BBBB CCCC HHHH 4rcc op> {vCCCC.. vNNNN}, meth@BBBB, proto@HHHH

trong đó NNNN = CCCC+AA-1 , tức là A xác định số đếm 0..255C xác định thanh ghi đầu tiên

gọi-đa hình/phạm vi
AA| op BBBB lo BBBB BBBB BBBB chào 51l op vAA, #+BBBBBBBBBBBBBBBB const-rộng