การออกแบบทั่วไป
- โมเดลเครื่องและรูปแบบการโทรมีจุดมุ่งหมายเพื่อเลียนแบบสถาปัตยกรรมจริงทั่วไปและรูปแบบการโทรแบบ C โดยประมาณ:
- เครื่องเป็นแบบรีจิสเตอร์ และเฟรมจะมีขนาดคงที่เมื่อสร้าง แต่ละเฟรมประกอบด้วยจำนวนรีจิสเตอร์เฉพาะ (ระบุโดยวิธีการ) เช่นเดียวกับข้อมูลเสริมที่จำเป็นในการดำเนินการวิธีการ เช่น (แต่ไม่จำกัดเพียง) ตัวนับโปรแกรม และการอ้างอิงไปยังไฟล์
.dex
ที่มีวิธีการ . - เมื่อใช้กับค่าบิต (เช่นจำนวนเต็มและตัวเลขทศนิยม) รีจิสเตอร์จะถือว่ามีความกว้าง 32 บิต คู่รีจิสเตอร์ที่อยู่ติดกันใช้สำหรับค่า 64 บิต ไม่มีข้อกำหนดการจัดตำแหน่งสำหรับคู่รีจิสเตอร์
- เมื่อใช้สำหรับการอ้างอิงออบเจ็กต์ รีจิสเตอร์จะถือว่ากว้างพอที่จะเก็บการอ้างอิงดังกล่าวได้เพียงรายการเดียว
- ในแง่ของการแสดงระดับบิต
(Object) null == (int) 0
- อาร์กิวเมนต์ N ของวิธีการลงจอดในการลงทะเบียน N สุดท้ายของกรอบการเรียกใช้ของวิธีการตามลำดับ อาร์กิวเมนต์แบบกว้างใช้สองรีจิสเตอร์ วิธีการอินสแตนซ์จะถูกส่งผ่านการอ้างอิง
this
เป็นอาร์กิวเมนต์แรก
- เครื่องเป็นแบบรีจิสเตอร์ และเฟรมจะมีขนาดคงที่เมื่อสร้าง แต่ละเฟรมประกอบด้วยจำนวนรีจิสเตอร์เฉพาะ (ระบุโดยวิธีการ) เช่นเดียวกับข้อมูลเสริมที่จำเป็นในการดำเนินการวิธีการ เช่น (แต่ไม่จำกัดเพียง) ตัวนับโปรแกรม และการอ้างอิงไปยังไฟล์
- หน่วยจัดเก็บข้อมูลในสตรีมคำสั่งเป็นปริมาณที่ไม่ได้ลงนาม 16 บิต บิตบางคำสั่งจะถูกละเว้น / ต้องเป็นศูนย์
- คำแนะนำไม่ได้จำกัดอยู่เพียงประเภทใดประเภทหนึ่งโดยไม่จำเป็น ตัวอย่างเช่น คำแนะนำที่ย้ายค่ารีจิสเตอร์ 32 บิตโดยไม่มีการตีความ ไม่จำเป็นต้องระบุว่ากำลังย้าย ints หรือ float
- มีพูลคงที่ที่แจกแจงและจัดทำดัชนีแยกต่างหากสำหรับการอ้างอิงถึงสตริง ชนิด ฟิลด์ และวิธีการ
- ข้อมูลตามตัวอักษรระดับ Bitwise จะแสดงแบบอินไลน์ในสตรีมคำสั่ง
- เนื่องจากในทางปฏิบัติ เป็นเรื่องปกติที่วิธีการจะต้องมีการลงทะเบียนมากกว่า 16 รายการ และเนื่องจากการจำเป็นต้องมีการลงทะเบียนมากกว่าแปดรายการนั้น เป็น เรื่องปกติธรรมดา คำสั่งจำนวนมากจึงจำกัดอยู่เพียงการจัดการกับการลงทะเบียน 16 รายการแรกเท่านั้น เมื่อเป็นไปได้ตามสมควร คำแนะนำจะอนุญาตให้อ้างอิงได้ถึงรีจิสเตอร์ 256 ตัวแรก นอกจากนี้ คำสั่งบางคำสั่งยังมีตัวแปรที่ช่วยให้สามารถนับจำนวนรีจิสเตอร์ได้มากขึ้น รวมถึงคู่คำสั่ง
move
ที่รับทั้งหมดที่สามารถจัดการกับรีจิสเตอร์ในช่วงv0
–v65535
ในกรณีที่ตัวแปรคำสั่งไม่พร้อมใช้งานเพื่อจัดการกับรีจิสเตอร์ที่ต้องการ คาดว่าเนื้อหารีจิสเตอร์จะถูกย้ายจากรีจิสเตอร์เดิมไปยังรีจิสเตอร์ต่ำ (ก่อนการดำเนินการ) และ/หรือย้ายจากรีจิสเตอร์ผลลัพธ์ต่ำไปสูง ลงทะเบียน (หลังการดำเนินการ) - มี "คำแนะนำหลอก" หลายประการที่ใช้เพื่อเก็บเพย์โหลดข้อมูลที่มีความยาวผันแปรได้ ซึ่งอ้างอิงโดยคำสั่งทั่วไป (เช่น
fill-array-data
) คำสั่งดังกล่าวจะต้องไม่ถูกพบในระหว่างขั้นตอนการดำเนินการปกติ นอกจากนี้ คำแนะนำจะต้องอยู่บนออฟเซ็ตโค้ดไบต์ที่เป็นเลขคู่ (นั่นคือ จัดแนว 4 ไบต์) เพื่อให้เป็นไปตามข้อกำหนดนี้ เครื่องมือสร้าง dex จะต้องปล่อยคำสั่งnop
พิเศษเป็นตัวเว้นวรรค หากคำสั่งดังกล่าวไม่อยู่ในแนวเดียวกัน ท้ายที่สุด แม้ว่าจะไม่จำเป็น แต่คาดว่าเครื่องมือส่วนใหญ่จะเลือกที่จะปล่อยคำสั่งเหล่านี้ที่ส่วนท้ายของวิธีการ เนื่องจากไม่เช่นนั้น อาจเป็นกรณีที่จำเป็นต้องมีคำสั่งเพิ่มเติมเพื่อแยกสาขาออกไป - เมื่อติดตั้งบนระบบที่ทำงานอยู่ คำแนะนำบางอย่างอาจมีการเปลี่ยนแปลง โดยเปลี่ยนรูปแบบเป็นการเพิ่มประสิทธิภาพการเชื่อมโยงแบบคงที่เวลาติดตั้ง นี่คือเพื่อให้สามารถดำเนินการได้เร็วขึ้นเมื่อทราบการเชื่อมโยงแล้ว ดู เอกสารรูปแบบคำแนะนำ ที่เกี่ยวข้องสำหรับรุ่นที่แนะนำ แนะนำให้ใช้คำว่า "แนะนำ" ไม่จำเป็นต้องปฏิบัติตามสิ่งเหล่านี้
- ไวยากรณ์ของมนุษย์และการช่วยจำ:
- ลำดับปลายทางแล้วแหล่งที่มาสำหรับอาร์กิวเมนต์
- opcode บางตัวมีคำต่อท้ายชื่อที่ไม่คลุมเครือเพื่อระบุประเภทที่ใช้:
- opcodes 32 บิตทั่วไปประเภทไม่มีเครื่องหมาย
- opcodes 64 บิตประเภททั่วไปต่อท้ายด้วย
-wide
- opcode เฉพาะประเภทต่อท้ายด้วยประเภท (หรือตัวย่อที่ตรงไปตรงมา) หนึ่งใน:
-boolean
-byte
-char
-short
-int
-long
-float
-double
-object
-string
-class
-void
- opcode บางตัวมีส่วนต่อท้ายที่ไม่คลุมเครือเพื่อแยกแยะการดำเนินการที่เหมือนกันซึ่งมีรูปแบบคำสั่งหรือตัวเลือกที่แตกต่างกัน ส่วนต่อท้ายเหล่านี้แยกออกจากชื่อหลักด้วยเครื่องหมายทับ ("
/
") และส่วนใหญ่มีอยู่เพื่อให้มีการแมปแบบหนึ่งต่อหนึ่งพร้อมค่าคงที่คงที่ในโค้ดที่สร้างและตีความไฟล์ปฏิบัติการ (นั่นคือเพื่อลดความคลุมเครือ สำหรับมนุษย์) - ในคำอธิบายที่นี่ ความกว้างของค่า (บ่งชี้ เช่น ช่วงของค่าคงที่หรือจำนวนรีจิสเตอร์ที่อาจระบุได้) ถูกเน้นโดยการใช้อักขระต่อความกว้างสี่บิต
- ตัวอย่างเช่น ในคำสั่ง "
move-wide/from16 vAA, vBBBB
":- "
move
" เป็น opcode พื้นฐานซึ่งระบุการดำเนินการพื้นฐาน (ย้ายค่าของรีจิสเตอร์) - "
wide
" คือส่วนต่อท้ายชื่อ ซึ่งบ่งชี้ว่าทำงานบนข้อมูลแบบกว้าง (64 บิต) - "
from16
" คือส่วนต่อท้าย opcode ซึ่งระบุตัวแปรที่มีการอ้างอิงรีจิสเตอร์ 16 บิตเป็นแหล่งที่มา - "
vAA
" คือรีจิสเตอร์ปลายทาง (โดยนัยจากการดำเนินการ กฎก็คืออาร์กิวเมนต์ปลายทางมาก่อนเสมอ) ซึ่งต้องอยู่ในช่วงv0
–v255
- "
vBBBB
" คือรีจิสเตอร์ต้นทาง ซึ่งจะต้องอยู่ในช่วงv0
–v65535
- "
- ดู เอกสารรูปแบบคำสั่ง สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับรูปแบบคำสั่งต่างๆ (แสดงอยู่ใน "Op & รูปแบบ") รวมถึงรายละเอียดเกี่ยวกับไวยากรณ์ opcode
- ดู เอกสารรูปแบบไฟล์
.dex
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับตำแหน่งที่โค้ดไบต์พอดีกับภาพรวม
สรุปชุดไบต์โค้ด
ปฏิบัติการและรูปแบบ | ช่วยในการจำ / ไวยากรณ์ | ข้อโต้แย้ง | คำอธิบาย |
---|---|---|---|
00 10x | ไม่ | วงจรของเสีย หมายเหตุ: คำแนะนำหลอกที่มีข้อมูลจะถูกแท็กด้วย opcode นี้ ซึ่งในกรณีนี้ไบต์ที่มีลำดับสูงของหน่วย opcode จะระบุถึงลักษณะของข้อมูล ดู "รูปแบบ | |
01 12x | ย้าย vA, vB | A: การลงทะเบียนปลายทาง (4 บิต)B: แหล่งรีจิสเตอร์ (4 บิต) | ย้ายเนื้อหาของการลงทะเบียนที่ไม่ใช่วัตถุหนึ่งไปยังอีกที่หนึ่ง |
02 22x | ย้าย/จาก16 vAA, vBBBB | A: การลงทะเบียนปลายทาง (8 บิต)B: แหล่งรีจิสเตอร์ (16 บิต) | ย้ายเนื้อหาของการลงทะเบียนที่ไม่ใช่วัตถุหนึ่งไปยังอีกที่หนึ่ง |
03 32x | ย้าย/16 vAAAA, vBBBB | A: การลงทะเบียนปลายทาง (16 บิต)B: แหล่งรีจิสเตอร์ (16 บิต) | ย้ายเนื้อหาของการลงทะเบียนที่ไม่ใช่วัตถุหนึ่งไปยังอีกที่หนึ่ง |
04 12x | vA, vB แบบเคลื่อนที่ | A: คู่รีจิสเตอร์ปลายทาง (4 บิต)B: คู่รีจิสเตอร์ต้นทาง (4 บิต) | ย้ายเนื้อหาของคู่รีจิสเตอร์หนึ่งไปยังอีกคู่หนึ่ง หมายเหตุ: การย้ายจาก |
05 22x | เคลื่อนที่กว้าง/จาก 16 vAA, vBBBB | A: คู่รีจิสเตอร์ปลายทาง (8 บิต)B: คู่รีจิสเตอร์ต้นทาง (16 บิต) | ย้ายเนื้อหาของคู่รีจิสเตอร์หนึ่งไปยังอีกคู่หนึ่ง หมายเหตุ: ข้อควรพิจารณาในการติดตั้งใช้งานจะเหมือนกับ |
06 32x | ย้ายกว้าง/16 vAAAA, vBBBB | A: คู่รีจิสเตอร์ปลายทาง (16 บิต)B: คู่รีจิสเตอร์ต้นทาง (16 บิต) | ย้ายเนื้อหาของคู่รีจิสเตอร์หนึ่งไปยังอีกคู่หนึ่ง หมายเหตุ: ข้อควรพิจารณาในการติดตั้งใช้งานจะเหมือนกับ |
07 12x | ย้ายวัตถุ vA, vB | A: การลงทะเบียนปลายทาง (4 บิต)B: แหล่งรีจิสเตอร์ (4 บิต) | ย้ายเนื้อหาของรีจิสเตอร์แบริ่งวัตถุหนึ่งไปยังอีกอันหนึ่ง |
08 22x | ย้ายวัตถุ / from16 vAA, vBBBB | A: การลงทะเบียนปลายทาง (8 บิต)B: แหล่งรีจิสเตอร์ (16 บิต) | ย้ายเนื้อหาของรีจิสเตอร์แบริ่งวัตถุหนึ่งไปยังอีกอันหนึ่ง |
09 32x | ย้ายวัตถุ / 16 vAAAA, vBBBB | A: การลงทะเบียนปลายทาง (16 บิต)B: แหล่งรีจิสเตอร์ (16 บิต) | ย้ายเนื้อหาของรีจิสเตอร์แบริ่งวัตถุหนึ่งไปยังอีกอันหนึ่ง |
0a 11x | ผลการย้าย vAA | A: การลงทะเบียนปลายทาง (8 บิต) | ย้ายผลลัพธ์คำเดียวที่ไม่ใช่วัตถุของ invoke- kind ครั้งล่าสุดไปยังรีจิสเตอร์ที่ระบุ สิ่งนี้จะต้องทำเป็นคำสั่งทันทีหลังจาก invoke- kind ซึ่งมีผลลัพธ์ (คำเดียว ไม่ใช่วัตถุ) ที่ไม่ควรละเลย ที่อื่นไม่ถูกต้อง |
0b 11x | vAA ทั่วทั้งผลลัพธ์ | A: คู่รีจิสเตอร์ปลายทาง (8 บิต) | ย้ายผลลัพธ์แบบ double-word ของ invoke- kind ล่าสุดไปยังคู่รีจิสเตอร์ที่ระบุ สิ่งนี้จะต้องทำเป็นคำสั่งทันทีหลังจาก invoke- kind ซึ่งมีผลลัพธ์ (สองคำ) ที่ไม่ควรละเลย ที่อื่นไม่ถูกต้อง |
0c 11x | ย้ายผลวัตถุ vAA | A: การลงทะเบียนปลายทาง (8 บิต) | ย้ายผลลัพธ์อ็อบเจ็กต์ของ invoke- kind ล่าสุดไปยังรีจิสเตอร์ที่ระบุ สิ่งนี้จะต้องทำเป็นคำสั่งทันทีหลังจาก invoke- kind หรือ filled-new-array ซึ่งผลลัพธ์ (อ็อบเจ็กต์) ไม่ควรถูกละเลย ที่อื่นไม่ถูกต้อง |
0d 11x | ข้อยกเว้นการย้าย vAA | A: การลงทะเบียนปลายทาง (8 บิต) | บันทึกข้อยกเว้นที่เพิ่งพบลงในการลงทะเบียนที่กำหนด นี่จะต้องเป็นคำสั่งแรกของตัวจัดการข้อยกเว้นใดๆ ที่มีข้อยกเว้นที่จับได้และไม่ควรละเลย และคำสั่งนี้จะต้องเกิดขึ้นเป็นคำสั่งแรกของตัวจัดการข้อยกเว้น เท่านั้น ที่อื่นไม่ถูกต้อง |
0e 10x | กลับเป็นโมฆะ | กลับจากวิธี void | |
0f 11x | ส่งกลับ vAA | A: รีจิสเตอร์ค่าส่งคืน (8 บิต) | ส่งกลับจากวิธีการส่งกลับค่าที่ไม่ใช่วัตถุที่มีความกว้างเดียว (32 บิต) |
10 11x | vAA แบบย้อนกลับ | A: ค่าส่งคืนรีจิสเตอร์คู่ (8 บิต) | ส่งกลับจากวิธีการส่งกลับค่าแบบ double-width (64 บิต) |
11 11x | กลับวัตถุ vAA | A: รีจิสเตอร์ค่าส่งคืน (8 บิต) | กลับจากวิธีการส่งคืนวัตถุ |
12 11น | const/4 vA, #+B | A: การลงทะเบียนปลายทาง (4 บิต)B: ลงนาม int (4 บิต) | ย้ายค่าตัวอักษรที่กำหนด (ขยายเครื่องหมายเป็น 32 บิต) ไปยังรีจิสเตอร์ที่ระบุ |
13 21ส | const/16 vAA, #+BBBB | A: การลงทะเบียนปลายทาง (8 บิต)B: ลงนาม int (16 บิต) | ย้ายค่าตัวอักษรที่กำหนด (ขยายเครื่องหมายเป็น 32 บิต) ไปยังรีจิสเตอร์ที่ระบุ |
14 31i | const vAA, #+BBBBBBBB | A: การลงทะเบียนปลายทาง (8 บิต)B: ค่าคงที่ 32 บิตตามอำเภอใจ | ย้ายค่าตามตัวอักษรที่กำหนดไปยังรีจิสเตอร์ที่ระบุ |
15 21ชม | const/high16 vAA, #+BBBB0000 | A: การลงทะเบียนปลายทาง (8 บิต)B: ลงนาม int (16 บิต) | ย้ายค่าตัวอักษรที่กำหนด (ขยายไปทางขวาเป็นศูนย์เป็น 32 บิต) ไปยังรีจิสเตอร์ที่ระบุ |
16 21ส | const-wide/16 vAA, #+BBBB | A: การลงทะเบียนปลายทาง (8 บิต)B: ลงนาม int (16 บิต) | ย้ายค่าตัวอักษรที่กำหนด (ขยายเครื่องหมายเป็น 64 บิต) ไปยังคู่รีจิสเตอร์ที่ระบุ |
17 31i | const-wide/32 vAA, #+BBBBBBBB | A: การลงทะเบียนปลายทาง (8 บิต)B: ลงนาม int (32 บิต) | ย้ายค่าตัวอักษรที่กำหนด (ขยายเครื่องหมายเป็น 64 บิต) ไปยังคู่รีจิสเตอร์ที่ระบุ |
18 51ล | vAA ทั่วทั้ง const, #+BBBBBBBBBBBBBBBB | A: การลงทะเบียนปลายทาง (8 บิต)B: ค่าคงที่ความกว้างสองเท่า (64 บิต) โดยพลการ | ย้ายค่าตัวอักษรที่กำหนดไปยังคู่รีจิสเตอร์ที่ระบุ |
19 21ชม | const-กว้าง/สูง16 vAA, #+BBBB000000000000 | A: การลงทะเบียนปลายทาง (8 บิต)B: ลงนาม int (16 บิต) | ย้ายค่าตัวอักษรที่กำหนด (ขยายไปทางขวาเป็นศูนย์เป็น 64 บิต) ไปยังคู่รีจิสเตอร์ที่ระบุ |
1a 21ค | const-สตริง vAA, string@BBBB | A: การลงทะเบียนปลายทาง (8 บิต)B: ดัชนีสตริง | ย้ายการอ้างอิงไปยังสตริงที่ระบุโดยดัชนีที่กำหนดไปยังรีจิสเตอร์ที่ระบุ |
1b 31c | const-string/jumbo vAA, string@BBBBBBBB | A: การลงทะเบียนปลายทาง (8 บิต)B: ดัชนีสตริง | ย้ายการอ้างอิงไปยังสตริงที่ระบุโดยดัชนีที่กำหนดไปยังรีจิสเตอร์ที่ระบุ |
1c 21c | vAA คลาส const พิมพ์@BBBB | A: การลงทะเบียนปลายทาง (8 บิต)B: ประเภทดัชนี | ย้ายการอ้างอิงไปยังคลาสที่ระบุโดยดัชนีที่กำหนดไปยังรีจิสเตอร์ที่ระบุ ในกรณีที่ประเภทที่ระบุเป็นประเภทดั้งเดิม สิ่งนี้จะจัดเก็บการอ้างอิงถึงคลาสที่เสื่อมถอยของประเภทดั้งเดิม |
1วัน 11x | จอภาพป้อน vAA | A: รีจิสเตอร์แบริ่งอ้างอิง (8 บิต) | รับจอภาพสำหรับวัตถุที่ระบุ |
1e 11x | vAA ของจอภาพ | A: รีจิสเตอร์แบริ่งอ้างอิง (8 บิต) | ปล่อยจอภาพสำหรับวัตถุที่ระบุ หมายเหตุ: หากคำสั่งนี้จำเป็นต้องมีข้อยกเว้น จะต้องดำเนินการเสมือนว่าพีซีได้ก้าวข้ามคำสั่งนั้นไปแล้ว อาจมีประโยชน์ที่จะคิดว่าสิ่งนี้เนื่องจากคำสั่งดำเนินการได้สำเร็จ (ในแง่หนึ่ง) และข้อยกเว้นเกิดขึ้น หลังจาก คำสั่ง แต่ ก่อนที่ คำสั่งถัดไปจะมีโอกาสรัน คำจำกัดความนี้ทำให้เป็นไปได้สำหรับวิธีการใช้บล็อกการล้างข้อมูลมอนิเตอร์ catch-all (เช่น |
1f 21ค | เช็คคาสท์ vAA พิมพ์@BBBB | A: รีจิสเตอร์แบริ่งอ้างอิง (8 บิต)B: ประเภทดัชนี (16 บิต) | โยน ClassCastException หากการอ้างอิงในการลงทะเบียนที่กำหนดไม่สามารถส่งไปยังประเภทที่ระบุได้ หมายเหตุ: เนื่องจาก |
20 22ค | อินสแตนซ์ของ vA, vB, type@CCCC | A: การลงทะเบียนปลายทาง (4 บิต)B: รีจิสเตอร์แบริ่งอ้างอิง (4 บิต)C: ประเภทดัชนี (16 บิต) | เก็บในรีจิสเตอร์ปลายทางที่กำหนด 1 หากการอ้างอิงที่ระบุเป็นอินสแตนซ์ของประเภทที่กำหนด หรือ 0 หากไม่ใช่ หมายเหตุ: เนื่องจาก |
21 12x | vA, vB ที่มีความยาวอาร์เรย์ | A: การลงทะเบียนปลายทาง (4 บิต)B: รีจิสเตอร์แบริ่งอ้างอิงอาเรย์ (4 บิต) | เก็บในปลายทางที่กำหนดลงทะเบียนความยาวของอาร์เรย์ที่ระบุในรายการ |
22 21ค | vAA อินสแตนซ์ใหม่ พิมพ์@BBBB | A: การลงทะเบียนปลายทาง (8 บิต)B: ประเภทดัชนี | สร้างอินสแตนซ์ใหม่ของประเภทที่ระบุ โดยจัดเก็บข้อมูลอ้างอิงไว้ในปลายทาง ประเภทจะต้องอ้างอิงถึงคลาสที่ไม่ใช่อาร์เรย์ |
23 22ค | อาร์เรย์ใหม่ vA, vB, type@CCCC | A: การลงทะเบียนปลายทาง (4 บิต)B: การลงทะเบียนขนาดC: ดัชนีประเภท | สร้างอาร์เรย์ใหม่ของประเภทและขนาดที่ระบุ ประเภทจะต้องเป็นประเภทอาร์เรย์ |
24 35ค | เติมอาร์เรย์ใหม่ {vC, vD, veE, vF, vG}, type@BBBB | A: ขนาดอาร์เรย์และจำนวนคำอาร์กิวเมนต์ (4 บิต)B: ประเภทดัชนี (16 บิต)C..G: อาร์กิวเมนต์รีจิสเตอร์ (อันละ 4 บิต) | สร้างอาร์เรย์ตามประเภทและขนาดที่กำหนด โดยกรอกเนื้อหาที่ให้มา ประเภทจะต้องเป็นประเภทอาร์เรย์ เนื้อหาของอาร์เรย์ต้องเป็นคำเดียว (กล่าวคือ ไม่มีอาร์เรย์แบบ long หรือ double แต่ประเภทการอ้างอิงเป็นที่ยอมรับได้) อินสแตนซ์ที่สร้างขึ้นจะถูกจัดเก็บเป็น "ผลลัพธ์" ในลักษณะเดียวกับที่คำแนะนำการเรียกใช้เมธอดจัดเก็บผลลัพธ์ ดังนั้นอินสแตนซ์ที่สร้างขึ้นจะต้องถูกย้ายไปยังรีจิสเตอร์พร้อมกับคำสั่ง move-result-object ที่ตามมาทันที (หากจำเป็นต้องใช้ ). |
25 3rc | เติมอาร์เรย์ใหม่ / ช่วง {vCCCC .. vNNNN}, type@BBBB | A: ขนาดอาร์เรย์และจำนวนคำอาร์กิวเมนต์ (8 บิต)B: ประเภทดัชนี (16 บิต)C: การลงทะเบียนอาร์กิวเมนต์แรก (16 บิต)N = A + C - 1 | สร้างอาร์เรย์ตามประเภทและขนาดที่กำหนด โดยกรอกเนื้อหาที่ให้มา การชี้แจงและข้อจำกัดเหมือนกับ filled-new-array ตามที่อธิบายไว้ข้างต้น |
26 31ต | fill-array-data vAA, +BBBBBBBB (พร้อมข้อมูลเพิ่มเติมตามที่ระบุด้านล่างใน " fill-array-data-payload Format") | A: การอ้างอิงอาร์เรย์ (8 บิต)B: ลงนาม "สาขา" ชดเชยคำแนะนำหลอกข้อมูลตาราง (32 บิต) | กรอกอาร์เรย์ที่กำหนดด้วยข้อมูลที่ระบุ การอ้างอิงต้องเป็นอาร์เรย์ของค่าพื้นฐาน และตารางข้อมูลจะต้องตรงกับประเภทและต้องไม่มีองค์ประกอบเกินกว่าที่จะพอดีกับอาร์เรย์ นั่นคืออาร์เรย์อาจมีขนาดใหญ่กว่าตาราง และหากเป็นเช่นนั้น จะมีการตั้งค่าเฉพาะองค์ประกอบเริ่มต้นของอาร์เรย์เท่านั้น โดยปล่อยให้ส่วนที่เหลืออยู่ตามลำพัง |
27 11x | โยน vAA | A: การลงทะเบียนที่มีข้อยกเว้น (8 บิต) | โยนข้อยกเว้นที่ระบุ |
28 10ต | ไปที่ +AA | A: ออฟเซ็ตสาขาที่ลงนาม (8 บิต) | ข้ามไปยังคำสั่งที่ระบุโดยไม่มีเงื่อนไข หมายเหตุ: สาขาออฟเซ็ตจะต้องไม่เป็น |
29 20ต | ไปที่/16 +AAAA | A: ออฟเซ็ตสาขาที่ลงนาม (16 บิต) | ข้ามไปยังคำสั่งที่ระบุโดยไม่มีเงื่อนไข หมายเหตุ: สาขาออฟเซ็ตจะต้องไม่เป็น |
2a 30t | ไปที่/32 +AAAAAAA | A: ออฟเซ็ตสาขาที่ลงนาม (32 บิต) | ข้ามไปยังคำสั่งที่ระบุโดยไม่มีเงื่อนไข |
2b 31t | Packed-Switch vAA, +BBBBBBBB (พร้อมข้อมูลเพิ่มเติมตามที่ระบุไว้ด้านล่างใน " รูปแบบ packed-switch-payload ") | A: ลงทะเบียนเพื่อทดสอบB: ลงนาม "สาขา" ชดเชยคำแนะนำหลอกข้อมูลตาราง (32 บิต) | ข้ามไปยังคำสั่งใหม่ตามค่าในรีจิสเตอร์ที่กำหนด โดยใช้ตารางออฟเซ็ตที่สอดคล้องกับแต่ละค่าในช่วงอินทิกรัลเฉพาะ หรือเลื่อนไปที่คำสั่งถัดไปหากไม่มีค่าที่ตรงกัน |
2c 31t | sparse-switch vAA, +BBBBBBBB (พร้อมข้อมูลเพิ่มเติมตามที่ระบุไว้ด้านล่างใน " รูปแบบ sparse-switch-payload ") | A: ลงทะเบียนเพื่อทดสอบB: ลงนาม "สาขา" ชดเชยคำแนะนำหลอกข้อมูลตาราง (32 บิต) | ข้ามไปยังคำสั่งใหม่ตามค่าในรีจิสเตอร์ที่กำหนด โดยใช้ตารางลำดับของคู่ค่า-ออฟเซ็ต หรือเลื่อนไปที่คำสั่งถัดไปหากไม่มีค่าที่ตรงกัน |
2วัน..31 23x | cmp ชนิด vAA, vBB, vCC 2d: cmpl-float (อคติเล็กน้อย) 2e: cmpg-float (อคติ gt) 2f: cmpl-double (อคติเล็กน้อย) 30: cmpg-double (อคติ gt) 31: cmp-ยาว | A: การลงทะเบียนปลายทาง (8 บิต)B: การลงทะเบียนหรือจับคู่แหล่งแรกC: การลงทะเบียนหรือจับคู่แหล่งที่สอง | ดำเนินการจุดลอยตัวที่ระบุหรือการเปรียบเทียบ long โดยตั้งค่า a เป็น 0 ถ้า b == c , 1 ถ้า b > c หรือ -1 ถ้า b < c "อคติ" ที่แสดงไว้สำหรับการดำเนินการจุดลอยตัวบ่งชี้ว่าการเปรียบเทียบ NaN ได้รับการปฏิบัติอย่างไร: คำสั่ง "gt bias" ส่งคืน 1 สำหรับการเปรียบเทียบ NaN และคำสั่ง "lt bias" ส่งคืน -1 ตัวอย่างเช่น หากต้องการตรวจสอบว่าจุดลอยตัว |
32..37 22ต | ถ้า- ทดสอบ vA, vB, + CCCC 32: ถ้า-EQ 33: ถ้า-ใช่ 34: ถ้า-lt 35: ถ้า-ge 36: ถ้า-gt 37: ถ้า-le | A: ลงทะเบียนครั้งแรกเพื่อทดสอบ (4 บิต)B: การลงทะเบียนครั้งที่สองเพื่อทดสอบ (4 บิต)C: ออฟเซ็ตสาขาที่เซ็นชื่อ (16 บิต) | แยกสาขาไปยังปลายทางที่กำหนดหากค่าของรีจิสเตอร์สองตัวที่กำหนดเปรียบเทียบตามที่ระบุ หมายเหตุ: สาขาออฟเซ็ตจะต้องไม่เป็น |
38..3วัน 21ต | ถ้า- ทดสอบ z vAA, +BBBB 38: ถ้า-eqz 39: ถ้า-nez 3a: ถ้า-ltz 3b: ถ้า-gez 3c: ถ้า-gtz 3d: ถ้า-lez | A: ลงทะเบียนเพื่อทดสอบ (8 บิต)B: ออฟเซ็ตสาขาที่เซ็นชื่อ (16 บิต) | แยกไปยังปลายทางที่กำหนดหากค่าของการลงทะเบียนที่กำหนดเปรียบเทียบกับ 0 ตามที่ระบุไว้ หมายเหตุ: สาขาออฟเซ็ตจะต้องไม่เป็น |
3e..43 10x | (ไม่ได้ใช้) | (ไม่ได้ใช้) | |
44..51 23x | อาร์เรย์ vAA, vBB, vCC 44: อายุ 45: ทั่วทั้งช่วงอายุ 46: age-วัตถุ 47: เอจ-บูลีน 48: อายุไบต์ 49: เอจ-ถ่าน 4a: อายุสั้น 4b: เอาล่ะ 4c: aput-wide 4d: aput-วัตถุ 4e: aput-บูลีน 4f: aput-ไบต์ 50: aput-char 51: aput-สั้น | A: ค่าลงทะเบียนหรือคู่; อาจเป็นแหล่งที่มาหรือปลายทาง (8 บิต)B: การลงทะเบียนอาร์เรย์ (8 บิต)C: การลงทะเบียนดัชนี (8 บิต) | ดำเนินการดำเนินการอาร์เรย์ที่ระบุที่ดัชนีที่ระบุของอาร์เรย์ที่กำหนด โหลดหรือจัดเก็บลงในการลงทะเบียนค่า |
52..5f 22ค | ฉัน อินสแตนซ์ vA, vB, field@CCCC 52: เข้าใจแล้ว 53: ทั่วทั้ง iget 54: iget-วัตถุ 55: iget-boolean 56: iget-ไบต์ 57: iget-char 58: iget-สั้น 59: iput 5a: iput-wide 5b: iput-วัตถุ 5c: iput-boolean 5d: iput-ไบต์ 5e: iput-char 5f: iput-short | A: ค่าลงทะเบียนหรือคู่; อาจเป็นแหล่งที่มาหรือปลายทาง (4 บิต)B: การลงทะเบียนวัตถุ (4 บิต)C: ดัชนีอ้างอิงฟิลด์อินสแตนซ์ (16 บิต) | ดำเนินการฟิลด์อินสแตนซ์วัตถุที่ระบุกับฟิลด์ที่ระบุ โหลดหรือจัดเก็บลงในการลงทะเบียนค่า หมายเหตุ: opcode เหล่านี้เป็นตัวเลือกที่สมเหตุสมผลสำหรับการเชื่อมโยงแบบคงที่ โดยเปลี่ยนอาร์กิวเมนต์ของฟิลด์ให้เป็นออฟเซ็ตที่ตรงมากขึ้น |
60..6วัน 21ค | ของ staticop vAA, field@BBBB 60: เก็ท 61: ทั่วทั้งพื้นที่ 62: sget-วัตถุ 63: sget-บูลีน 64: sget-ไบต์ 65: sget-char 66: sget-สั้น 67: น้ำลาย 68: กว้างปาก 69: วัตถุพ่น 6a: สปัต-บูลีน 6b: สปัตไบต์ 6c: เสมหะถ่าน 6d: สั้นมาก | A: ค่าลงทะเบียนหรือคู่; อาจเป็นแหล่งที่มาหรือปลายทาง (8 บิต)B: ดัชนีอ้างอิงฟิลด์คงที่ (16 บิต) | ดำเนินการดำเนินการฟิลด์คงที่ของวัตถุที่ระบุด้วยฟิลด์คงที่ที่ระบุ โหลดหรือจัดเก็บลงในการลงทะเบียนค่า หมายเหตุ: opcode เหล่านี้เป็นตัวเลือกที่สมเหตุสมผลสำหรับการเชื่อมโยงแบบคงที่ โดยเปลี่ยนอาร์กิวเมนต์ของฟิลด์ให้เป็นออฟเซ็ตที่ตรงมากขึ้น |
6e..72 35c | เรียกใช้ ชนิด {vC, vD, veE, vF, vG}, meth@BBBB 6e: เรียกใช้-เสมือน 6f: เรียกใช้-super 70: เรียกใช้โดยตรง 71: เรียกใช้แบบคงที่ 72: เรียกใช้อินเทอร์เฟซ | A: จำนวนคำอาร์กิวเมนต์ (4 บิต)B: ดัชนีอ้างอิงวิธีการ (16 บิต)C..G: อาร์กิวเมนต์รีจิสเตอร์ (อันละ 4 บิต) | โทรตามวิธีที่ระบุ ผลลัพธ์ (ถ้ามี) อาจถูกจัดเก็บไว้พร้อมกับ move-result* ที่เหมาะสมเป็นคำสั่งที่ตามมาทันที เมื่อ ในไฟล์ Dex เวอร์ชัน เรียกใช้ หมายเหตุ: opcode เหล่านี้เป็นตัวเลือกที่สมเหตุสมผลสำหรับการเชื่อมโยงแบบคงที่ โดยเปลี่ยนอาร์กิวเมนต์ของเมธอดให้เป็นออฟเซ็ตที่ตรงมากขึ้น (หรือจับคู่กัน) |
73 10x | (ไม่ได้ใช้) | (ไม่ได้ใช้) | |
74..78 3rc | เรียกใช้ ชนิด / ช่วง {vCCCC .. vNNNN}, meth@BBBB 74: เรียกใช้-เสมือน/ช่วง 75: เรียกใช้-super/range 76: เรียกใช้โดยตรง/ช่วง 77: เรียกใช้-คงที่/ช่วง 78: เรียกใช้อินเทอร์เฟซ/ช่วง | A: จำนวนคำอาร์กิวเมนต์ (8 บิต)B: ดัชนีอ้างอิงวิธีการ (16 บิต)C: การลงทะเบียนอาร์กิวเมนต์แรก (16 บิต)N = A + C - 1 | โทรตามวิธีที่ระบุ ดูคำอธิบาย invoke- kind ครั้งแรกด้านบนสำหรับรายละเอียด คำเตือน และคำแนะนำ |
79..7a 10x | (ไม่ได้ใช้) | (ไม่ได้ใช้) | |
7b..8f 12x | ยกเลิก vA, vB 7b: neg-int 7c: ไม่ใช่ int 7d: neg-long 7e: ไม่นาน 7f: neg-ลอย 80: neg-ดับเบิ้ล 81: int-to-long 82: จากภายในสู่ลอย 83: จากภายในเป็นสองเท่า 84: ยาวถึง int 85: ยาวถึงลอย 86: ยาวเป็นสองเท่า 87: float-to-int 88: ลอยไปยาว 89: ลอยเป็นสองเท่า 8a: สองเท่าถึง int 8b: สองเท่าถึงยาว 8c: สองเท่าถึงลอย 8d: เป็นหน่วยเป็นไบต์ 8e: int-to-char 8f: จากภายในถึงสั้น | A: รีจิสเตอร์ปลายทางหรือคู่ (4 บิต)B: รีจิสเตอร์ต้นทางหรือคู่ (4 บิต) | ดำเนินการการดำเนินการเอกนารีที่ระบุในรีจิสเตอร์ต้นทาง โดยจัดเก็บผลลัพธ์ไว้ในรีจิสเตอร์ปลายทาง |
90..อัฟ23x | binop vAA, vBB, vCC 90: ส่วนเสริม 91: ย่อย int 92: mul-int 93: div-int 94: rem-int 95: และ-int 96: หรือ-int 97: xor-int 98: shl-int 99: shr-int 9a: ushr-int 9b: เพิ่มยาว 9c: ยาวย่อย 9d: มัลยาว 9e: div ยาว 9f: ยาวมาก a0: และ-ยาว a1: หรือ-ยาว a2: xor ยาว a3: shl ยาว a4: shr ยาว a5: ushr ยาว a6: เพิ่ม-ลอย a7: ย่อยลอย a8: มัลโฟลต a9: div-ลอย aa: rem-ลอย ab: เพิ่มสองเท่า ac: ซับดับเบิ้ล โฆษณา: มัล-ดับเบิ้ล th: div-สองเท่า af: rem-ดับเบิ้ล | A: รีจิสเตอร์ปลายทางหรือคู่ (8 บิต)B: รีจิสเตอร์แหล่งแรกหรือคู่ (8 บิต)C: รีจิสเตอร์แหล่งที่สองหรือคู่ (8 บิต) | ดำเนินการดำเนินการไบนารีที่ระบุบนรีจิสเตอร์ต้นทางทั้งสอง โดยจัดเก็บผลลัพธ์ไว้ในรีจิสเตอร์ปลายทาง หมายเหตุ: ตรงกันข้ามกับการดำเนินการทางคณิตศาสตร์ |
b0..cf 12x | บินอป /2addr vA, vB b0: เพิ่ม-int/2addr b1: ย่อย int/2addr b2: mul-int/2addr b3: div-int/2addr b4: rem-int/2addr b5: และ-int/2addr b6: หรือ-int/2addr b7: xor-int/2addr b8: shl-int/2addr b9: shr-int/2addr บริติชแอร์เวย์: ushr-int/2addr bb: เพิ่ม-ยาว/2addr bc: ย่อยยาว/2addr bd: mul-long/2addr เป็น: div-long/2addr bf: rem-long/2addr c0: และ-ยาว/2addr c1: หรือ-long/2addr c2: xor-long/2addr c3: shl-long/2addr c4: shr-long/2addr c5: ushr-long/2addr c6: เพิ่ม-ลอย/2addr c7: ย่อยโฟลต/2addr c8: mul-float/2addr c9: div-float/2addr แคลิฟอร์เนีย: rem-float/2addr cb: เพิ่ม-สองเท่า/2addr ซีซี: ซับดับเบิ้ล/2แอดเดอร์ ซีดี: mul-double/2addr ce: div-double/2addr cf: rem-double/2addr | A: ปลายทางและรีจิสเตอร์ต้นทางหรือคู่ (4 บิต)B: รีจิสเตอร์แหล่งที่สองหรือคู่ (4 บิต) | ดำเนินการดำเนินการไบนารีที่ระบุบนรีจิสเตอร์ต้นทางทั้งสอง โดยจัดเก็บผลลัพธ์ไว้ในรีจิสเตอร์ต้นทางแรก หมายเหตุ: ตรงกันข้ามกับการดำเนินการทางคณิตศาสตร์ |
วัน0..d7 22วิ | binop /lit16 vA, vB, #+CCCC d0: add-int/lit16 d1: rsub-int (ลบแบบย้อนกลับ) d2: mul-int/lit16 d3: div-int/lit16 d4: rem-int/lit16 d5: และ-int/lit16 d6: หรือ-int/lit16 d7: xor-int/lit16 | A: การลงทะเบียนปลายทาง (4 บิต)B: แหล่งรีจิสเตอร์ (4 บิต)C: ลงนาม int คงที่ (16 บิต) | ดำเนินการไบนารี่ op ที่ระบุบนรีจิสเตอร์ที่ระบุ (อาร์กิวเมนต์แรก) และค่าตามตัวอักษร (อาร์กิวเมนต์ที่สอง) โดยจัดเก็บผลลัพธ์ไว้ในรีจิสเตอร์ปลายทาง หมายเหตุ: |
d8..e2 22b | binop /lit8 vAA, vBB, #+CC d8: เพิ่ม int/lit8 d9: rsub-int/lit8 ดา: mul-int/lit8 db: div-int/lit8 dc: rem-int/lit8 dd: และ-int/lit8 โดย: หรือ-int/lit8 df: xor-int/lit8 e0: shl-int/lit8 e1: shr-int/lit8 e2: ushr-int/lit8 | A: การลงทะเบียนปลายทาง (8 บิต)B: แหล่งรีจิสเตอร์ (8 บิต)C: ลงนาม int คงที่ (8 บิต) | ดำเนินการไบนารี่ op ที่ระบุบนรีจิสเตอร์ที่ระบุ (อาร์กิวเมนต์แรก) และค่าตามตัวอักษร (อาร์กิวเมนต์ที่สอง) โดยจัดเก็บผลลัพธ์ไว้ในรีจิสเตอร์ปลายทาง หมายเหตุ: ดูรายละเอียดด้านล่างเกี่ยวกับความหมายของ |
e3..f9 10x | (ไม่ได้ใช้) | (ไม่ได้ใช้) | |
ฟ้า 45cc | เรียกใช้-polymorphic {vC, vD, veE, vF, vG}, meth@BBBB, proto@HHHH | A: จำนวนคำอาร์กิวเมนต์ (4 บิต)B: ดัชนีอ้างอิงวิธีการ (16 บิต)C: ตัวรับ (4 บิต)D..G: อาร์กิวเมนต์รีจิสเตอร์ (อันละ 4 บิต)H: ดัชนีอ้างอิงต้นแบบ (16 บิต) | เรียกใช้เมธอด polymorphic ลายเซ็นที่ระบุ ผลลัพธ์ (ถ้ามี) อาจถูกจัดเก็บไว้พร้อมกับ move-result* ที่เหมาะสมเป็นคำสั่งที่ตามมาทันทีการอ้างอิงเมธอดต้องเป็นเมธอด polymorphic ที่เป็นเอกลักษณ์ เช่น java.lang.invoke.MethodHandle.invoke หรือ java.lang.invoke.MethodHandle.invokeExact ผู้รับจะต้องเป็นอ็อบเจ็กต์ที่รองรับเมธอด polymorphic ลายเซ็นที่กำลังเรียกใช้ การอ้างอิงต้นแบบจะอธิบายประเภทอาร์กิวเมนต์ที่ให้ไว้และประเภทการส่งคืนที่คาดหวัง รหัสไบต์ invoke-polymorphic อาจเพิ่มข้อยกเว้นเมื่อดำเนินการ ข้อยกเว้นอธิบายไว้ในเอกสารประกอบ API สำหรับวิธีลายเซ็น polymorphic ที่กำลังเรียกใช้นำเสนอในไฟล์ Dex ตั้งแต่เวอร์ชัน 038 เป็นต้นไป |
fb4rcc | เรียกใช้-polymorphic/ช่วง {vCCCC .. vNNNN}, meth@BBBB, proto@HHHH | A: จำนวนคำอาร์กิวเมนต์ (8 บิต)B: ดัชนีอ้างอิงวิธีการ (16 บิต)C: ตัวรับ (16 บิต)H: ดัชนีอ้างอิงต้นแบบ (16 บิต)N = A + C - 1 | เรียกใช้ตัวจัดการวิธีการที่ระบุ ดูคำอธิบาย invoke-polymorphic ด้านบนเพื่อดูรายละเอียดนำเสนอในไฟล์ Dex ตั้งแต่เวอร์ชัน 038 เป็นต้นไป |
เอฟซี 35ซี | เรียกใช้ {vC, vD, veE, vF, vG}, call_site@BBBB แบบกำหนดเอง | A: จำนวนคำอาร์กิวเมนต์ (4 บิต)B: ดัชนีอ้างอิงไซต์การโทร (16 บิต)C..G: อาร์กิวเมนต์รีจิสเตอร์ (อันละ 4 บิต) | แก้ไขและเรียกใช้ไซต์การโทรที่ระบุ ผลลัพธ์จากการร้องขอ (ถ้ามี) อาจถูกจัดเก็บไว้พร้อมกับตัวแปร move-result* ที่เหมาะสมเป็นคำสั่งที่ตามมาทันทีคำสั่งนี้ดำเนินการในสองขั้นตอน: การแก้ไขไซต์การโทรและการเรียกใช้ไซต์การโทร การแก้ไขไซต์การโทรจะตรวจสอบว่าไซต์การโทรที่ระบุมีอินสแตนซ์ java.lang.invoke.CallSite ที่เกี่ยวข้องหรือไม่ ถ้าไม่เช่นนั้น เมธอด bootstrap linker สำหรับไซต์การโทรที่ระบุจะถูกเรียกใช้โดยใช้อาร์กิวเมนต์ที่มีอยู่ในไฟล์ DEX (ดู call_site_item ) เมธอด bootstrap linker ส่งคืนอินสแตนซ์ java.lang.invoke.CallSite ที่จะเชื่อมโยงกับไซต์การโทรที่ระบุ หากไม่มีการเชื่อมโยงอยู่ เธรดอื่นอาจสร้างการเชื่อมโยงไว้ก่อนแล้ว และหากเป็นเช่นนั้น การดำเนินการของคำสั่งจะดำเนินต่อไปด้วยอินสแตนซ์ java.lang.invoke.CallSite แรกที่เกี่ยวข้องการเรียกใช้ไซต์การโทรเกิดขึ้นบนเป้าหมาย java.lang.invoke.MethodHandle ของอินสแตนซ์ java.lang.invoke.CallSite ที่ได้รับการแก้ปัญหา เป้าหมายถูกเรียกใช้ราวกับว่ากำลังดำเนินการ invoke-polymorphic (อธิบายไว้ข้างต้น) โดยใช้ตัวจัดการเมธอดและอาร์กิวเมนต์ไปยังคำสั่ง invoke-custom เป็นอาร์กิวเมนต์ของตัวจัดการเมธอดที่แน่นอนในการเรียกใช้ข้อยกเว้นที่เกิดขึ้นโดยวิธี bootstrap linker จะถูกรวมไว้ใน java.lang.BootstrapMethodError BootstrapMethodError จะเพิ่มขึ้นเช่นกันหาก:
038 เป็นต้นไป |
fd3rc | เรียกใช้กำหนดเอง/ช่วง {vCCCC .. vNNNN}, call_site@BBBB | A: จำนวนคำอาร์กิวเมนต์ (8 บิต)B: ดัชนีอ้างอิงไซต์การโทร (16 บิต)C: การลงทะเบียนอาร์กิวเมนต์แรก (16 บิต)N = A + C - 1 | แก้ไขและเรียกใช้ไซต์การโทร ดูคำอธิบาย invoke-custom ด้านบนสำหรับรายละเอียดนำเสนอในไฟล์ Dex ตั้งแต่เวอร์ชัน 038 เป็นต้นไป |
เฟอ 21ค | const-วิธีจัดการ vAA, method_handle@BBBB | A: การลงทะเบียนปลายทาง (8 บิต)B: ดัชนีการจัดการวิธีการ (16 บิต) | ย้ายการอ้างอิงไปยังตัวจัดการวิธีการที่ระบุโดยดัชนีที่กำหนดลงในการลงทะเบียนที่ระบุ นำเสนอในไฟล์ Dex ตั้งแต่เวอร์ชัน 039 เป็นต้นไป |
เอฟเอฟ 21ซี | vAA ประเภทวิธี const, proto@BBBB | A: การลงทะเบียนปลายทาง (8 บิต)B: การอ้างอิงต้นแบบวิธีการ (16 บิต) | ย้ายการอ้างอิงไปยังต้นแบบวิธีการที่ระบุโดยดัชนีที่กำหนดไปยังรีจิสเตอร์ที่ระบุ นำเสนอในไฟล์ Dex ตั้งแต่เวอร์ชัน 039 เป็นต้นไป |
รูปแบบแพ็คเก็ตสวิตช์เพย์โหลด
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ระบุตัวตน | ยูชอร์ต = 0x0100 | ระบุ pseudo-opcode |
ขนาด | ushort | จำนวนรายการในตาราง |
first_key | ภายใน | ค่าเคสสวิตช์แรก (และต่ำสุด) |
เป้าหมาย | อินท์[] | รายการ size เป้าหมายสาขาสัมพันธ์ เป้าหมายจะสัมพันธ์กับที่อยู่ของ opcode ของสวิตช์ ไม่ใช่ของตารางนี้ |
หมายเหตุ: จำนวนหน่วยโค้ดทั้งหมดสำหรับอินสแตนซ์ของตารางนี้คือ (size * 2) + 4
รูปแบบเพย์โหลดแบบเบาบางสวิตช์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ระบุตัวตน | ยูชอร์ต = 0x0200 | ระบุ pseudo-opcode |
ขนาด | ushort | จำนวนรายการในตาราง |
กุญแจ | อินท์[] | รายการค่าคีย์ size เรียงลำดับจากต่ำไปสูง |
เป้าหมาย | อินท์[] | รายการเป้าหมายสาขาสัมพันธ์ size ซึ่งแต่ละเป้าหมายสอดคล้องกับค่าคีย์ที่ดัชนีเดียวกัน เป้าหมายจะสัมพันธ์กับที่อยู่ของ opcode ของสวิตช์ ไม่ใช่ของตารางนี้ |
หมายเหตุ: จำนวนหน่วยโค้ดทั้งหมดสำหรับอินสแตนซ์ของตารางนี้คือ (size * 4) + 2
รูปแบบการเติมอาร์เรย์ข้อมูลเพย์โหลด
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ระบุตัวตน | ยูชอร์ต = 0x0300 | ระบุ pseudo-opcode |
องค์ประกอบ_ความกว้าง | ushort | จำนวนไบต์ในแต่ละองค์ประกอบ |
ขนาด | ไม่ได้ | จำนวนองค์ประกอบในตาราง |
ข้อมูล | ยูไบต์[] | ค่าข้อมูล |
หมายเหตุ: จำนวนหน่วยโค้ดทั้งหมดสำหรับอินสแตนซ์ของตารางนี้คือ (size * element_width + 1) / 2 + 4
รายละเอียดการดำเนินการทางคณิตศาสตร์
หมายเหตุ: การดำเนินการจุดลอยตัวต้องเป็นไปตามกฎ IEEE 754 โดยใช้อันเดอร์โฟลว์แบบปัดเศษไปใกล้ที่สุดและแบบค่อยเป็นค่อยไป ยกเว้นในกรณีที่ระบุไว้เป็นอย่างอื่น
ออปโค้ด | ซี ความหมาย | หมายเหตุ |
---|---|---|
neg-int | int32 ก; ผลลัพธ์ int32 = -a; | ส่วนเสริมสองเอกนารี |
ไม่ใช่-int | int32 ก; ผลลัพธ์ int32 = ~a; | Unary คนเสริม |
neg ยาว | int64 ก; ผลลัพธ์ int64 = -a; | ส่วนเสริมสองเอกนารี |
ไม่นาน | int64 ก; ผลลัพธ์ int64 = ~a; | Unary คนเสริม |
Neg-ลอย | ลอย; ผลลอย = -a; | การปฏิเสธจุดลอยตัว |
Neg-สองครั้ง | ดับเบิ้ลเอ; ผลลัพธ์สองเท่า = -a; | การปฏิเสธจุดลอยตัว |
int-to-long | int32 ก; ผลลัพธ์ int64 = (int64) ก; | ลงชื่อขยาย int32 เป็น int64 |
Int-to-ลอย | int32 ก; ลอยผลลัพธ์ = (ลอย) a; | การแปลง int32 เป็น float โดยใช้แบบกลมถึงผู้คน สิ่งนี้สูญเสียความแม่นยำสำหรับค่าบางอย่าง |
int-to-double | int32 a; ผลลัพธ์สองเท่า = (สองเท่า) a; | การแปลง int32 เป็น double |
ยาวนาน | int64 a; int32 result = (int32) a; | การตัดทอน int64 เป็น int32 |
ยาวเหยียด | int64 a; ลอยผลลัพธ์ = (ลอย) a; | การแปลง int64 เป็น float โดยใช้แบบกลมถึงผู้คน สิ่งนี้สูญเสียความแม่นยำสำหรับค่าบางอย่าง |
ยาวถึงสองครั้ง | int64 a; ผลลัพธ์สองเท่า = (สองเท่า) a; | การแปลง int64 เป็น double โดยใช้การรับรู้แบบกลมถึง สิ่งนี้สูญเสียความแม่นยำสำหรับค่าบางอย่าง |
ล่องลอย | ลอย A; int32 result = (int32) a; | การแปลง float เป็น int32 โดยใช้ Round-Toward-Zero NaN และ -0.0 (ลบศูนย์) แปลงเป็นจำนวนเต็ม 0 Infinities และค่าที่มีขนาดใหญ่เกินไปที่จะแสดงได้รับการแปลงเป็น 0x7fffffff หรือ -0x80000000 ขึ้นอยู่กับเครื่องหมาย |
ลอยไปมานาน | ลอย A; int64 result = (int64) a; | การแปลง float เป็น int64 โดยใช้ Round-Toward-Zero กฎกรณีพิเศษเช่นเดียวกับสำหรับ float-to-int การใช้งานที่นี่ยกเว้นว่าค่านอกช่วงจะถูกแปลงเป็น 0x7fffffffffffffff หรือ -0x8000000000000000 ขึ้นอยู่กับเครื่องหมาย |
ลอยเป็นสองเท่า | ลอย A; ผลลัพธ์สองเท่า = (สองเท่า) a; | การแปลงของ float เป็น double รักษาค่าอย่างแน่นอน |
เป็นสองเท่า | สองเท่า; int32 result = (int32) a; | การแปลงของ double เป็น int32 โดยใช้ Round-Toward-Zero กฎกรณีพิเศษเช่นเดียวกับสำหรับ float-to-int การใช้งานที่นี่ |
สองถึงยาว | สองเท่า; int64 result = (int64) a; | การแปลงของ double เป็น int64 โดยใช้ Round-Toward-Zero กฎกรณีพิเศษเช่นเดียวกับการใช้งาน float-to-long ที่นี่ |
สองถึงสอง | สองเท่า; ลอยผลลัพธ์ = (ลอย) a; | การแปลงของ double เป็น float โดยใช้แบบกลมถึงผู้คน สิ่งนี้สูญเสียความแม่นยำสำหรับค่าบางอย่าง |
Int-to-byte | int32 a; int32 result = (a << 24) >> 24; | การตัดทอน int32 ถึง int8 ลงชื่อขยายผลลัพธ์ |
int-to-char | int32 a; int32 result = a & 0xffff; | การตัดทอน int32 ถึง uint16 โดยไม่มีการขยายสัญญาณ |
การสั้น ๆ | int32 a; int32 result = (a << 16) >> 16; | การตัดทอน int32 ถึง int16 ลงนามในการขยายผลลัพธ์ |
ส่วนเสริม | int32 a, b; int32 result = a + b; | การเพิ่ม TwoS-complement |
ส่วนย่อย | int32 a, b; int32 result = a - b; | การลบ Twos-complement |
rsub-int | int32 a, b; int32 result = b - a; | การลบย้อนกลับ TwoS-complement |
Mul-int | int32 a, b; int32 result = a * b; | การคูณสองครั้ง |
div-int | int32 a, b; int32 result = a / b; | แผนกการเติม Twos, ปัดเศษเป็นศูนย์ (นั่นคือถูกตัดทอนเป็นจำนวนเต็ม) สิ่งนี้จะโยน ArithmeticException ถ้า b == 0 |
อุณหภูมิ | int32 a, b; int32 result = a % b; | ส่วนที่เหลืออีกสองครั้งหลังจากการแบ่ง สัญญาณของผลลัพธ์นั้นเหมือนกับของ a และมีการกำหนดอย่างแม่นยำมากขึ้นเป็น result == a - (a / b) * b สิ่งนี้จะโยน ArithmeticException ถ้า b == 0 |
และผิด | int32 a, b; int32 result = a & b; | ระดับบิตและ |
หรือ | int32 a, b; int32 result = a | ข; | บิตไวส์หรือ |
Xor-int | int32 a, b; int32 ผลลัพธ์ = a ^ b; | บิตไวซ์ XOR |
shl-int | int32 a, b; int32 result = a << (b & 0x1f); | Bitwise Shift ซ้าย (พร้อมอาร์กิวเมนต์สวมหน้ากาก) |
shr-int | int32 a, b; int32 result = a >> (b & 0x1f); | SIGNED SHIFT RIGHT (พร้อมอาร์กิวเมนต์สวมหน้ากาก) |
ushr-int | UINT32 A, B; int32 result = a >> (b & 0x1f); | การเปลี่ยนแปลงที่ไม่ได้ลงนาม Bitwise (พร้อมอาร์กิวเมนต์สวมหน้ากาก) |
เพิ่มความยาว | int64 a, b; int64 result = a + b; | การเพิ่ม TwoS-complement |
ย่อยยาว | int64 a, b; int64 result = a - b; | การลบ Twos-complement |
ความยาว | int64 a, b; int64 result = a * b; | การคูณสองครั้ง |
การแบ่งตัวยาว | int64 a, b; int64 result = a / b; | แผนกการเติม Twos, ปัดเศษเป็นศูนย์ (นั่นคือถูกตัดทอนเป็นจำนวนเต็ม) สิ่งนี้จะโยน ArithmeticException ถ้า b == 0 |
ยาว | int64 a, b; int64 ผลลัพธ์ = a % b; | ส่วนที่เหลืออีกสองครั้งหลังจากการแบ่ง สัญญาณของผลลัพธ์นั้นเหมือนกับของ a และมีการกำหนดอย่างแม่นยำมากขึ้นเป็น result == a - (a / b) * b สิ่งนี้จะโยน ArithmeticException ถ้า b == 0 |
และยาว | int64 a, b; int64 result = a & b; | ระดับบิตและ |
หรือนาน | int64 a, b; int64 result = a | ข; | บิตไวส์หรือ |
ความยาว | int64 a, b; int64 ผลลัพธ์ = a ^ b; | บิตไวซ์ XOR |
ความยาว | int64 a; int32 b; int64 result = a << (b & 0x3f); | Bitwise Shift ซ้าย (พร้อมอาร์กิวเมนต์สวมหน้ากาก) |
SHR-LONG | int64 a; int32 b; int64 result = a >> (b & 0x3f); | SIGNED SHIFT RIGHT (พร้อมอาร์กิวเมนต์สวมหน้ากาก) |
ushr-long | UINT64 A; int32 b; int64 result = a >> (b & 0x3f); | การเปลี่ยนแปลงที่ไม่ได้ลงนาม Bitwise (พร้อมอาร์กิวเมนต์สวมหน้ากาก) |
เพิ่มความโลดโผน | ลอย A, B; ผลลัพธ์ลอย = a + b; | การเพิ่มจุดลอยตัว |
ท่องย่อย | ลอย A, B; ผลลัพธ์ลอย = a - b; | การลบจุดลอยตัว |
มัลฟล็อต | ลอย A, B; ผลลัพธ์ลอย = a * b; | การคูณจุดลอยตัว |
การแบ่งแยก | ลอย A, B; ผลลัพธ์ลอย = a / b; | แผนกจุดลอยตัว |
rem-float | ลอย A, B; ผลลัพธ์ลอย = a % b; | จุดลอยตัวที่เหลือหลังจากการแบ่ง ฟังก์ชั่นนี้แตกต่างจาก IEEE 754 ที่เหลือและถูกกำหนดเป็น result == a - roundTowardZero(a / b) * b |
เพิ่มเติม | Double A, B; ผลลัพธ์สองเท่า = a + b; | การเพิ่มจุดลอยตัว |
สองเท่า | Double A, B; ผลลัพธ์สองเท่า = a - b; | การลบจุดลอยตัว |
Mul-Double | Double A, B; ผลลัพธ์สองเท่า = a * b; | การคูณจุดลอยตัว |
div-double | Double A, B; ผลลัพธ์สองเท่า = a / b; | แผนกจุดลอยตัว |
rem-double | Double A, B; ผลลัพธ์สองเท่า = a % b; | จุดลอยตัวที่เหลือหลังจากการแบ่ง ฟังก์ชั่นนี้แตกต่างจาก IEEE 754 ที่เหลือและถูกกำหนดเป็น result == a - roundTowardZero(a / b) * b |