التصميم العام
- يهدف طراز الجهاز واتفاقيات الاستدعاء إلى تقليد البنى الحقيقية الشائعة واتفاقيات استدعاء النمط C تقريبًا:
- الجهاز قائم على التسجيل ، ويتم تثبيت الإطارات في الحجم عند الإنشاء. يتكون كل إطار من عدد معين من السجلات (تحددها الطريقة) بالإضافة إلى أي بيانات مساعدة مطلوبة لتنفيذ الطريقة ، مثل (على سبيل المثال لا الحصر) عداد البرنامج ومرجع إلى ملف
.dex
الذي يحتوي على الطريقة . - عند استخدامها لقيم البت (مثل الأعداد الصحيحة وأرقام الفاصلة العائمة) ، تعتبر السجلات بعرض 32 بت. تُستخدم أزواج التسجيل المجاورة لقيم 64 بت. لا توجد متطلبات محاذاة لأزواج التسجيل.
- عند استخدامها لمراجع الكائنات ، تعتبر السجلات واسعة بما يكفي لاحتواء مرجع واحد بالضبط.
- من حيث تمثيل البتات ،
(Object) null == (int) 0
. - يتم وضع وسيطات N الخاصة بإحدى الطرق في آخر سجلات N لإطار استدعاء الطريقة ، بالترتيب. الحجج الواسعة تستهلك سجلين. يتم تمرير طرق المثيل إلى
this
المرجع باعتباره الوسيطة الأولى.
- الجهاز قائم على التسجيل ، ويتم تثبيت الإطارات في الحجم عند الإنشاء. يتكون كل إطار من عدد معين من السجلات (تحددها الطريقة) بالإضافة إلى أي بيانات مساعدة مطلوبة لتنفيذ الطريقة ، مثل (على سبيل المثال لا الحصر) عداد البرنامج ومرجع إلى ملف
- وحدة التخزين في دفق التعليمات عبارة عن كمية غير موقعة ذات 16 بت. بعض البتات في بعض التعليمات يتم تجاهلها / يجب أن تكون صفرية.
- لا تقتصر التعليمات دون مبرر على نوع معين. على سبيل المثال ، التعليمات التي تنقل قيم التسجيل 32 بت بدون تفسير لا تحتاج إلى تحديد ما إذا كانت تنقل قيم ints أو تعويم.
- توجد تجمعات ثابتة مفهرسة ومعدودة بشكل منفصل للإشارة إلى السلاسل والأنواع والحقول والأساليب.
- يتم تمثيل البيانات الحرفية على مستوى البت بشكل مضمّن في دفق التعليمات.
- لأنه ، من الناحية العملية ، من غير المألوف أن تحتاج طريقة ما إلى أكثر من 16 سجلاً ، ولأن الحاجة إلى أكثر من ثمانية سجلات أمر شائع بشكل معقول ، فإن العديد من التعليمات تقتصر على معالجة أول 16 سجلاً فقط. عندما يكون ذلك ممكنًا بشكل معقول ، تسمح التعليمات بالإشارة إلى أول 256 سجلًا. بالإضافة إلى ذلك ، تحتوي بعض التعليمات على متغيرات تتيح عددًا أكبر من السجلات ، بما في ذلك زوج من إرشادات
move
الشاملة التي يمكنها معالجة السجلات في النطاقv0
-v65535
. في الحالات التي لا يتوفر فيها متغير التعليمات لمعالجة السجل المطلوب ، فمن المتوقع أن يتم نقل محتويات السجل من السجل الأصلي إلى سجل منخفض (قبل العملية) و / أو نقله من سجل نتيجة منخفض إلى سجل مرتفع التسجيل (بعد العملية). - هناك العديد من "التعليمات الزائفة" التي يتم استخدامها للاحتفاظ بحمولات بيانات متغيرة الطول ، والتي يشار إليها بالتعليمات العادية (على سبيل المثال ،
fill-array-data
). يجب عدم مواجهة مثل هذه التعليمات أثناء التدفق الطبيعي للتنفيذ. بالإضافة إلى ذلك ، يجب أن تكون التعليمات موجودة على إزاحات كود البايت ذات الأرقام الزوجية (أي ، محاذاة 4 بايت). من أجل تلبية هذا المطلب ، يجب أن تصدر أدوات إنشاء dex تعليماتnop
إضافية كفاصل إذا كانت هذه التعليمات غير محاذاة. أخيرًا ، على الرغم من أنه ليس مطلوبًا ، فمن المتوقع أن تختار معظم الأدوات إرسال هذه التعليمات في نهايات الطرق ، وإلا فمن المحتمل أن تكون هناك حاجة إلى تعليمات إضافية للتفرع حولها. - عند التثبيت على نظام قيد التشغيل ، قد يتم تغيير بعض التعليمات ، وتغيير تنسيقها ، كتحسين ربط ثابت في وقت التثبيت. هذا للسماح بتنفيذ أسرع بمجرد معرفة الارتباط. انظر وثيقة تنسيقات التعليمات ذات الصلة للمتغيرات المقترحة. يتم استخدام كلمة "مقترحة" بحذر ؛ ليس من الضروري تنفيذ هذه.
- النحو البشري و فن الإستذكار:
- ترتيب المصدر ثم الوسيطات.
- تحتوي بعض أكواد التشغيل على لاحقة اسم واضحة للإشارة إلى النوع (الأنواع) التي تعمل عليها:
- أكواد التشغيل 32 بت من النوع العام غير مميزة.
- يتم إلحاق أكواد التشغيل من النوع العام 64 بت بـ
-wide
. - يتم إلحاق أكواد التشغيل الخاصة بالنوع بنوعها (أو اختصار مباشر) ، وهي واحدة من:
-boolean
--char
-byte
-short
-int
-long
-float
-object
--double
--string
-كائن-class
سلسلة-فئة--void
.
- تحتوي بعض أكواد التشغيل على لاحقة واضحة للتمييز بين العمليات المماثلة بخلاف ذلك والتي لها تخطيطات أو خيارات تعليمات مختلفة. يتم فصل هذه اللواحق عن الأسماء الرئيسية بشرطة مائلة ("
/
") وهي موجودة أساسًا على الإطلاق لجعل هناك تعيين واحد لواحد مع ثوابت ثابتة في الشفرة التي تنشئ وتفسر الملفات التنفيذية (أي لتقليل الغموض للبشر). - في الأوصاف هنا ، يتم التأكيد على عرض القيمة (للإشارة ، على سبيل المثال ، نطاق ثابت أو عدد السجلات التي يمكن تناولها) من خلال استخدام حرف لكل أربعة بتات عرض.
- على سبيل المثال ، في التعليمات "
move-wide/from16 vAA, vBBBB
":- "
move
" هو رمز التشغيل الأساسي ، يشير إلى العملية الأساسية (نقل قيمة السجل). - "
wide
" هو لاحقة الاسم ، مما يشير إلى أنه يعمل على بيانات واسعة (64 بت). - "
from16
" هي لاحقة كود التشغيل ، تشير إلى متغير يحتوي على مرجع تسجيل 16 بت كمصدر. - "
vAA
" هو سجل الوجهة (ضمنيًا من خلال العملية ؛ مرة أخرى ، القاعدة هي أن وسيطات الوجهة تأتي دائمًا أولاً) ، والتي يجب أن تكون في النطاقv0
-v255
. - "
vBBBB
" هو سجل المصدر ، والذي يجب أن يكون في النطاقv0
-v65535
.
- "
- راجع مستند تنسيقات التعليمات للحصول على مزيد من التفاصيل حول تنسيقات التعليمات المختلفة (المدرجة ضمن "Op & Format") بالإضافة إلى تفاصيل حول بنية شفرة التشغيل.
- راجع مستند تنسيق ملف
.dex
. للحصول على مزيد من التفاصيل حول مكان ملاءمة الرمز الثانوي للصورة الأكبر.
ملخص مجموعة بايت كود
Op & Format | ذاكري / بناء الجملة | الحجج | وصف |
---|---|---|---|
00 10x | لا | دورات النفايات. ملاحظة: التعليمات الزائفة الحاملة للبيانات يتم تمييزها بكود التشغيل هذا ، وفي هذه الحالة يشير البايت عالي الترتيب لوحدة كود التشغيل إلى طبيعة البيانات. راجع "تنسيق | |
01 12x | تحرك vA ، المنتدى | A: سجل الوجهة (4 بتات)B: سجل المصدر (4 بتات) | نقل محتويات سجل غير كائن إلى آخر. |
02 22x | نقل / من 16 vAA ، BBBBB | A: سجل الوجهة (8 بتات)B: سجل المصدر (16 بت) | نقل محتويات سجل غير كائن إلى آخر. |
03 32x | تحرك / 16 vAAAA ، BBBBB | A: سجل الوجهة (16 بت)B: سجل المصدر (16 بت) | نقل محتويات سجل غير كائن إلى آخر. |
04 12x | تحرك واسع vA ، المنتدى | A: زوج تسجيل الوجهة (4 بتات)B: زوج تسجيل المصدر (4 بتات) | انقل محتويات زوج مسجل إلى آخر. ملاحظة: يعد الانتقال من |
05 22x | تتحرك على نطاق واسع / من 16 vAA ، BBBBB | A: زوج تسجيل الوجهة (8 بتات)B: زوج تسجيل المصدر (16 بت) | انقل محتويات زوج مسجل إلى آخر. ملاحظة: اعتبارات التنفيذ هي نفسها |
06 32x | اتساع الحركة / 16 vAAAA ، BBBBB | A: زوج تسجيل الوجهة (16 بت)B: زوج تسجيل المصدر (16 بت) | انقل محتويات زوج مسجل إلى آخر. ملاحظة: اعتبارات التنفيذ هي نفسها |
07 12x | حرك الكائن vA ، BB | A: سجل الوجهة (4 بتات)B: سجل المصدر (4 بتات) | انقل محتويات سجل يحمل كائنًا إلى سجل آخر. |
08 22x | حرك الكائن / from16 vAA ، فربب | A: سجل الوجهة (8 بتات)B: سجل المصدر (16 بت) | انقل محتويات سجل يحمل كائنًا إلى سجل آخر. |
09 32x | كائن متحرك / 16 vAAAA ، BBBBB | A: سجل الوجهة (16 بت)B: سجل المصدر (16 بت) | انقل محتويات سجل يحمل كائنًا إلى سجل آخر. |
0a 11x | نتيجة الحركة vAA | A: سجل الوجهة (8 بتات) | انقل نتيجة الكلمة الواحدة non-object من invoke- kind الأحدث إلى السجل المشار إليه. يجب أن يتم ذلك invoke- kind الذي لا يمكن تجاهل نتيجته (كلمة مفردة ، غير كائن) ؛ في أي مكان آخر غير صالح. |
0 ب 11x | حركة نتيجة واسعة vAA | A: زوج تسجيل الوجهة (8 بتات) | انقل نتيجة الكلمة المزدوجة لأحدث 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 بتات) | العودة من طريقة إرجاع القيمة مزدوجة العرض (64 بت). |
11 11x | عودة الكائن vAA | A: سجل قيمة الإرجاع (8 بت) | العودة من طريقة إرجاع الكائن. |
12 11 ن | const / 4 فولت أمبير ، # + ب | A: سجل الوجهة (4 بتات)B: عدد صحيح موقعة (4 بتات) | انقل القيمة الحرفية المعطاة (الإشارة الممتدة إلى 32 بت) في السجل المحدد. |
13 21 ثانية | const / 16 vAA ، # + BBBB | A: سجل الوجهة (8 بتات)B: عدد صحيح موقعة (16 بت) | انقل القيمة الحرفية المعطاة (الإشارة الممتدة إلى 32 بت) في السجل المحدد. |
14 31 ط | const vAA ، # + BBBBBBBB | A: سجل الوجهة (8 بتات)B: ثابت 32 بت تعسفي | انقل القيمة الحرفية المحددة إلى السجل المحدد. |
15 21 ح | const / high16 vAA ، # + BBBB0000 | A: سجل الوجهة (8 بتات)B: عدد صحيح موقعة (16 بت) | انقل القيمة الحرفية المحددة (يمين - صفر ممتد إلى 32 بت) في السجل المحدد. |
16 21 ثانية | عرض const / 16 vAA ، # + BBBB | A: سجل الوجهة (8 بتات)B: عدد صحيح موقعة (16 بت) | انقل القيمة الحرفية المعطاة (علامة ممتدة إلى 64 بت) في زوج التسجيل المحدد. |
17 31 ط | عرض const / 32 vAA ، # + BBBBBBBB | A: سجل الوجهة (8 بتات)B: موقع int (32 بت) | انقل القيمة الحرفية المعطاة (علامة ممتدة إلى 64 بت) في زوج التسجيل المحدد. |
18 51 لتر | VAA واسع النطاق ، # + BBBBBBBBBBBBBBB | A: سجل الوجهة (8 بتات)B: ثابت العرض المزدوج التعسفي (64 بت) | انقل القيمة الحرفية المحددة إلى زوج التسجيل المحدد. |
19 21 ح | عرض const / ارتفاع 16 vAA ، # + BBBB000000000000 | A: سجل الوجهة (8 بتات)B: عدد صحيح موقعة (16 بت) | انقل القيمة الحرفية المعطاة (يمين - صفر ممتد إلى 64 بت) في زوج التسجيل المحدد. |
1 أ 21 ج | const سلسلة vAA ، سلسلة @ BBBB | A: سجل الوجهة (8 بتات)B: فهرس السلسلة | انقل مرجعًا إلى السلسلة المحددة بواسطة الفهرس المحدد إلى السجل المحدد. |
1 ب 31 ج | const-string / jumbo vAA ، سلسلة @ BBBBBBBB | A: سجل الوجهة (8 بتات)B: فهرس السلسلة | انقل مرجعًا إلى السلسلة المحددة بواسطة الفهرس المحدد إلى السجل المحدد. |
1 ج 21 ج | فئة const vAA ، اكتب @ BBBB | A: سجل الوجهة (8 بتات)B: نوع الفهرس | انقل مرجعًا إلى الفئة المحددة بواسطة الفهرس المحدد إلى السجل المحدد. في الحالة التي يكون فيها النوع المشار إليه بدائيًا ، سيخزن هذا مرجعًا للفئة المتدهورة للنوع البدائي. |
1d 11x | شاشة الدخول vAA | A: سجل محمل مرجعي (8 بتات) | الحصول على الشاشة للكائن المشار إليه. |
1e 11x | مراقبة الخروج vAA | A: سجل محمل مرجعي (8 بتات) | حرر الشاشة للكائن المشار إليه. ملاحظة: إذا احتاجت هذه التعليمات إلى طرح استثناء ، فيجب أن تفعل ذلك كما لو أن الكمبيوتر قد تقدم بالفعل بعد التعليمات. قد يكون من المفيد التفكير في هذا على أنه تنفيذ التعليمات بنجاح (بمعنى ما) ، ويتم طرح الاستثناء بعد التعليمات ولكن قبل الحصول على الفرصة التالية للتشغيل. هذا التعريف يجعل من الممكن لطريقة ما استخدام كتلة تنظيف الشاشة (على سبيل المثال ، |
1f 21c | check-cast vAA ، اكتب @ BBBB | A: سجل محمل مرجعي (8 بتات)B: فهرس النوع (16 بت) | ClassCastException إذا كان المرجع في السجل المحدد لا يمكن تحويله إلى النوع المشار إليه. ملاحظة: نظرًا لأن |
20 22 ج | مثيل vA ، BB ، اكتب @ CCCC | A: سجل الوجهة (4 بتات)B: سجل محمل مرجعي (4 بتات)C: نوع الفهرس (16 بت) | قم بالتخزين في سجل الوجهة المحدد 1 إذا كان المرجع المشار إليه هو مثيل من النوع المحدد ، أو 0 إذا لم يكن كذلك. ملاحظة: نظرًا لأن |
21 12x | صفيف بطول vA ، BB | A: سجل الوجهة (4 بتات)B: سجل محمل مرجعي للصفيف (4 بتات) | التخزين في الوجهة المحددة يسجل طول المصفوفة المشار إليها في الإدخالات |
22 21 ج | مثيل جديد vAA ، اكتب @ BBBB | A: سجل الوجهة (8 بتات)B: نوع الفهرس | قم ببناء مثيل جديد من النوع المشار إليه ، مع تخزين مرجع له في الوجهة. يجب أن يشير النوع إلى فئة غير مصفوفة. |
23 22 ج | صفيف جديد vA ، BB ، اكتب @ CCCC | A: سجل الوجهة (4 بتات)B: سجل الحجمC: نوع الفهرس | أنشئ مصفوفة جديدة من النوع والحجم المحددين. يجب أن يكون النوع من نوع مصفوفة. |
24 35 ج | مجموعة مملوءة جديدة {vC ، vD ، vE ، vF ، vG} ، اكتب @ BBBB | A: حجم الصفيف وعدد الكلمات الوسيطة (4 بت)B: فهرس النوع (16 بت)C..G: سجلات الوسيطة (4 بت لكل منها) | أنشئ مصفوفة من النوع والحجم المحددين ، واملأها بالمحتويات المتوفرة. يجب أن يكون النوع من نوع مصفوفة. يجب أن تكون محتويات المصفوفة من كلمة واحدة (أي ، لا توجد مصفوفات long أو double ، لكن أنواع المراجع مقبولة). يتم تخزين المثيل المُنشأ باعتباره "نتيجة" بنفس الطريقة التي تخزن بها تعليمات استدعاء الطريقة نتائجها ، لذلك يجب نقل المثيل المُنشأ إلى سجل مع تعليمة move-result-object لاحقة على الفور (إذا كان سيتم استخدامها ). |
25 3rc | مجموعة / نطاق جديد ممتلئ {vCCCC .. vNNNN} ، اكتب @ BBBB | A: حجم الصفيف وعدد الكلمات الوسيطة (8 بت)B: فهرس النوع (16 بت)C: سجل الوسيطة الأولى (16 بت)N = A + C - 1 | أنشئ مصفوفة من النوع والحجم المحددين ، واملأها بالمحتويات المتوفرة. التوضيحات والقيود هي نفسها filled-new-array ، الموضحة أعلاه. |
26 31 ت | ملء صفيف البيانات vAA ، + BBBBBBBB (مع البيانات التكميلية على النحو المحدد أدناه في "تنسيق fill-array-data-payload ") | A: مرجع صفيف (8 بتات)B: "فرع" موقع الإزاحة لتعليمات زائفة لبيانات الجدول (32 بت) | املأ المصفوفة بالبيانات المشار إليها. يجب أن يكون المرجع إلى صفيف من العناصر الأولية ، ويجب أن يتطابق جدول البيانات معه في النوع ويجب ألا يحتوي على عناصر أكثر مما يتناسب مع الصفيف. وهذا يعني أن المصفوفة قد تكون أكبر من الجدول ، وإذا كان الأمر كذلك ، يتم تعيين العناصر الأولية فقط من المصفوفة ، مع ترك الباقي بمفرده. |
27 11x | رمي vAA | A: سجل الاستثناءات (8 بتات) | رمي الاستثناء المشار إليه. |
28 10 أ | غوتو + AA | A: إزاحة فرع موقعة (8 بتات) | القفز دون قيد أو شرط إلى التعليمات المشار إليها. ملاحظة: يجب ألا تكون إزاحة الفرع |
29 20 طن | غوتو / 16 + AAAA | A: إزاحة فرع موقعة (16 بت) | القفز دون قيد أو شرط إلى التعليمات المشار إليها. ملاحظة: يجب ألا تكون إزاحة الفرع |
2 أ 30 طن | غوتو / 32 + AAAAAAAA | A: إزاحة فرع موقعة (32 بت) | القفز دون قيد أو شرط إلى التعليمات المشار إليها. |
2 ب 31 ت | محول معبأ vAA ، + BBBBBBBB (مع البيانات التكميلية كما هو محدد أدناه في "تنسيق packed-switch-payload ") | A: سجل للاختبارB: "فرع" موقع الإزاحة لتعليمات زائفة لبيانات الجدول (32 بت) | انتقل إلى تعليمة جديدة بناءً على القيمة الموجودة في السجل المحدد ، باستخدام جدول التعويضات المقابلة لكل قيمة في نطاق متكامل معين ، أو انتقل إلى التعليمات التالية إذا لم يكن هناك تطابق. |
2 ج 31 ت | التبديل المتناثر vAA ، + BBBBBBBB (مع البيانات التكميلية على النحو المحدد أدناه في "تنسيق sparse-switch-payload للتبديل المتقطع") | A: سجل للاختبارB: "فرع" موقع الإزاحة لتعليمات زائفة لبيانات الجدول (32 بت) | انتقل إلى تعليمات جديدة بناءً على القيمة الموجودة في السجل المحدد ، باستخدام جدول مرتب لأزواج معادلة القيمة ، أو انتقل إلى التعليمات التالية إذا لم يكن هناك تطابق. |
2 يوم 31 23 مرة | cmp نوع vAA ، فيب ، vCC 2d: cmpl-float (انحياز lt) 2e: cmpg-float (gt bias) 2f: cmpl-double (انحياز lt) 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 ت | if- test vA، BB، + CCCC 32: إذا- مكافئ 33: إذا- ني 34: لو-لتر 35: if-ge 36: إذا- جي تي 37: لو-لو | A: سجل أولاً للاختبار (4 بتات)B: التسجيل الثاني للاختبار (4 بتات)C: إزاحة فرع موقعة (16 بت) | تفرع إلى الوجهة المحددة إذا تمت مقارنة قيمتي السجلين المحددين كما هو محدد. ملاحظة: يجب ألا تكون إزاحة الفرع |
38..3d 21t | إذا- اختبار z vAA ، + BBBB 38: إذا- eqz 39: إذا-نيز 3 أ: if-ltz 3 ب: if-gez 3 ج: if-gtz ثلاثي الأبعاد: if-lez | A: سجل للاختبار (8 بت)B: إزاحة فرع موقعة (16 بت) | الفرع إلى الوجهة المحددة إذا كانت قيمة السجل المحدد تقارن بـ 0 كما هو محدد. ملاحظة: يجب ألا تكون إزاحة الفرع |
3 هـ 43 × 10 | (غير مستعمل) | (غير مستعمل) | |
44..51 23x | arrayop vAA ، و BBB ، و vCC 44: غيظ 45: على نطاق واسع 46: أجيت وجوه 47: aget-boolean 48: اجييت بايت 49: اجيت شار 4 أ: قصير العمر 4 ب: aput 4c: على مستوى aput 4d: كائن aput 4e: aput-boolean 4f: بايت بايت 50: أبوت شار 51: أبوت قصير | A: سجل القيمة أو الزوج ؛ قد يكون مصدر أو جزء (8 بت)B: سجل الصفيف (8 بتات)C: سجل الفهرس (8 بت) | نفذ عملية المصفوفة المحددة في الفهرس المحدد للصفيف المحدد ، أو التحميل أو التخزين في سجل القيمة. |
52..5f 22c | أنا مثيل vA ، المنتدى @ CCCC 52: iget 53: عرض iget 54: كائن iget 55: iget-boolean 56: إيغيت بايت 57: iget-char 58: iget-short 59: IPut 5 أ: على مستوى IPut 5 ب: iput-object 5 ج: iput-boolean 5d: iput بايت 5e: iput-char 5f: iput-short | A: سجل القيمة أو الزوج ؛ قد يكون مصدرًا أو معدلاً (4 بتات)B: سجل الكائن (4 بتات)C: فهرس مرجع حقل المثيل (16 بت) | نفذ العملية الميدانية لمثيل الكائن المحدد بالحقل المحدد ، أو التحميل أو التخزين في سجل القيمة. ملاحظة: أكواد التشغيل هذه هي مرشحات معقولة للربط الثابت ، وتغيير وسيطة الحقل لتكون أكثر إزاحة مباشرة. |
60. 6d 21c | s staticop vAA ، الحقل @ BBBB 60: sget 61: على نطاق واسع 62: هدف 63: sget-boolean 64: sget-بايت 65: sget-char 66: قصيدة قصيرة 67: سبوت 68: على نطاق واسع 69: سبوت الجسم 6 أ: sput-boolean 6 ب: سبوت بايت 6 ج: سبوت شار 6 د: sput-short | A: سجل القيمة أو الزوج ؛ قد يكون مصدر أو جزء (8 بت)B: مؤشر مرجعي للمجال الثابت (16 بت) | قم بإجراء العملية الميدانية الثابتة للكائن المحدد باستخدام الحقل الثابت المحدد ، أو التحميل أو التخزين في سجل القيمة. ملاحظة: أكواد التشغيل هذه هي مرشحات معقولة للربط الثابت ، وتغيير وسيطة الحقل لتكون أكثر إزاحة مباشرة. |
6 هـ 72 35 ج | استدعاء- النوع {vC، vD، vE، vF، vG}، meth @ BBBB 6e: استدعاء افتراضي 6f: استدعاء سوبر 70: استدعاء مباشر 71: استدعاء ثابت 72: استدعاء الواجهة | A: عدد الكلمات الوسيطة (4 بت)B: فهرس مرجع الأسلوب (16 بت)C..G: سجلات الوسيطة (4 بت لكل منها) | اتصل بالطريقة المشار إليها. يمكن تخزين النتيجة (إن وجدت) مع متغير مناسب move-result* كتعليمات لاحقة مباشرة. يتم استخدام الاستدعاء عندما تشير في الإصدار يتم استخدام الاستدعاء يتم استخدام الاستدعاء الثابت يتم استخدام ملاحظة: أكواد التشغيل هذه هي مرشحة معقولة للربط الثابت ، وتغيير وسيطة الطريقة لتكون أكثر إزاحة مباشرة (أو زوجًا منها). |
73 10x | (غير مستعمل) | (غير مستعمل) | |
74..78 3rc | استدعاء- النوع / النطاق {vCCCC .. vNNNN} ، meth @ BBBB 74: استدعاء الظاهري / المدى 75: استدعاء سوبر / المدى 76: استدعاء مباشر / نطاق 77: استدعاء ثابت / نطاق 78: استدعاء واجهة / نطاق | A: عدد الكلمات الوسيطة (8 بت)B: فهرس مرجع الأسلوب (16 بت)C: سجل الوسيطة الأولى (16 بت)N = A + C - 1 | اتصل بالطريقة المشار إليها. راجع الاستدعاء الأول - الوصف invoke- kind أعلاه للحصول على التفاصيل والتحذيرات والاقتراحات. |
79..7a 10x | (غير مستعمل) | (غير مستعمل) | |
7 ب .8f 12x | unop vA ، المنتدى 7 ب: neg-int 7 ج: لا كثافة 7 د: نيج طويل 7 هـ: لم يمض وقت طويل 7f: neg-float 80: نيج مزدوج 81: int-to-long 82: int-to-float 83: int-to-double 84: طويل إلى كثافة العمليات 85: طويل لتطفو 86: طويل لمضاعفة 87: تعويم إلى كثافة العمليات 88: تعويم إلى طويل 89: تعويم مضاعفة 8 أ: مزدوج إلى كثافة العمليات 8 ب: مضاعفة إلى طويلة 8 ج: مضاعفة لتعويم 8d: int-to-byte 8e: int-to-char 8f: int-to-short | A: سجل الوجهة أو الزوج (4 بتات)B: سجل المصدر أو الزوج (4 بتات) | قم بتنفيذ العملية الأحادية المحددة في سجل المصدر ، وقم بتخزين النتيجة في سجل الوجهة. |
90..أف 23 إكس | binop vAA ، فيب ، vCC 90: الوظيفة الإضافية 91: sub-int 92: مول إنت 93: div-int 94: ريم إنت 95: و int 96: أو-كثافة العمليات 97: xor-int 98: shl-int 99: shr-int 9 أ: ushr-int 9 ب: إضافة طويلة 9 ج: شبه طويل 9 د: طويل 9 هـ: div-long 9f: ريم طويل a0: وطويلة a1: أو طويل a2: xor-long a3: shl طويل a4: shr-long a5: أوشر طويل a6: إضافة تعويم a7: تعويم فرعي a8: مول تعويم a9: div-float aa: rem-float أب: إضافة مزدوجة التيار المتردد: شبه مزدوج الإعلان: مول مزدوج ae: div-double af: rem-double | A: سجل الوجهة أو الزوج (8 بتات)B: سجل المصدر الأول أو الزوج (8 بتات)C: سجل أو زوج المصدر الثاني (8 بتات) | قم بإجراء العملية الثنائية المحددة على سجلي المصدر ، مع تخزين النتيجة في سجل الوجهة. ملاحظة: على عكس العمليات الرياضية |
b0..cf 12x | binop / 2addr vA، BB b0: add-int / 2addr b1: sub-int / 2addr b2: mul-int / 2addr b3: div-int / 2addr b4: rem-int / 2addr b5: and-int / 2addr b6: or-int / 2addr b7: xor-int / 2addr b8: shl-int / 2addr b9: shr-int / 2addr ba: ushr-int / 2addr bb: add-long / 2addr قبل الميلاد: sub-long / 2addr bd: مول طويل / 2addr be: div-long / 2addr bf: rem-long / 2addr c0: and-long / 2addr c1: or-long / 2addr c2: xor-long / 2addr c3: shl-long / 2addr c4: shr-long / 2addr c5: ushr-long / 2addr c6: add-float / 2addr c7: تعويم فرعي / 2addr c8: مول تعويم / 2addr c9: div-float / 2addr ca: rem-float / 2addr cb: add-double / 2addr cc: sub-double / 2addr القرص المضغوط: mul-double / 2addr م: div-double / 2addr cf: rem-double / 2addr | A: الوجهة والمصدر الأول أو الزوج (4 بتات)B: سجل أو زوج المصدر الثاني (4 بتات) | قم بإجراء العملية الثنائية المحددة على سجلي المصدر ، مع تخزين النتيجة في سجل المصدر الأول. ملاحظة: على عكس العمليات الرياضية |
d0..d7 22 ثانية | binop / lit16 vA، BB، # + CCCC d0: add-int / lit16 d1: rsub-int (طرح عكسي) d2: mul-int / lit16 d3: div-int / lit16 d4: rem-int / lit16 d5: و int / lit16 d6: or-int / lit16 d7: xor-int / lit16 | A: سجل الوجهة (4 بتات)B: سجل المصدر (4 بتات)C: ثابت int موقع (16 بت) | قم بتنفيذ العملية الثنائية المشار إليها في السجل المشار إليه (الوسيطة الأولى) والقيمة الحرفية (الوسيطة الثانية) ، وتخزين النتيجة في سجل الوجهة. ملاحظة: لا يحتوي |
د ٨... هـ ٢ ٢٢ ب | binop / lit8 vAA ، BBB ، # + CC d8: add-int / lit8 d9: rsub-int / lit8 da: mul-int / lit8 ديسيبل: div-int / lit8 تيار مستمر: rem-int / lit8 dd: و int / lit8 de: or-int / lit8 مدافع: xor-int / lit8 e0: shl-int / lit8 e1: shr-int / lit8 e2: ushr-int / lit8 | A: سجل الوجهة (8 بتات)B: سجل المصدر (8 بت)C: ثابت int موقع (8 بتات) | قم بتنفيذ العملية الثنائية المشار إليها في السجل المشار إليه (الوسيطة الأولى) والقيمة الحرفية (الوسيطة الثانية) ، وتخزين النتيجة في سجل الوجهة. ملاحظة: انظر أدناه للحصول على تفاصيل حول دلالات |
e3..f9 10x | (غير مستعمل) | (غير مستعمل) | |
fa 45cc | استدعاء متعدد الأشكال {vC، vD، vE، vF، vG}، meth @ BBBB، proto @ HHHH | A: عدد الكلمات الوسيطة (4 بت)B: فهرس مرجع الأسلوب (16 بت)C: جهاز استقبال (4 بتات)D..G: سجلات الوسيطة (4 بت لكل منها)H: فهرس مرجعي للنموذج الأولي (16 بت) | استدعاء الأسلوب متعدد الأشكال التوقيع المشار إليه. يمكن تخزين النتيجة (إن وجدت) مع متغير مناسب move-result* كتعليمات لاحقة مباشرة.يجب أن يكون مرجع الأسلوب إلى أسلوب متعدد الأشكال للتوقيع ، مثل java.lang.invoke.MethodHandle.invoke أو java.lang.invoke.MethodHandle.invokeExact .يجب أن يكون جهاز الاستقبال كائنًا يدعم الأسلوب متعدد الأشكال للتوقيع الذي يتم استدعاؤه. يصف مرجع النموذج الأولي أنواع الوسيطات المتوفرة ونوع الإرجاع المتوقع. قد يثير كود الاستدعاء invoke-polymorphic استثناءات عند تنفيذه. تم وصف الاستثناءات في وثائق API الخاصة بالطريقة متعددة الأشكال للتوقيع التي يتم استدعاؤها.موجود في ملفات Dex بدءًا من الإصدار 038 وما بعده. |
fb 4rcc | استدعاء متعدد الأشكال / النطاق {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، vE، vF، vG}، call_site @ BBBB | A: عدد الكلمات الوسيطة (4 بت)B: فهرس مرجع موقع الاتصال (16 بت)C..G: سجلات الوسيطة (4 بت لكل منها) | يقرر ويستدعي موقع المكالمة المشار إليه. قد يتم تخزين النتيجة من الاستدعاء (إن وجدت) مع متغير مناسب move-result* كتعليمات لاحقة على الفور.يتم تنفيذ هذه التعليمات على مرحلتين: تحليل موقع الاتصال واستدعاء موقع الاتصال. تتحقق دقة موقع الاستدعاء مما إذا كان موقع المكالمة المشار إليه له مثيل java.lang.invoke.CallSite مرتبط. إذا لم يكن الأمر كذلك ، فسيتم استدعاء طريقة رابط bootstrap لموقع الاستدعاء المشار إليه باستخدام الوسائط الموجودة في ملف DEX (انظر call_site_item ). تقوم طريقة رابط bootstrap بإرجاع مثيل java.lang.invoke.CallSite الذي سيتم ربطه بعد ذلك بموقع الاستدعاء المشار إليه في حالة عدم وجود اقتران. قد يكون هناك مؤشر ترابط آخر قد قام بالفعل بعمل الاقتران أولاً ، وإذا كان الأمر كذلك ، فسيستمر تنفيذ التعليمات مع أول مثيل java.lang.invoke.CallSite المرتبط.يتم إجراء استدعاء موقع الاستدعاء على الهدف java.lang.invoke.MethodHandle لمثيل java.lang.invoke.CallSite الذي تم حله. يتم استدعاء الهدف كما لو كان تنفيذ invoke-polymorphic (موصوف أعلاه) باستخدام مقبض الأسلوب والوسيطات لتعليمات الاستدعاء invoke-custom كوسائط لاستدعاء معالجة أسلوب دقيق.يتم تغليف الاستثناءات التي تم طرحها بواسطة طريقة رابط التمهيد في java.lang.BootstrapMethodError . يظهر BootstrapMethodError أيضًا إذا:
038 وما بعده. |
fd 3rc | استدعاء / النطاق المخصص {vCCCC .. vNNNN} ، call_site @ BBBB | A: عدد الكلمات الوسيطة (8 بت)B: فهرس مرجع موقع الاتصال (16 بت)C: سجل الوسيطة الأولى (16 بت)N = A + C - 1 | حل واستدعاء موقع اتصال. راجع الوصف invoke-custom أعلاه للحصول على التفاصيل.موجود في ملفات Dex بدءًا من الإصدار 038 وما بعده. |
fe 21c | const-method-handle vAA ، method_handle @ BBBB | A: سجل الوجهة (8 بتات)B: مؤشر معالجة الطريقة (16 بت) | انقل مرجعًا إلى مؤشر الأسلوب المحدد بواسطة الفهرس المحدد إلى السجل المحدد. موجود في ملفات Dex بدءًا من الإصدار 039 وما بعده. |
صص ٢١ ج | const-way-type vAA ، proto @ BBBB | A: سجل الوجهة (8 بتات)B: مرجع النموذج الأولي للطريقة (16 بت) | انقل مرجعًا إلى النموذج الأولي للأسلوب المحدد بواسطة الفهرس المحدد في السجل المحدد. موجود في ملفات Dex بدءًا من الإصدار 039 وما بعده. |
تنسيق حمولة التبديل المعبأة
اسم | شكل | وصف |
---|---|---|
الهوية | فترة قصيرة = 0x0100 | تحديد الكود الزائف |
بحجم | قريب | عدد الإدخالات في الجدول |
first_key | int | أول (وأدنى) قيمة حالة التبديل |
الأهداف | int [] | قائمة size أهداف الفرع النسبية. الأهداف متعلقة بعنوان رمز تشغيل التبديل ، وليس هذا الجدول. |
ملاحظة: العدد الإجمالي لوحدات الكود لمثيل من هذا الجدول هو (size * 2) + 4
.
تنسيق الحمولة النافعة التبديل المتناثر
اسم | شكل | وصف |
---|---|---|
الهوية | فترة قصيرة = 0x0200 | تحديد الكود الزائف |
بحجم | قريب | عدد الإدخالات في الجدول |
مفاتيح | int [] | قائمة قيم مفتاح size ، مرتبة من الأدنى إلى الأعلى |
الأهداف | int [] | قائمة بأهداف الفرع النسبي size ، كل منها يتوافق مع القيمة الرئيسية في نفس الفهرس. الأهداف متعلقة بعنوان رمز تشغيل التبديل ، وليس هذا الجدول. |
ملاحظة: العدد الإجمالي لوحدات الكود لمثيل من هذا الجدول هو (size * 4) + 2
.
ملء مجموعة البيانات تنسيق الحمولة
اسم | شكل | وصف |
---|---|---|
الهوية | فترة قصيرة = 0x0300 | تحديد الكود الزائف |
عرض_العنصر | قريب | عدد البايتات في كل عنصر |
بحجم | uint | عدد العناصر في الجدول |
بيانات | ubyte [] | قيم البيانات |
ملاحظة: العدد الإجمالي لوحدات الكود لمثيل من هذا الجدول هو (size * element_width + 1) / 2 + 4
.
تفاصيل العملية الحسابية
ملاحظة: يجب أن تتبع عمليات النقطة العائمة قواعد IEEE 754 ، باستخدام التدفق السفلي التدريجي تقريبًا إلى الأقرب ، ما لم ينص على خلاف ذلك.
كود التشغيل | ج دلالات | ملحوظات |
---|---|---|
int. Neg-int | int32 أ ؛ نتيجة int32 = -a ؛ | مكمل أحادي ثنائي. |
لا int | int32 أ ؛ نتيجة int32 = ~ a ؛ | أحادي منها - مكمل. |
نيج طويل | int64 أ ؛ نتيجة int64 = -a ؛ | مكمل أحادي ثنائي. |
ليس طويل | int64 أ ؛ نتيجة int64 = ~ a ؛ | أحادي منها - مكمل. |
نيج تعويم | تطفو float result = -a; | Floating point negation. |
neg-double | double a; double result = -a; | Floating point negation. |
int-to-long | int32 a; int64 result = (int64) a; | Sign extension of int32 into int64 . |
int-to-float | int32 a; float result = (float) a; | Conversion of int32 to float , using round-to-nearest. This loses precision for some values. |
int-to-double | int32 a; double result = (double) a; | Conversion of int32 to double . |
long-to-int | int64 a; int32 result = (int32) a; | Truncation of int64 into int32 . |
long-to-float | int64 a; float result = (float) a; | Conversion of int64 to float , using round-to-nearest. This loses precision for some values. |
long-to-double | int64 a; double result = (double) a; | Conversion of int64 to double , using round-to-nearest. This loses precision for some values. |
float-to-int | float a; int32 result = (int32) a; | Conversion of float to int32 , using round-toward-zero. NaN and -0.0 (negative zero) convert to the integer 0 . Infinities and values with too large a magnitude to be represented get converted to either 0x7fffffff or -0x80000000 depending on sign. |
float-to-long | float a; int64 result = (int64) a; | Conversion of float to int64 , using round-toward-zero. The same special case rules as for float-to-int apply here, except that out-of-range values get converted to either 0x7fffffffffffffff or -0x8000000000000000 depending on sign. |
float-to-double | float a; double result = (double) a; | Conversion of float to double , preserving the value exactly. |
double-to-int | double a; int32 result = (int32) a; | Conversion of double to int32 , using round-toward-zero. The same special case rules as for float-to-int apply here. |
double-to-long | double a; int64 result = (int64) a; | Conversion of double to int64 , using round-toward-zero. The same special case rules as for float-to-long apply here. |
double-to-float | double a; float result = (float) a; | Conversion of double to float , using round-to-nearest. This loses precision for some values. |
int-to-byte | int32 a; int32 result = (a << 24) >> 24; | Truncation of int32 to int8 , sign extending the result. |
int-to-char | int32 a; int32 result = a & 0xffff; | Truncation of int32 to uint16 , without sign extension. |
int-to-short | int32 a; int32 result = (a << 16) >> 16; | Truncation of int32 to int16 , sign extending the result. |
add-int | int32 a, b; int32 result = a + b; | Twos-complement addition. |
sub-int | int32 a, b; int32 result = a - b; | Twos-complement subtraction. |
rsub-int | int32 a, b; int32 result = b - a; | Twos-complement reverse subtraction. |
mul-int | int32 a, b; int32 result = a * b; | Twos-complement multiplication. |
div-int | int32 a, b; int32 result = a / b; | Twos-complement division, rounded towards zero (that is, truncated to integer). This throws ArithmeticException if b == 0 . |
rem-int | int32 a, b; int32 result = a % b; | Twos-complement remainder after division. The sign of the result is the same as that of a , and it is more precisely defined as result == a - (a / b) * b . This throws ArithmeticException if b == 0 . |
and-int | int32 a, b; int32 result = a & b; | Bitwise AND. |
or-int | int32 a, b; int32 result = a | b; | Bitwise OR. |
xor-int | int32 a, b; int32 result = a ^ b; | Bitwise XOR. |
shl-int | int32 a, b; int32 result = a << (b & 0x1f); | Bitwise shift left (with masked argument). |
shr-int | int32 a, b; int32 result = a >> (b & 0x1f); | Bitwise signed shift right (with masked argument). |
ushr-int | uint32 a, b; int32 result = a >> (b & 0x1f); | Bitwise unsigned shift right (with masked argument). |
add-long | int64 a, b; int64 result = a + b; | Twos-complement addition. |
sub-long | int64 a, b; int64 result = a - b; | Twos-complement subtraction. |
mul-long | int64 a, b; int64 result = a * b; | Twos-complement multiplication. |
div-long | int64 a, b; int64 result = a / b; | Twos-complement division, rounded towards zero (that is, truncated to integer). This throws ArithmeticException if b == 0 . |
rem-long | int64 a, b; int64 result = a % b; | Twos-complement remainder after division. The sign of the result is the same as that of a , and it is more precisely defined as result == a - (a / b) * b . This throws ArithmeticException if b == 0 . |
and-long | int64 a, b; int64 result = a & b; | Bitwise AND. |
or-long | int64 a, b; int64 result = a | b; | Bitwise OR. |
xor-long | int64 a, b; int64 result = a ^ b; | Bitwise XOR. |
shl-long | int64 a; int32 b; int64 result = a << (b & 0x3f); | Bitwise shift left (with masked argument). |
shr-long | int64 a; int32 b; int64 result = a >> (b & 0x3f); | Bitwise signed shift right (with masked argument). |
ushr-long | uint64 a; int32 b; int64 result = a >> (b & 0x3f); | Bitwise unsigned shift right (with masked argument). |
add-float | float a, b; float result = a + b; | Floating point addition. |
sub-float | float a, b; float result = a - b; | Floating point subtraction. |
mul-float | float a, b; float result = a * b; | Floating point multiplication. |
div-float | float a, b; float result = a / b; | Floating point division. |
rem-float | float a, b; float result = a % b; | Floating point remainder after division. This function is different than IEEE 754 remainder and is defined as result == a - roundTowardZero(a / b) * b . |
add-double | double a, b; double result = a + b; | Floating point addition. |
sub-double | double a, b; double result = a - b; | Floating point subtraction. |
mul-double | double a, b; double result = a * b; | Floating point multiplication. |
div-double | double a, b; double result = a / b; | Floating point division. |
rem-double | double a, b; double result = a % b; | Floating point remainder after division. This function is different than IEEE 754 remainder and is defined as result == a - roundTowardZero(a / b) * b . |