รูปแบบคำสั่งที่เรียกใช้งานได้ของ Dalvik

หน้านี้แสดงรูปแบบคำสั่งที่ใช้โดยรูปแบบไฟล์ปฏิบัติการ Dalvik (DEX) และไบต์โค้ด Dalvik เอกสารนี้มีไว้เพื่อใช้ร่วมกับเอกสารอ้างอิงเกี่ยวกับไบต์โค้ด

คำอธิบายแบบบิตต่อบิต

คอลัมน์แรกในตารางรูปแบบจะแสดงเลย์เอาต์แบบบิตของรูปแบบ โดยประกอบด้วย "คํา" ที่คั่นด้วยเว้นวรรคอย่างน้อย 1 คํา ซึ่งแต่ละคําจะอธิบายหน่วยโค้ด 16 บิต อักขระแต่ละตัวในคำจะแสดงถึง 4 บิต โดยอ่านจากบิตสูงไปต่ำ โดยมีแถบแนวตั้ง ("|") แทรกไว้เพื่อช่วยให้อ่านได้ง่าย อักษรตัวพิมพ์ใหญ่ตามลำดับจาก "A" ใช้เพื่อระบุช่องภายในรูปแบบ (ซึ่งคอลัมน์ไวยากรณ์จะกำหนดเพิ่มเติม) คำว่า "op" ใช้เพื่อระบุตําแหน่งของรหัสปฏิบัติการ 8 บิตภายในรูปแบบ เลข 0 ที่มีขีดกลาง ("Ø") ใช้เพื่อระบุว่าบิตทั้งหมดต้องเป็น 0 ในตำแหน่งที่ระบุ

ส่วนใหญ่แล้ว ตัวอักษรจะเรียงจากหน่วยโค้ดก่อนหน้าไปยังหน่วยโค้ดถัดไป และจากลําดับต่ำไปยังลําดับสูงภายในหน่วยโค้ด อย่างไรก็ตาม กฎทั่วไปนี้มีข้อยกเว้นบางประการ ซึ่งทำขึ้นเพื่อให้การเรียกชื่อส่วนที่มีความหมายคล้ายกันเหมือนกันในคำสั่งรูปแบบต่างๆ กรณีเหล่านี้จะระบุไว้อย่างชัดเจนในคำอธิบายรูปแบบ

เช่น รูปแบบ "B|A|op CCCC" บ่งชี้ว่ารูปแบบประกอบด้วยหน่วยโค้ด 16 บิต 2 หน่วย คำแรกประกอบด้วยอ็อปโค้ดใน 8 บิตต่ำและค่า 4 บิตคู่หนึ่งใน 8 บิตสูง ส่วนคำที่ 2 ประกอบด้วยค่า 16 บิตเดียว

รหัสรูปแบบ

คอลัมน์ที่ 2 ในตารางรูปแบบระบุตัวระบุแบบสั้นสำหรับรูปแบบ ซึ่งใช้ในเอกสารอื่นๆ และในโค้ดเพื่อระบุรูปแบบ

รหัสรูปแบบส่วนใหญ่ประกอบด้วยอักขระ 3 ตัว ตัวเลข 2 ตัวตามด้วยตัวอักษร ตัวเลขแรกระบุจํานวนหน่วยรหัส 16 บิตในรูปแบบ ตัวเลขหลักที่ 2 ระบุจํานวนรีจิสเตอร์สูงสุดที่รูปแบบมี (สูงสุด เนื่องจากรูปแบบบางรูปแบบรองรับจํานวนรีจิสเตอร์ที่ผันแปรได้) โดยมีการกำหนดพิเศษ "r" ซึ่งระบุว่ามีการเข้ารหัสช่วงรีจิสเตอร์ อักษรตัวสุดท้ายเป็นอักษรย่อที่บ่งบอกประเภทของข้อมูลเพิ่มเติมที่เข้ารหัสโดยรูปแบบ เช่น รูปแบบ "21t" มีความยาว 2 มีข้อมูลอ้างอิงรีจิสเตอร์ 1 รายการ และยังมีเป้าหมายสาขาด้วย

รูปแบบการลิงก์แบบคงที่ที่แนะนําจะมีส่วนต่อท้าย "s" เพิ่มเติม รวมเป็น 4 อักขระ ในทํานองเดียวกัน รูปแบบการลิงก์ "ในบรรทัด" ที่แนะนําจะมีส่วนต่อท้าย "i" เพิ่มเติม (ในบริบทนี้ การลิงก์ในบรรทัดนั้นเหมือนกับการลิงก์แบบคงที่ ยกเว้นการเชื่อมโยงโดยตรงมากขึ้นกับการใช้งานของเครื่อง) สุดท้ายคือรูปแบบที่แปลกๆ 2-3 รูปแบบที่เราแนะนำ (เช่น "20bc") มีข้อมูล 2 รายการที่แสดงในรหัสรูปแบบ

รายการตัวอักษรรหัสประเภททั้งหมดมีดังนี้ โปรดทราบว่าแบบฟอร์มบางรายการมีขนาดแตกต่างกันไป โดยขึ้นอยู่กับรูปแบบ

Mnemonic ขนาดบิต ความหมาย
b 8 byte ที่ลงนามแล้วทันที
c 16, 32 ดัชนีพูลแบบคงที่
f 16 ค่าคงที่ interface (ใช้ในรูปแบบที่ลิงก์แบบคงที่เท่านั้น)
h 16 hat ที่มีเครื่องหมายทันที (บิตลำดับสูงของค่า 32 หรือ 64 บิต โดยบิตลำดับต่ำเป็น 0 ทั้งหมด)
i 32 int ที่มีเครื่องหมายทันที หรือจำนวนลอยตัว 32 บิต
l 64 long ที่มีค่าลงชื่อกำกับทันที หรือจำนวนทศนิยม 64 บิต
m 16 ค่าคงที่ของเมธอด (ใช้ในรูปแบบที่ลิงก์แบบคงที่เท่านั้น)
n 4 nibble ที่ลงชื่อแล้วทันที
s 16 short ที่มีการเซ็นชื่อทันที
t 8, 16, 32 branch target
x 0 ไม่มีข้อมูลเพิ่มเติม

วากยสัมพันธ์

คอลัมน์ที่ 3 ของตารางรูปแบบจะระบุไวยากรณ์ที่มุ่งเน้นผู้ใช้สำหรับคำสั่งที่ใช้รูปแบบที่ระบุ คำสั่งแต่ละรายการจะเริ่มต้นด้วยอ็อปโค้ดที่มีชื่อ ตามด้วยอาร์กิวเมนต์อย่างน้อย 1 รายการ (ไม่บังคับ) โดยคั่นด้วยคอมมา

ในทุกที่ที่อาร์กิวเมนต์อ้างอิงถึงช่องจากคอลัมน์แรก ระบบจะระบุตัวอักษรของช่องนั้นในไวยากรณ์ โดยซ้ำกัน 1 ครั้งสำหรับแต่ละบิต 4 บิตของช่อง เช่น ช่อง 8 บิตที่ติดป้ายกำกับว่า BB ในคอลัมน์แรกจะมีป้ายกำกับว่า BB ในคอลัมน์ไวยากรณ์ด้วย

อาร์กิวเมนต์ที่ระบุชื่อรีจิสเตอร์อยู่ในรูปแบบ "vX" เราเลือกคำนำหน้า "v" แทน "r" ที่พบได้ทั่วไปเพื่อหลีกเลี่ยงความขัดแย้งกับสถาปัตยกรรม (ที่ไม่ใช่เสมือนจริง) ที่อาจใช้รูปแบบ Dalvik Executable ซึ่งใช้คำนำหน้า "r" สำหรับรีจิสเตอร์ (กล่าวคือ การตัดสินใจนี้ช่วยให้เราสามารถพูดถึงทั้งรีจิสเตอร์เสมือนจริงและรีจิสเตอร์จริงร่วมกันได้โดยไม่ต้องใช้คำพูดอ้อม)

อาร์กิวเมนต์ที่ระบุค่าตัวอักษรล้วนมีรูปแบบเป็น "#+X" รูปแบบบางอย่างระบุตัวอักษรล้วนที่มีเฉพาะบิตที่ไม่ใช่ 0 ในบิตลำดับสูง สำหรับรูปแบบเหล่านี้ ระบบจะแสดงค่า 0 อย่างชัดเจนในไวยากรณ์ แม้ว่าค่าดังกล่าวจะไม่ปรากฏในการนําเสนอแบบบิตต่อบิตก็ตาม

อาร์กิวเมนต์ที่ระบุออฟเซตที่อยู่คำสั่งแบบสัมพัทธ์จะมีรูปแบบเป็น "+X"

โดยอาร์กิวเมนต์ที่ระบุดัชนีของพูลค่าคงที่แบบลิเทอรัลจะมีรูปแบบเป็น "kind@X" โดยที่ "kind" จะระบุพูลค่าคงที่ที่อ้างอิง ออปโค้ดแต่ละรายการที่ใช้รูปแบบดังกล่าวจะอนุญาตค่าคงที่เพียง 1 ประเภทเท่านั้น ดูการอ้างอิงออปโค้ดเพื่อหาความเชื่อมโยง ประเภทของพูลค่าคงที่ ได้แก่ "string" (ดัชนีพูลสตริง), "type" (ดัชนีพูลประเภท), "field" (ดัชนีพูลฟิลด์), "meth" (ดัชนีพูลเมธอด) และ "site" (ดัชนีตำแหน่งการเรียกใช้)

เช่นเดียวกับการแสดงดัชนีของพูลค่าคงที่ ยังมีรูปแบบที่แนะนำ (ไม่บังคับ) ซึ่งระบุออฟเซตหรือดัชนีที่ลิงก์ไว้ล่วงหน้าด้วย ค่าที่ลิงก์ไว้ล่วงหน้าที่แนะนำมี 2 ประเภท ได้แก่ การเลื่อนตำแหน่ง vtable (ระบุเป็น "vtaboff") และการเลื่อนตำแหน่งช่อง (ระบุเป็น "fieldoff")

ในกรณีที่ค่ารูปแบบไม่ได้เป็นส่วนหนึ่งของไวยากรณ์อย่างชัดเจนแต่เลือกตัวแปรแทน ตัวแปรแต่ละรายการจะแสดงพร้อมกับคำนำหน้า "[X=N]" (เช่น "[A=2]") เพื่อระบุการติดต่อ

รูปแบบ

รูปแบบ รหัส วากยสัมพันธ์ ออปโค้ดที่โดดเด่นซึ่งครอบคลุม
ไม่ระบุ 00x N/A รูปแบบจำลองที่ใช้สำหรับอ็อปโค้ดที่ไม่ได้ใช้ แนะนำให้ใช้เป็นรูปแบบทั่วไปสำหรับอ็อปโค้ดจุดหยุด
ØØ|op 10 เท่า op  
B|A|op 12 เท่า op vA, vB  
11n op vA, #+B  
AA|op 11 เท่า op vAA  
10t op +AA goto
ØØ|op AAAA 20t op +AAAA goto/16
AA|op BBBB 20bc op AA, kind@BBBB รูปแบบที่แนะนำสำหรับข้อผิดพลาดในการยืนยันที่ระบุแบบคงที่ โดย A คือประเภทของข้อผิดพลาด และ B คือดัชนีในตารางที่เหมาะสมกับประเภท (เช่น การอ้างอิงเมธอดสำหรับข้อผิดพลาด "ไม่มีเมธอดดังกล่าว")
AA|op BBBB 22 เท่า op vAA, vBBBB  
21t op vAA, +BBBB  
21 วินาที op vAA, #+BBBB  
21 ชม. op vAA, #+BBBB0000
op vAA, #+BBBB000000000000
 
21 องศาเซลเซียส op vAA, type@BBBB
op vAA, field@BBBB
op vAA, method_handle@BBBB
op vAA, proto@BBBB
op vAA, string@BBBB
check-cast
const-class
const-method-handle
const-method-type
const-string
AA|op CC|BB 23 เท่า op vAA, vBB, vCC  
22ข op vAA, vBB, #+CC  
B|A|op CCCC 22t op vA, vB, +CCCC  
22 วิ op vA, vB, #+CCCC  
22c op vA, vB, type@CCCC
op vA, vB, field@CCCC
instance-of
22cs op vA, vB, fieldoff@CCCC รูปแบบที่แนะนำสำหรับคำสั่งการเข้าถึงช่องที่ลิงก์แบบคงที่ของรูปแบบ 22c
ØØ|op AAAAlo AAAAhi 30t op +AAAAAAAA goto/32
ØØ|op AAAA BBBB 32x op vAAAA, vBBBB  
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 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

 
35 มิลลิวินาที [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

รูปแบบที่แนะนำสำหรับinvoke-virtualที่ลิงก์แบบคงที่ และinvoke-superวิธีการของรูปแบบ 35c
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

รูปแบบที่แนะนำสำหรับinvoke-staticและinvoke-virtualที่ลิงก์ในบรรทัดของวิธีการรูปแบบ 35c
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 กำหนดการบันทึกครั้งแรก

รูปแบบที่แนะนำสำหรับ invoke-virtual ที่ลิงก์แบบคงที่ และinvoke-super วิธีการของรูปแบบ 3rc
3rmi op {vCCCC .. vNNNN}, inline@BBBB

โดยที่ NNNN = CCCC+AA-1 ซึ่งก็คือ A กำหนดจำนวน 0..255 และ C กำหนดการบันทึกครั้งแรก

รูปแบบที่แนะนำสำหรับ invoke-static ที่ลิงก์ในบรรทัด และinvoke-virtual วิธีการของรูปแบบ 3rc
A|G|op BBBB F|E|D|C HHHH 45 ซีซี [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

โดยที่ NNNN = CCCC+AA-1 ซึ่งก็คือ A กำหนดจำนวน 0..255 และ C กำหนดการบันทึกครั้งแรก

invoke-polymorphic/range
AA|op BBBBlo BBBB BBBB BBBBhi 51l op vAA, #+BBBBBBBBBBBBBBBB const-wide