Định dạng lệnh 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 Dalvik Executable và Dalvik bytecode. Nó có nghĩa là được sử dụng cùng với tài liệu tham chiếu bytecode .

Mô tả bitwise

Cột đầu tiên trong bảng định dạng liệt kê bố cục theo chiều dọc 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 đọc từ bit cao đến 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 để chỉ ra các trường trong định dạng (sau đó được xác định thêm bởi cột cú pháp). Thuật ngữ " op " được sử dụng để chỉ vị trí của mã opcode tám bit trong định dạng. Một số không gạch chéo (" Ø ") được sử dụng để chỉ ra rằng tất cả các bit phải bằng không ở vị trí được chỉ định.

Đối với hầu hết các phần, ký tự tiến hành từ các đơn vị mã trước đó đến các đơn vị mã muộn hơn 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 để làm cho việc đặ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 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 mã opcode trong tám bit thấp và một cặp giá trị bốn bit trong tám bit cao; và từ thứ hai bao gồm một giá trị 16 bit duy nhất.

Định dạng ID

Cột thứ hai trong bảng định dạng cho biết số nhận dạng ngắ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 một số lượng thanh ghi thay đổi), với ký hiệu đặc biệt " r " chỉ ra rằng một dải thanh ghi được mã hóa. Chữ cái cuối cùng về mặt ký tự chỉ ra 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à cũng chứa một 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 bối 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 vài định dạng được đề xuất kỳ quặc (ví dụ: " 20bc ") bao gồm hai phần dữ liệu đều được thể hiện trong ID định dạng của nó. .

Danh sách đầy đủ các ký tự 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:

Dễ nhớ Kích thước bit Nghĩa
b số 8 ký ngay lập tức b yte
c 16, 32 c onstant pool index
f 16 hằng số inter f ace (chỉ được sử dụng trong các định dạng được liên kết tĩnh)
h 16 ngay lập tức được ký h tại (các bit bậc cao của giá trị 32 hoặc 64-bit; các bit bậc thấp đều bằng 0 )
tôi 32 i nt được ký ngay lập tức, hoặc 32-bit float
l 64 ký ngay lập tức l ong, hoặc 64-bit kép
m 16 m hằng số ethod (chỉ được sử dụng trong các định dạng được liên kết tĩnh)
N 4 ký ngay lập tức n ibble
S 16 ngay lập tức
t 8, 16, 32 chi nhánh t arget
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 về con người cho các lệnh 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 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ố tham chiếu đến một trường từ cột đầu tiên, ký tự cho trường đó được chỉ ra trong cú pháp, lặp lại một lần cho mỗi bốn bit của trường. Ví dụ: trường tám 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 một thanh ghi có dạng " v X ". Tiền tố " v " được chọn thay vì " r " phổ biến hơn một cách chính xác để tránh xung đột với các kiến ​​trúc (không phải ảo) mà trên đó định dạng Dalvik Executable 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. (Có nghĩa là, quyết định này làm cho nó có thể nói về cả thanh ghi ảo và thực cùng nhau mà không cần phải phân bổ.)

Các đối số chỉ ra một giá trị chữ có dạng " #+ X ". Một số định dạng chỉ ra các ký tự chỉ có các bit khác không 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, ngay cả khi chúng không xuất hiện trong biểu diễn bit.

Các đối số chỉ ra sự bù đắp địa chỉ lệnh tương đối có dạng " + X ".

Các đối số cho biết chỉ mục nhóm hằng số theo nghĩa đen có dạng " kind @ X ", trong đó " kind " cho biết nhóm hằng nào đang được tham chiếu. Mỗi opcode sử dụng định dạng như vậy rõ ràng chỉ cho phép một loại hằng số; xem tham chiếu opcode để tìm ra sự tương ứng. Các loại nhóm hằng số là " string " (chỉ mục nhóm chuỗi), " type " (chỉ mục nhóm kiểu), " 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ư việc biểu diễn các chỉ số tổng hợp không đổi, cũng có các biểu mẫu đề xuất (tùy chọn) cho biết các chỉ số hoặc hiệu số được liên kết trước. Có hai loại giá trị được liên kết trước được đề xuất: hiệu số vtable (được chỉ định là " vtaboff ") và hiệu số trường (được chỉ định 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 .

Các định dạng

Định dạng TÔI Cú pháp Các mã quang đáng chú ý được bao phủ
N / A 00x N/A định dạng giả được sử dụng cho các mã opcodes không sử dụng; được đề xuất để sử dụng làm định dạng danh nghĩa cho opcode điểm ngắt
ØØ | op 10x op
B | A | op 12x op vA, vB
11n op vA, # + B
AA | op 11x op vAA
10t op + AA đi đến
ØØ | op AAAA 20t op + AAAA goto / 16
AA | op BBBB 20bc op AA, loại @ 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à 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 pháp)
AA | op BBBB 22x op vAA, vBBBB
21t op vAA, + BBBB
21s op vAA, # + BBBB
21h op vAA, # + BBBB0000
op vAA, # + BBBB000000000000
21c op vAA, nhập @ BBBB
op vAA, trường @ BBBB
op vAA, method_handle @ BBBB
op vAA, proto @ BBBB
op vAA, string @ BBBB
kiểm tra
const-class
const-method-handle
const-method-type
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
22s op vA, vB, # + CCCC
22c op vA, vB, nhập @ CCCC
op vA, vB, trường @ CCCC
ví dụ của
22c 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 ở định dạng 22c
ØØ | op AAAA lo AAAA xin chào 30t op + AAAAAAAA goto / 32
ØØ | op AAAA BBBB 32x op vAAAA, vBBBB
AA | op BBBB lo BBBB xin chào 31i op vAA, # + BBBBBBBB
31t op vAA, + BBBBBBBB
31c op vAA, 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}, nhập @ 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 khác thường trong ký tự ở đâ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.

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

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

định dạng đề xuất cho các lệnh invoke-virtual và lệnh invoke-super được liên kết tĩnh của định dạng 35c
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

Sự lựa chọn khác thường trong ký tự ở đâ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 đề xuất cho các lệnh invoke-staticinvoke-virtual được liên kết nội tuyến của định dạng 35c
AA | op BBBB CCCC 3rc op {vCCCC .. vNNNN}, meth @ BBBB
op {vCCCC .. vNNNN}, site @ BBBB
op {vCCCC .. vNNNN}, nhập @ 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 lệnh invoke-virtual và lệnh invoke-super được liên kết tĩnh của đị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 lệnh invoke-staticinvoke-virtual được liên kết nội tuyến của đị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 ra-đa hình / phạm vi
AA | op BBBB lo BBBB BBBB BBBB chào 51l op vAA, # + BBBBBBBBBBBBBBBB const-wide