หน้านี้แสดงรูปแบบคำสั่งที่ใช้โดยรูปแบบไฟล์ปฏิบัติการ 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 |