หน้านี้แสดงรูปแบบคำสั่งที่ใช้โดยรูปแบบไฟล์ปฏิบัติการ 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, #+BBBB0000op vAA, #+BBBB000000000000
|
||
| 21 องศาเซลเซียส | 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 เท่า | 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@CCCCop 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@BBBBop {vCCCC .. vNNNN}, site@BBBBop {vCCCC .. vNNNN}, type@BBBBโดยที่ |
|
| 3rms | op {vCCCC .. vNNNN}, vtaboff@BBBBโดยที่ |
รูปแบบที่แนะนำสำหรับ invoke-virtual ที่ลิงก์แบบคงที่ และinvoke-super วิธีการของรูปแบบ 3rc
|
|
| 3rmi | op {vCCCC .. vNNNN}, inline@BBBBโดยที่ |
รูปแบบที่แนะนำสำหรับ 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
โดยที่ |
invoke-polymorphic/range |
| AA|op BBBBlo BBBB BBBB BBBBhi | 51l | op vAA, #+BBBBBBBBBBBBBBBB |
const-wide |