รูปแบบคำสั่งปฏิบัติการ Dalvik

หน้านี้แสดงรายการรูปแบบคำสั่งที่ใช้โดยรูปแบบ Dalvik Executable และ Dalvik bytecode มีขึ้นเพื่อใช้ร่วมกับ เอกสารอ้างอิง bytecode

คำอธิบายระดับบิต

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

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

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

รหัสรูปแบบ

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

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

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

รายการตัวอักษรพิมพ์ดีดทั้งหมดมีดังนี้ โปรดทราบว่าบางรูปแบบมีขนาดแตกต่างกัน ขึ้นอยู่กับรูปแบบ:

ช่วยในการจำ ขนาดบิต ความหมาย
8 ลงนามทันทีโดย yte
16, 32 c ดัชนีสระทันที
16 ค่าคงที่ระหว่าง f ace (ใช้เฉพาะในรูปแบบที่ลิงก์แบบสแตติกเท่านั้น)
ชม. 16 ลงนามทันที h ที่ (บิตลำดับสูงของค่า 32- หรือ 64- บิต; บิตลำดับต่ำทั้งหมด 0 )
ผม 32 ลงชื่อทันที i nt หรือ float แบบ 32 บิต
l 64 ลงนามทันที l ong หรือ 64-bit double
16 ค่าคงที่ ethod (ใช้เฉพาะในรูปแบบที่เชื่อมโยงแบบสแตติกเท่านั้น)
4 ลงนามทันที n ibble
16 ลงนามทันที s hort
t 8, 16, 32 สาขา t arget
x 0 ไม่มีข้อมูลเพิ่มเติม

ไวยากรณ์

คอลัมน์ที่สามของตารางรูปแบบระบุไวยากรณ์ที่มนุษย์กำหนดสำหรับคำแนะนำที่ใช้รูปแบบที่ระบุ แต่ละคำสั่งเริ่มต้นด้วยชื่อ opcode และตามด้วยอาร์กิวเมนต์อย่างน้อยหนึ่งอาร์กิวเมนต์ โดยคั่นด้วยเครื่องหมายจุลภาค

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

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

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

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

อาร์กิวเมนต์ซึ่งระบุดัชนีพูลค่าคงที่ตามตัวอักษรมีรูปแบบ " kind @ X " โดยที่ " kind " ระบุว่ากำลังอ้างอิงพูลค่าคงที่ใด opcode แต่ละตัวที่ใช้รูปแบบดังกล่าวจะยอมให้มีค่าคงที่เพียงชนิดเดียวเท่านั้น ดูการอ้างอิง opcode เพื่อหาการติดต่อ ประเภทของพูลค่าคงที่คือ " string " (ดัชนี string pool), " type " (ดัชนีประเภท pool), " field " (ดัชนี field pool), " meth " (ดัชนี method pool) และ " site " (ดัชนี call site ).

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

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

รูปแบบ

รูปแบบ ไอดี ไวยากรณ์ ครอบคลุม Opcodes ที่โดดเด่น
ไม่มี 00x N/A รูปแบบหลอกที่ใช้สำหรับ opcodes ที่ไม่ได้ใช้ แนะนำให้ใช้เป็นรูปแบบเล็กน้อยสำหรับเบรกพอยต์ opcode
ØØ| op 10x op
B|A| op 12x ตรงข้าม op , vB
11n เทียบกับ op , #+B
AA| op 11x op vAA
10t op +AA ไปที่
ØØ| op AAAA 20t op +AAAA goto/16
AA| op BBBB 20bc op AA ใจดี@BBBB รูปแบบที่แนะนำสำหรับข้อผิดพลาดในการตรวจสอบที่กำหนดแบบคงที่ A คือประเภทของข้อผิดพลาด และ B เป็นดัชนีในตารางที่เหมาะสมกับประเภท (เช่น การอ้างอิงวิธีการสำหรับข้อผิดพลาดที่ไม่มีวิธีดังกล่าว)
AA| op BBBB 22x op vAA, vBBBB
21t กับ op , +BBBB
21s op vAA, #+BBBB
21 ชม กับ op , #+BBBB0000
กับ op , #+BBBB000000000000
21c op vAA พิมพ์@BBBB
op vAA, field@BBBB
op vAA, method_handle@BBBB
op vAA, proto@BBBB
op vAA, string@BBBB
เช็คคาสต์
const-class
const-วิธีจัดการ
const-method-type
const-string
AA| op CC|BB 23x op vAA, vBB, vCC
22b กับ op , vBB, #+CC
B|A| op CCCC 22t ตรงข้าม op , vB, +CCCC
22s op vA, vB, #+CCCC
22c op vA, vB, type@CCCC
op vA, vB, field@CCCC
อินสแตนซ์ของ
22cs op vA, vB, fieldoff@CCCC รูปแบบที่แนะนำสำหรับคำแนะนำการเข้าถึงฟิลด์ที่เชื่อมโยงแบบสถิตของรูปแบบ 22c
ØØ| op AAAA lo AAAA สวัสดี 30t อ๊อฟ + op goto/32
ØØ| อ๊อฟ AAAA BBBB 32x โดย op , vBBBB
AA| op bbbb lo bbbb hi 31i บน op , #+BBBBBBBB
31t บน op , +BBBBBBBB
31c op vAA, string@BBBBBBBB const-string/jumbo
A|G| ที่ 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

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

ตัวเลือกตัวอักษรที่ผิดปกติในที่นี้สะท้อนถึงความปรารถนาที่จะนับและดัชนีอ้างอิงมีป้ายกำกับเดียวกันกับในรูปแบบ 3rms

รูปแบบที่แนะนำสำหรับคำสั่ง invoke 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 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 invoke-virtual และ invoke invoke-super ลิงก์แบบสแตติกของรูปแบบ 3rc
3rmi op {vCCCC .. vNNNN}, inline@BBBB

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

รูปแบบที่แนะนำสำหรับคำสั่ง invoke invoke-static และ invoke invoke-virtual ลิงก์แบบอินไลน์ของรูปแบบ3rc
A|G| ที่ 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
เรียก-polymorphic
AA| op BBBB CCCC HHHH 4rcc op> {vCCCC .. vNNNN}, meth@BBBB, proto@HHHH

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

เรียก-polymorphic/range
AA| op bbbb lo bbbb bbbb bbbb hi 51l บน op , #+BBBBBBBBBBBBBBBB const-wide