تنسيق رمز Dalvik بايت

التصميم العام

  • يهدف نموذج الآلة واصطلاحات الاستدعاء إلى محاكاة التصاميم الحقيقية الشائعة واصطلاحات الاستدعاء بأسلوب C تقريبًا:
    • تستند الآلة إلى السجلّ، ويكون حجم اللقطات ثابتًا عند إنشائها. يتألّف كل إطار من عدد معيّن من السجلات (يتم تحديده من قِبل الطريقة) بالإضافة إلى أي بيانات مساعدة مطلوبة لتنفيذ الطريقة، مثل (على سبيل المثال لا الحصر) عدّاد البرنامج وإشارة إلىملف .dex الذي يحتوي على الطريقة.
    • عند استخدامها لقيم البت (مثل الأعداد الصحيحة والأرقام المشتقة من النقطة العائمة)، تُعتبر السجلات بسعة 32 بت. يتم استخدام أزواج السجلّ المجاورة للقيم 64 بت. ما مِن شرط للتنسيق لمثيلات السجلات.
    • عند استخدامها لمراجع الكائنات، تُعدّ السجلات واسعة بما يكفي لاستيعاب مرجع واحد بالضبط.
    • من حيث التمثيل الثنائي، (Object) null == (int) 0.
    • تنتقل N وسيطة إلى الطريقة في آخر N سجل من إطار استدعاء الطريقة، بالترتيب. تستهلك الوسيطات الواسعة سجلّين. يتم تمرير مرجع this إلى طرق المثيل كوسيطة أولى.
  • وحدة التخزين في تسلسل التعليمات هي كمية غير موقَّعة بسعة 16 بت. يتم تجاهل بعض الوحدات في بعض التعليمات / يجب أن تكون صفرًا.
  • لا تقتصر التعليمات على نوع معيّن بدون داعٍ. على سبيل المثال، فإنّ التعليمات التي تنقل قيم سجلّات 32 بت بدون تفسير لا يجب أن تحدّد ما إذا كانت تنقل أعدادًا صحيحة أو أعدادًا كسرية.
  • هناك مجموعات ثابتة مُدرَجة ومُفهرسة بشكل منفصل ل إشارات إلى السلاسل والأنواع والحقول والطُرق.
  • يتم تمثيل البيانات الثنائية الثابتة بشكل مضمّن في تسلسل التعليمات.
  • لأنّه من غير الشائع أن تحتاج إحدى الطرق إلى أكثر من 16 سجلاً، ولأنّ الحاجة إلى أكثر من ثمانية سجلات شائعة بشكل معقول، تقتصر العديد من التعليمات على معالجة أول 16 سجلاً فقط. تسمح التعليمات، كلما أمكن ذلك بشكل معقول، بالمراجع التي تشير إلى ما يصل إلى أول 256 سجلًّا. بالإضافة إلى ذلك، تحتوي بعض التعليمات على صيغ تسمح بعدد أكبر بكثير من السجلات، بما في ذلك زوج من تعليمات move التي يمكنها معالجة السجلات في النطاق v0v65535. في الحالات التي لا يكون فيها أحد الصيغ الخاصة بالتعليمات متاحًا لمعالجة سجلّ مطلوب، من المتوقّع أن يتم نقل محتويات السجلّ من السجلّ الأصلي إلى سجلّ منخفض (قبل الإجراء ) و/أو نقلها من سجلّ النتائج المنخفض إلى سجلّ مرتفع (بعد الإجراء).
  • هناك العديد من "التعليمات الزائفة" التي تُستخدَم لتخزين حمولات بيانات بطول متغيّر، والتي تتم الإشارة إليها من خلال تعليمات عاديّة (مثل fill-array-data). يجب ألّا يتم العثور على هذه التعليمات مطلقًا أثناء عملية التنفيذ العادية. بالإضافة إلى ذلك، يجب أن تكون تعليمات موجودة في أماكن بدء تعليمات برمجية ثنائية القيمة ذات أرقام زوجية (أي محاذاة 4 بايت). لاستيفاء هذا الشرط، يجب أن تُصدِر أدوات إنشاء ملف dex تعليمات nop إضافية كمسافة فاصلة إذا كانت هذه التعليمات غير محاذية. أخيرًا، على الرغم من أنّ ذلك ليس مطلوبًا، من المتوقّع أن تختار معظم الأدوات عرض هذه التعليمات في نهايات الطرق، لأنّه من المحتمل أن يكون هناك حاجة إلى تعليمات إضافية للتوغّل فيها.
  • عند التثبيت على نظام قيد التشغيل، قد يتم تغيير بعض التعليمات، وتغيير تنسيقها، وذلك كإجراء تحسين للربط الثابت في وقت التثبيت. يهدف ذلك إلى السماح بتنفيذ أسرع بعد معرفة عملية الربط. اطّلِع على مستند تنسيقات التعليمات المرتبط بالصفحة للاطّلاع على الصيغ المقترَحة. تم استخدام كلمة "مقترَحة" عن قصد، وليس من الضروري تنفيذ هذه الخطوات.
  • البنية المناسبة للاستخدام البشري والاختصارات:
    • ترتيب الوجهة ثم المصدر للوسيطات
    • تحتوي بعض رموز التشغيل على لاحقة اسم لإزالة الغموض للإشارة إلى الأنواع التي تعمل عليها:
      • لا يتم وضع علامة على أوامر التشغيل العامة ذات الـ 32 بت.
      • تنتهي أوامر التشغيل العامة من النوع 64 بت بلاحقة -wide.
      • تُضاف إلى رموز التشغيل الخاصة بالنوع اللاحقة الخاصة بنوع الرمز (أو اختصار مباشر)، وهي إحدى الرموز التالية: -boolean -byte -char -short -int -long -float -double -object -string -class -void.
    • تحتوي بعض رموز التشغيل على لاحقة لإزالة الغموض والتفريق بين العمليات المتطابقة التي تتضمّن تنسيقات أو خيارات تعليمات مختلفة. يتم فصل هذه اللاحقات عن الأسماء الرئيسية بشريط عمودي ("/")، وهي موجودة بشكل أساسي لإنشاء ربط تناسبي واحد إلى واحد بثوابت ثابتة في الرمز البرمجي الذي ينشئ ويفسّر ملفّات التشغيل (أي لتقليل الغموض لدى المستخدمين).
    • في الأوصاف الواردة هنا، يتم التأكيد على عرض القيمة (الذي يشير مثلاً إلى نطاق ثابت أو عدد السجلات التي يمكن الإشارة إليها) باستخدام حرف لكل أربعة بتات من العرض.
    • على سبيل المثال، في التعليمات "move-wide/from16 vAA, vBBBB":
      • "move" هو رمز التشغيل الأساسي الذي يشير إلى العملية الأساسية (نقل قيمة السجلّ).
      • "wide" هي اللاحقة للاسم، وتشير إلى أنّه يعمل على بيانات واسعة النطاق (64 بت).
      • "from16" هي اللاحقة الخاصة بتعليمات التشغيل، وتشير إلى نوع يحتوي على مرجع سجلّ 16 بت كمصدر.
      • "vAA" هو سجلّ الوجهة (مضمّن في العملية، ومرة أخرى، القاعدة هي أنّ الوسيطات الوجهة تأتي دائمًا أولاً)، والتي يجب أن تكون في النطاق v0v255.
      • "vBBBB" هو سجلّ المصدر الذي يجب أن يكون في النطاق v0v65535.
  • اطّلِع على مستند تنسيقات التعليماتلمزيد من التفاصيل حول تنسيقات التعليمات المختلفة (المدرَجة ضمن "الرمز البرمجي والتنسيق") بالإضافة إلى تفاصيل حول بنية رمز التشغيل.
  • يُرجى الاطّلاع على مستند تنسيق ملف.dex للحصول على مزيد من التفاصيل حول مكان استخدام رمز الآلة في السياق الأوسع.

ملخّص لمجموعة الرموز النيابية

الإجراء والتنسيق البنية / الحيلة التذكيرية الوسيطات الوصف
00 10x لا   دورات النفايات

ملاحظة: يتم وضع علامة على التعليمات الزائفة التي تحمل البيانات باستخدام رمز التشغيل هذا، وفي هذه الحالة، يشير البايت ذو الترتيب الأعلى لوحدة رمز التشغيل إلى طبيعة البيانات. اطّلِع على "تنسيق packed-switch-payload"، "تنسيق sparse-switch-payload"، "تنسيق fill-array-data-payload" أدناه.

01 12x move vA, vB A: سجلّ الوجهة (4 بت)
B: سجلّ المصدر (4 بت)
نقل محتوى سجلّ غير عنصر إلى سجلّ آخر
02 22x move/from16 vAA, vBBBB A: سجلّ الوجهة (8 بت)
B: سجلّ المصدر (16 بت)
نقل محتوى سجلّ غير عنصر إلى سجلّ آخر
03 32x move/16 vAAAA, vBBBB A: سجلّ الوجهة (16 بت)
B: سجلّ المصدر (16 بت)
نقل محتوى سجلّ غير عنصر إلى سجلّ آخر
04 12x vA وvB على مستوى التنقّل A: زوج سجلّ الوجهة (4 بت)
B: زوج سجلّ المصدر (4 بت)
نقل محتوى زوج سجلّات إلى زوج آخر

ملاحظة: من القانوني الانتقال من vN إلى إما vN-1 أو vN+1، لذا يجب أن تحدّد عمليات التنفيذ كيفية قراءة نصفَي زوج السجلّ قبل الكتابة في أيّ عنصر.

05 22x move-wide/from16 vAA, vBBBB A: زوج سجلّ الوجهة (8 بت)
B: زوج سجلّ المصدر (16 بت)
نقل محتوى زوج سجلّات إلى زوج آخر

ملاحظة: اعتبارات التنفيذ هي نفسها المُدرجة في move-wide، أعلاه.

06 32x move-wide/16 vAAAA, vBBBB A: زوج سجلّ الوجهة (16 بت)
B: زوج سجلّ المصدر (16 بت)
نقل محتوى زوج سجلّات إلى زوج آخر

ملاحظة: اعتبارات التنفيذ هي نفسها المُوضَّحة في move-wide، أعلاه.

07 12x move-object vA, vB A: سجلّ الوجهة (4 بت)
B: سجلّ المصدر (4 بت)
نقل محتوى سجلّ يحمل عناصر إلى سجلّ آخر
08 22x move-object/from16 vAA, vBBBB A: سجلّ الوجهة (8 بت)
B: سجلّ المصدر (16 بت)
نقل محتوى سجلّ يحمل عناصر إلى سجلّ آخر
09 32x move-object/16 vAAAA, vBBBB A: سجلّ الوجهة (16 بت)
B: سجلّ المصدر (16 بت)
نقل محتوى سجلّ يحمل عناصر إلى سجلّ آخر
0a 11x move-result vAA سجلّ الوجهة A: (8 بت) انقل النتيجة غير القابلة للاستخدام التي تتألف من كلمة واحدة من invoke-kind الأخيرة إلى السجلّ المُشار إليه. يجب تنفيذ ذلك كتعليمات بعد invoke-kind مباشرةً، حيث لا يتم تجاهل نتيجة (كلمة واحدة غير عنصر)
0b 11x إعلانات متجاوبة على مستوى النتائج A: زوج سجلّ الوجهة (8 بت) انقل نتيجة الكلمة المزدوجة لأكثر عملية invoke-kind حديثة إلى زوج السجلّ المُشار إليه. يجب تنفيذ ذلك كتعليمات بعد invoke-kind مباشرةً، حيث لا يمكن تجاهل نتيجة (الكلمة المزدوجة) في أي مكان آخر.
0c 11x move-result-object vAA سجلّ الوجهة A: (8 بت) انقل نتيجة العنصر invoke-kind الأخيرة إلى السجلّ المُشار إليه. يجب تنفيذ ذلك كتوجيه مباشرةً بعد invoke-kind أو filled-new-array التي لا يتم تجاهل نتيجة (العنصر) الخاصة بها، ولا يمكن تنفيذه في أي مكان آخر.
0 يوم 11 مرة move-exception vAA سجلّ الوجهة A: (8 بت) حفظ استثناء تم رصده للتو في السجلّ المحدّد يجب أن يكون هذا الإجراء هو التعليمة الأولى لأي معالِج أخطاء لا يتم تجاهل الحدث المُحتسَب فيه، ويجب أن تظهر هذه التعليمة فقط كأول تعليمة لمعالِج أخطاء، ويكون ظهورها في أي مكان آخر غير صالح.
0e 10x return-void   الرجوع من طريقة void
0f 11x return vAA سجلّ قيمة الإرجاع A: (8 بت) الرجوع من طريقة عرض قيمة غير مثبّتة بعرض واحد (32 بت)
10 11x إعلانات متجاوبة على مستوى الصفحة A: زوج سجلّات القيمة المعروضة (8 بت) للخروج من طريقة تُرجع قيمة بعرض مزدوج (64 بت).
11 11x عنصر-الإرجاع vAA سجلّ قيمة الإرجاع A: (8 بت) للخروج من طريقة تعرض عنصرًا.
12 11n const/4 vA, #+B A: سجلّ الوجهة (4 بت)
B: عدد صحيح موجب (4 بت)
نقل القيمة الحرفية المحدّدة (الموسّعة بالعلامة إلى 32 بت) إلى السجلّ المحدّد
‫13 21 ثانية const/16 vAA, #+BBBB A: سجلّ الوجهة (8 بت)
B: عدد صحيح موجب (16 بت)
نقل القيمة الحرفية المحدّدة (الموسّعة بالعلامة إلى 32 بت) إلى السجلّ المحدّد
14 31i const vAA, #+BBBBBBBB A: سجل الوجهة (8 بت)
B: ثابت عشوائي 32 بت
نقل القيمة الحرفية المحدّدة إلى السجلّ المحدّد
15 21 ساعة const/high16 vAA, #+BBBB0000 A: سجلّ الوجهة (8 بت)
B: عدد صحيح موجب (16 بت)
نقل القيمة الحرفية المحدّدة (الممدودة بالصفر على اليسار إلى 32 بت) إلى السجلّ المحدّد
‫16 21 ثانية const-wide/16 vAA, #+BBBB A: سجلّ الوجهة (8 بت)
B: عدد صحيح موجب (16 بت)
نقل القيمة الحرفية المحدّدة (الموسّعة بالعلامة إلى 64 بت) إلى زوج السجلّات المحدّد
17 31i const-wide/32 vAA, #+BBBBBBBB A: سجلّ الوجهة (8 بت)
B: عدد صحيح موجب (32 بت)
نقل القيمة الحرفية المحدّدة (الموسّعة بالعلامة إلى 64 بت) إلى زوج السجلّات المحدّد
18 51 لتر const-wide vAA, #+BBBBBBBBBBBBBBBB A: سجل الوجهة (8 بت)
B: ثابت عشوائي بعرض مزدوج (64 بت)
نقل القيمة الثابتة المحدّدة إلى زوج السجلّ المحدّد
19 21h const-wide/high16 vAA, #+BBBB000000000000 A: سجلّ الوجهة (8 بت)
B: عدد صحيح موجب (16 بت)
نقل القيمة الحرفية المحدّدة (الممدودة بالصفر على اليسار إلى 64 بت) إلى زوج السجلّ المحدّد
1a 21c const-string vAA, string@BBBB A: سجلّ الوجهة (8 بت)
B: مؤشر السلسلة
نقل مرجع إلى السلسلة المحدّدة بواسطة الفهرس المحدّد إلى السجلّ المحدّد
1b 31c const-string/jumbo vAA, string@BBBBBBBB A: سجلّ الوجهة (8 بت)
B: مؤشر السلسلة
نقل مرجع إلى السلسلة المحدّدة بواسطة الفهرس المحدّد إلى السجلّ المحدّد
1c 21c const-class vAA, type@BBBB A: سجلّ الوجهة (8 بت)
B: فهرس النوع
نقل مرجع إلى الفئة المحددة بواسطة الفهرس المحدَّد إلى السجلّ المحدَّد في حال كان النوع المحدَّد أساسيًا، سيؤدي ذلك إلى تخزين إشارة إلى فئة النوع الأساسي المُعدَّلة.
1 يوم 11 مرة monitor-enter vAA A: سجلّ يحمل مرجعًا (8 بت) الحصول على الشاشة للكائن المحدَّد
1e 11x monitor-exit vAA A: سجلّ يحمل مرجعًا (8 بت) ارفع الشاشة عن الجسم المشار إليه.

ملاحظة: إذا كان يجب أن يُلقي هذا التوجيه استثناءً، يجب أن يفعل ذلك كما لو كان الكمبيوتر قد تجاوز التوجيه. قد يكون من المفيد اعتبار أنّه تم تنفيذ التعليمات بنجاح (بمعنى ما)، وتم طرح الاستثناء بعد التعليمات ولكن قبل أن تحصل التعليمات التالية على فرصة للتنفيذ. يتيح هذا التعريف لأي طريقة استخدام أداة تنظيف شاملة لرصد الأخطاء (مثل finally) الحظر على أنّه عملية تنظيف المراقبة لهذا الحظر نفسه، كطريقة للتعامل مع الاستثناءات العشوائية التي قد يتم طرحها بسبب التنفيذ السابق لـ Thread.stop()، مع الاستمرار في إدارة عملية تنظيف المراقبة المناسبة

1f 21c check-cast vAA, type@BBBB A: سجلّ يحمل مرجعًا (8 بت)
B: فهرس النوع (16 بت)
ارفِع خطأ ClassCastException إذا تعذّر تحويل المرجع في السجلّ المحدّد إلى النوع المُشار إليه.

ملاحظة: بما أنّ A يجب أن يكون دائمًا مرجعًا (وليس قيمة أساسية)، سيتعذّر تنفيذ هذا الإجراء بالضرورة أثناء التشغيل (أي أنّه سيُعرِض استثناءً) إذا كان B يشير إلى نوع أساسي.

20 22c instance-of vA, vB, type@CCCC A: سجلّ الوجهة (4 بت)
B: سجلّ يحمل مرجعًا (4 بت)
C: فهرس النوع (16 بت)
تخزين 1 في سجلّ الوجهة المحدّد إذا كان المرجع المحدّد هو مثيل للنوع المحدّد، أو 0 إذا لم يكن كذلك

ملاحظة: بما أنّ B يجب أن يكون دائمًا مرجعًا (وليس قيمة أساسية)، سيؤدي ذلك دائمًا إلى تخزين 0 إذا كان C يشير إلى نوع أساسي.

21 12x طول_المصفوفة vA, vB A: سجلّ الوجهة (4 بت)
B: سجلّ يحمل مرجع الصفيف (4 بت)
تخزين طول الصفيف المُشار إليه في سجلّ الوجهة المحدّد، في الإدخالات
22 21c new-instance vAA, type@BBBB A: سجلّ الوجهة (8 بت)
B: فهرس النوع
أنشئ مثيلًا جديدًا من النوع المحدَّد، مع تخزين إشارة إليه في الوجهة. يجب أن يشير النوع إلى فئة غير مصنّفة كصفيف.
23 22c new-array vA, vB, type@CCCC A: سجلّ الوجهة (4 بت)
B: سجلّ الحجم
C: فهرس النوع
إنشاء صفيف جديد من النوع والحجم المحدَّدَين يجب أن يكون النوع نوع مصفوفة.
24 35c filled-new-array {vC, vD, vE, vF, vG}, type@BBBB A: حجم الصفيف وعدد كلمات الوسيطات (4 بت)
B: فهرس النوع (16 بت)
C..G: سجلات الوسيطات (4 بت لكل سجل)
أنشئ صفيفًا من النوع والحجم المحدّدَين، واملأه بالمحتوى الذي تم تقديمه. يجب أن يكون النوع نوع مصفوفة. يجب أن تكون محتويات المصفوفة كلمة واحدة (أي، لا يمكن استخدام مصفوفات من long أو double، ولكن يمكن استخدام أنواع المرجع). يتم تخزين المثيل الذي تم إنشاؤه كـ "نتيجة" بالطريقة نفسها التي تخزِّن بها تعليمات استدعاء الأسلوب نتائجها، لذا يجب نقل المثيل الذي تم إنشاؤه إلى سجلّ باستخدام تعليمات move-result-object لاحقة مباشرةً (إذا كان سيتم استخدامه).
25 3rc filled-new-array/range {vCCCC .. vNNNN}, type@BBBB A: حجم الصفيف وعدد كلمات الوسيطة (8 بت)
B: فهرس النوع (16 بت)
C: سجل الوسيطة الأولى (16 بت)
N = A + C - 1
أنشئ صفيفًا من النوع والحجم المحدّدَين، واملأه بالمحتوى المقدَّم. تنطبق التوضيحات والقيود نفسها على filled-new-array الموضّحة أعلاه.
26 31t fill-array-data vAA, +BBBBBBBB (مع بيانات تكميلية على النحو المحدّد أدناه في "fill-array-data-payload التنسيق") A: إشارة إلى المصفوفة (8 بت)
B: إزاحة "الفرع" ذات القيمة الموجبة إلى التعليمة الزائفة لبيانات الجدول (32 بت)
املأ الصفيف المحدَّد بالبيانات المُشار إليها. يجب أن يشير المرجع إلى صفيف من العناصر الأساسية، ويجب أن يتطابق جدول البيانات معه من حيث النوع وألّا يحتوي على عناصر أكثر من تلك التي يمكن أن تتسع لها الصفيف. وهذا يعني أنّه قد تكون المصفوفة أكبر من الجدول، وإذا كان الأمر كذلك، يتم ضبط العناصر الأولية فقط من المصفوفة، مع ترك الباقي بدون تغيير.
27 11x throw vAA A: سجلّ يحمل استثناءً (8 بت)
طرح الاستثناء المُشار إليه
28 10t goto +AA A: فهرس فرع موقَّع (8 بت) الانتقال بلا قيد أو شرط إلى التعليمات المُشار إليها

ملاحظة: يجب ألا يكون الفاصل الزمني للفرع هو 0. (يمكن إنشاء حلقة تدور بشكل قانوني إما باستخدام goto/32 أو من خلال تضمين nop كهدف قبل الفرع).

29 20t goto/16 +AAAA A: فهرس فرع موقَّت (16 بت)
الانتقال بلا قيد أو شرط إلى التعليمات المُشار إليها

ملاحظة: يجب ألا يكون الفاصل الزمني للفرع هو 0. (يمكن إنشاء حلقة تدور بشكل قانوني إما باستخدام goto/32 أو من خلال تضمين nop كهدف قبل الفرع).

‫2a 30t goto/32 +AAAAAAAA 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: تعليمات وهمية لبيانات الجدول مع علامة "فرع" signed offset (32 بت)
الانتقال إلى تعليمات جديدة استنادًا إلى القيمة في السجلّ المُعطى باستخدام جدول مرتب لأزواج القيمة-الموضع، أو الانتقال إلى التعليمات التالية في حال عدم تطابق أي قيمة
2d..31 23x cmpkind vAA, vBB, vCC
2d: cmpl-float (lt bias)
2e: cmpg-float (gt bias)
2f: cmpl-double (lt bias)
30: cmpg-double (gt bias)
31: cmp-long
A: سجلّ الوجهة (8 بت)
B: سجلّ أو زوج المصدر الأول
C: سجلّ أو زوج المصدر الثاني
نفِّذ مقارنة النقطة العائمة أو long المُشار إليها، واضبط a على 0 إذا كانت b == c، 1 إذا كانت b > c، أو -1 إذا كانت b < c. يشير "الانحراف" المدرَج لعمليات النقطة العائمة إلى كيفية التعامل مع مقارنات NaN: تُعرِض تعليمات "الانحراف الأكبر من" القيمة 1 لمقارنات NaN، وتُعرِض تعليمات "الانحراف الأصغر من" القيمة -1.

على سبيل المثال، للتحقّق مما إذا كانت النقطة العائمة x < y، من المستحسن استخدام cmpg-float. تشير النتيجة -1 إلى أنّه كان الاختبار صحيحًا، وتشير القيم الأخرى إلى أنّه كان خاطئًا إما بسبب مقارنة صالحة أو لأنّ إحدى القيم كانت NaN.

32..37 22t if-test vA, vB, +CCCC
32: if-eq
33: if-ne
34: if-lt
35: if-ge
36: if-gt
37: if-le
A: السجلّ الأوّل الذي سيتم اختباره (4 بت)
B: السجلّ الثاني الذي سيتم اختباره (4 بت)
C: فهرس الفرع الموقَّت (16 بت)
الانتقال إلى الوجهة المحدّدة إذا كانت قيم السجلّين المحدّدَين تتطابق على النحو المحدّد

ملاحظة: يجب ألا يكون موضع فرع الإصدار 0. (يمكن إنشاء حلقة تدور بشكل قانوني إما من خلال التفرع حول goto للخلف أو من خلال تضمين nop كهدف قبل التفرع).

38..3d 21t if-testz vAA, +BBBB
38: if-eqz
39: if-nez
3a: if-ltz
3b: if-gez
3c: if-gtz
3d: if-lez
A: سجلّ الاختبار (8 بت)
B: إزاحة الفرع الموقَّع (16 بت)
الانتقال إلى الوجهة المحدّدة إذا كانت قيمة السجلّ المحدّدة تقارن مع 0 على النحو المحدّد

ملاحظة: يجب ألا يكون الفاصل الزمني للفرع هو 0. (يمكن إنشاء حلقة تدور بشكل قانوني إما من خلال التفرع حول goto للخلف أو من خلال تضمين nop كهدف قبل التفرع).

‫3e..43 10x (غير مستخدَم)   (غير مستخدَم)
44..51 23x arrayop vAA, vBB, vCC
44: aget
45: aget-wide
46: aget-object
47: aget-boolean
48: aget-byte
49: aget-char
4a: aget-short
4b: aput
4c: aput-wide
4d: aput-object
4e: aput-boolean
4f: aput-byte
50: aput-char
51: aput-short
A: سجلّ القيمة أو الزوج، قد يكون المصدر أو الوجهة (8 بت)
B: سجلّ الصفيف (8 بت)
C: سجلّ الفهرس (8 بت)
تنفيذ عملية الصفيف المحدّدة في الفهرس المحدّد من الصفيف المحدّد، مع التحميل أو التخزين في سجلّ القيم
52..5f 22c iinstanceop vA, vB, field@CCCC
52: iget
53: iget-wide
54: iget-object
55: iget-boolean
56: iget-byte
57: iget-char
58: iget-short
59: iput
5a: iput-wide
5b: iput-object
5c: iput-boolean
5d: iput-byte
5e: iput-char
5f: iput-short
A: سجلّ قيمة أو زوج؛ قد يكون المصدر أو الوجهة (4 بتات)
B: سجلّ العنصر (4 بتات)
C: فهرس مرجع حقل العنصر (16 بتًا)
نفِّذ عملية حقل مثيل العنصر المحدَّد باستخدام الحقل المحدَّد، أو حمِّله أو احفظه في سجلّ القيم.

ملاحظة: إنّ رموز التشغيل هذه هي مرشّحات معقولة للربط الثابت، حيث يتم تغيير مَعلمة الحقل لتكون إزاحة أكثر مباشرةً.

60..6d 21c ‫sstaticop vAA, field@BBBB
60: sget
61: sget-wide
62: sget-object
63: sget-boolean
64: sget-byte
65: sget-char
66: sget-short
67: sput
68: sput-wide
69: sput-object
6a: sput-boolean
6b: sput-byte
6c: sput-char
6d: sput-short
A: سجلّ القيمة أو الزوج، قد يكون المصدر أو الوجهة (8 بتات)
B: فهرس مرجع الحقل الثابت (16 بتًا)
نفِّذ عملية الحقل الثابت للعنصر المحدَّد باستخدام الحقل الثابت المحدَّد، مع تحميله أو تخزينه في سجلّ القيم.

ملاحظة: إنّ رموز التشغيل هذه هي مرشّحات معقولة للربط الثابت، حيث يتم تغيير مَعلمة الحقل لتكون إزاحة أكثر مباشرةً.

6e..72 35c invoke-kind {vC, vD, vE, vF, vG}, meth@BBBB
6e: invoke-virtual
6f: invoke-super
70: invoke-direct
71: invoke-static
72: invoke-interface
A: عدد كلمات الوسيطة (4 بت)
B: فهرس مرجع الطريقة (16 بت)
C..G: سجلّات الوسيطة (4 بت لكلٍّ منها)
استخدِم الطريقة المُشار إليها. قد يتم تخزين النتيجة (إن وُجدت) باستخدام صيغة move-result* مناسبة كتوجيه يليه مباشرةً.

يتم استخدام invoke-virtual لاستدعاء ملف شخصي افتراضي عادي وهو طريقة ليست static أو private أو مُنشئ.

عندما يشير العنصر method_id إلى طريقة في صف برمجي ليس واجهة، يتم استخدام invoke-super لاستدعاء الطريقة الافتراضية في الفئة الأساسية الأقرب (بدلاً من الطريقة التي تحمل العنصر method_id نفسه في الصف البرمجي الذي يُجري الاستدعاء). تنطبق القيود نفسها على الطريقة التي تنطبق على invoke-virtual.

في الإصدار 037 أو الإصدارات الأحدث من ملفات Dex، إذا كان العنصر method_id يشير إلى طريقة واجهة، يتم استخدام invoke-super لاستدعاء الإصدار الأكثر تحديدًا الذي لم يتم استبداله من تلك الطريقة المحدّدة في تلك الواجهة. تنطبق القيود نفسها على طريقة الدفع هذه كما تنطبق على invoke-virtual. في ملفات Dex قبل الإصدار 037، يكون استخدام واجهة method_id غير قانوني وغير محدّد.

يتم استخدام invoke-direct لاستدعاء طريقة غيرstatic مباشرة (أي طريقة مثيل لا يمكن تجاوزها بطبيعتها، أي طريقة مثيل private أو مُنشئ).

يُستخدَم invoke-static لاستدعاء طريقة static (التي تُعدّ دائمًا طريقة مباشرة).

يتم استخدام invoke-interface لاستدعاء interface، أي على عنصر ليس معروفًا نوعه المحدّد، باستخدام method_id يشير إلى interface.

ملاحظة: إنّ رموز التشغيل هذه هي مرشّحات معقولة للربط الثابت، حيث يتم تغيير مَعلمة الطريقة لتكون إزاحة مباشرة أكثر (أو زوجًا منها).

‫73 10x (غير مستخدَم)   (غير مستخدَم)
‫74..78 3rc invoke-kind/range {vCCCC .. vNNNN}, meth@BBBB
74: invoke-virtual/range
75: invoke-super/range
76: invoke-direct/range
77: invoke-static/range
78: invoke-interface/range
A: عدد كلمات الوسيطات (8 بت)
B: فهرس مرجع الطريقة (16 بت)
C: سجل الوسيطة الأولى (16 بت)
N = A + C - 1
استخدِم الطريقة المُشار إليها. اطّلِع على invoke-kind الوصف الأول أعلاه لمعرفة التفاصيل والتحذيرات والاقتراحات.
‫79..7a 10x (غير مستخدَم)   (غير مستخدَم)
‫7b..8f 12x unop vA, vB
7b: neg-int
7c: not-int
7d: neg-long
7e: not-long
7f: neg-float
80: neg-double
81: int-to-long
82: int-to-float
83: int-to-double
84: long-to-int
85: long-to-float
86: long-to-double
87: float-to-int
88: float-to-long
89: float-to-double
8a: double-to-int
8b: double-to-long
8c: double-to-float
8d: int-to-byte
8e: int-to-char
8f: int-to-short
A: سجلّ الوجهة أو الزوج (4 بت)
B: سجلّ المصدر أو الزوج (4 بت)
نفِّذ العملية الأحادية المحدَّدة على سجلّ المصدر، مع تخزين النتيجة في سجلّ الوجهة.
90..af 23x binop vAA, vBB, vCC
90: add-int
91: sub-int
92: mul-int
93: div-int
94: rem-int
95: and-int
96: or-int
97: xor-int
98: shl-int
99: shr-int
9a: ushr-int
9b: add-long
9c: sub-long
9d: mul-long
9e: div-long
9f: rem-long
a0: and-long
a1: or-long
a2: xor-long
a3: shl-long
a4: shr-long
a5: ushr-long
a6: add-float
a7: sub-float
a8: mul-float
a9: div-float
aa: rem-float
ab: add-double
ac: sub-double
ad: mul-double
ae: div-double
af: rem-double
A: سجلّ الوجهة أو الزوج (8 بت)
B: سجلّ المصدر الأول أو الزوج (8 بت)
C: سجلّ المصدر الثاني أو الزوج (8 بت)
تنفيذ العملية الثنائية المحدّدة على سجلّي المصدر، وتخزين النتيجة في سجلّ الوجهة

ملاحظة: على عكس العمليات الحسابية الأخرى -long (التي تأخذ أزواج سجلّات لكل من المصدر الأول والثاني)، تأخذ الدوالّ shl-long وshr-long وushr-long زوج سجلّات لمصدرها الأول (القيمة التي سيتم نقلها)، ولكنّها تأخذ سجلًّا واحدًا لمصدرها الثاني (مسافة النقل).

b0..cf 12x binop/2addr vA, vB
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
bc: sub-long/2addr
bd: mul-long/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: sub-float/2addr
c8: mul-float/2addr
c9: div-float/2addr
ca: rem-float/2addr
cb: add-double/2addr
cc: sub-double/2addr
cd: mul-double/2addr
ce: div-double/2addr
cf: rem-double/2addr
A: سجلّ الوجهة وسجلّ المصدر الأول أو الزوج (4 بت)
B: سجلّ المصدر الثاني أو الزوج (4 بت)
نفِّذ العملية الثنائية المحدّدة على سجلّي المصدر، مع تخزين النتيجة في سجلّ المصدر الأول.

ملاحظة: على عكس العمليات الحسابية الأخرى -long/2addr (التي تستخدِم أزواجًا من السجلات لكلّ من الوجهة/المصدر الأول والمصدر الثاني)، تستخدِم shl-long/2addr shr-long/2addr وushr-long/2addr زوجًا من السجلات للوجهة/المصدر الأول (القيمة التي سيتم نقلها)، ولكنّها تستخدِم سجلًّا واحدًا للمصدر الثاني (مسافة النقل).

d0..d7 22s 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: and-int/lit16
d6: or-int/lit16
d7: xor-int/lit16
A: سجلّ الوجهة (4 بت)
B: سجلّ المصدر (4 بت)
C: ثابت عدد صحيح موجب (16 بت)
نفِّذ العملية الثنائية المُشار إليها على السجلّ المُشار إليه (أول وسيطة) والقيمة الحرفية (الوسيطة الثانية)، مع تخزين النتيجة في سجلّ الوجهة.

ملاحظة: لا يحتوي الإصدار rsub-int على لاحقة لأنّه هو الرمز البرمجي الرئيسي لفئة الترميز. يمكنك أيضًا الاطّلاع أدناه على تفاصيل حول دلالته.

d8..e2 22b binop/lit8 vAA, vBB, #+CC
d8: add-int/lit8
d9: rsub-int/lit8
da: mul-int/lit8
db: div-int/lit8
dc: rem-int/lit8
dd: and-int/lit8
de: or-int/lit8
df: xor-int/lit8
e0: shl-int/lit8
e1: shr-int/lit8
e2: ushr-int/lit8
A: سجلّ الوجهة (8 بت)
B: سجلّ المصدر (8 بت)
C: ثابت عدد صحيح موجب (8 بت)
نفِّذ العملية الثنائية المُشار إليها على السجلّ المُشار إليه (الوسيطة الأولى) والقيمة الحرفية (الوسيطة الثانية)، مع تخزين النتيجة في السجلّ الوجهة.

ملاحظة: يُرجى الاطّلاع أدناه على تفاصيل حول الدلالات المتعلّقة بعلامة rsub-int.

e3..f9 10x (غير مستخدَم)   (غير مستخدَم)
‫fa 45cc invoke-polymorphic {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 الثنائي استثناءات عند تنفيذه. يتم وصف الاستثناءات في مستندات واجهة برمجة التطبيقات للطريقة المتعدّدة الأشكال للتوقيع التي يتمّ استدعاؤها.

يظهر في ملفات Dex من الإصدار 038 فصاعدًا.
fb 4rcc invoke-polymorphic/range {vCCCC .. vNNNN}, meth@BBBB, proto@HHHH A: عدد كلمات الوسيطات (8 بت)
B: فهرس مرجع الطريقة (16 بت)
C: المستلِم (16 بت)
H: فهرس مرجع النموذج الأولي (16 بت)
N = A + C - 1
استدعاء اسم الطريقة المحدَّد يُرجى الاطّلاع على الوصف invoke-polymorphic أعلاه لمعرفة التفاصيل.

يظهر في ملفات Dex من الإصدار 038 فصاعدًا.
fc 35c invoke-custom {vC, vD, vE, vF, vG}, call_site@BBBB A: عدد كلمات الوسيطات (4 بت)
B: فهرس مرجع موقع الاستدعاء (16 بت)
C..G: سجلّات الوسيطات (4 بت لكلّ سجلّ)
تؤدي هذه الوظيفة إلى تحليل موقع الاستدعاء المحدَّد واستخدامه. قد يتم تخزين النتيجة من الطلب (إن وُجدت) باستخدام أحد move-result* المتغيرات المناسبة كتعليمات متعاقبة على الفور.

يتم تنفيذ هذا الإجراء على مرحلتين: تحديد موقع المكالمة وبدء موقع المكالمة.

يتحقّق حلّ موقع الاتصال مما إذا كان موقع الاتصال المشار إليه يتضمّن مثيلًا مرتبطًا من java.lang.invoke.CallSite. وإذا لم يكن الأمر كذلك، يتم طلب طريقة رابط التمهيد لموقع الاتصال المشار إليه باستخدام الوسيطات المتوفّرة في ملف DEX (راجِع call_site_item). تُعرِض java.lang.invoke.CallSite �� من المحتمل أنّ سلسلة محادثات أخرى قد أجرت عملية الربط أولاً، وفي هذه الحالة، سيستمر تنفيذ التعليمات باستخدام أول مثيل مرتبط من java.lang.invoke.CallSite.

يتمّ استدعاء موقع الاتصال على java.lang.invoke.MethodHandle المستهدَف لمثيل java.lang.invoke.CallSite الذي تمّ حلّه. يتمّ استدعاء الهدف على النحو التالي: كما لو كان يتمّ تنفيذ invoke-polymorphic (الموضّح أعلاه) باستخدام مقبض الطريقة ووسائط التعليمات invoke-custom كما لو كانت الوسائط لاستدعاء مقبض طريقة دقيق.

يتم تضمين الاستثناءات التي ترفعها طريقة رابط التمهيد في java.lang.BootstrapMethodError. يتم أيضًا رفع BootstrapMethodError في الحالات التالية:
  • لا يمكن لطريقة رابط التمهيد عرض مثيل java.lang.invoke.CallSite.
  • يحتوي العنصر java.lang.invoke.CallSite الذي تم إرجاعه على null استهداف معرّف طريقة.
  • لا يكون هدف معرّف الطريقة من النوع المطلوب.
يظهر في ملفات Dex من الإصدار 038 فصاعدًا.
fd 3rc invoke-custom/range {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 فصاعدًا.
ff 21c const-method-type vAA, proto@BBBB A: سجلّ الوجهة (8 بت)
B: مرجع النموذج الأولي للطريقة (16 بت)
نقل إشارة إلى النموذج الأولي للطريقة المحدّد بواسطة الفهرس المحدّد إلى السجلّ المحدّد

يظهر في ملفات Dex من الإصدار 039 فصاعدًا.

تنسيق packed-switch-payload

الاسم التنسيق الوصف
ident ushort = 0x0100 تحديد الرمز الثنائي الزائف
الحجم ushort عدد الإدخالات في الجدول
first_key تدخُّل دفاعي القيمة الأولى (والأدنى) لحالة التبديل
الاستهدافات int[] قائمة بـ size هدف فرع نسبي تكون الاستهدافات نسبةً إلى عنوان رمز التشغيل للتبديل، وليس هذا الجدول.

ملاحظة: إجمالي عدد وحدات الرموز البرمجية لنسخة من جدول المقارنة هذا هو (size * 2) + 4.

تنسيق sparse-switch-payload

الاسم التنسيق الوصف
ident ushort = 0x0200 تحديد الرمز الثنائي الزائف للتعليمات
الحجم ushort عدد الإدخالات في الجدول
مفاتيح int[] قائمة بقيم مفتاح size، مرتبة من الأدنى إلى الأعلى
الاستهدافات int[] قائمة بـ size أهداف فرعية نسبية، يتوافق كل منها مع قيمة المفتاح في الفهرس نفسه تكون الاستهدافات نسبةً إلى عنوان رمز التشغيل للتبديل، وليس هذا الجدول.

ملاحظة: إجمالي عدد وحدات الرموز البرمجية لنسخة من جدول هذا هو (size * 4) + 2.

تنسيق fill-array-data-payload

الاسم التنسيق الوصف
ident ushort = 0x0300 تحديد الرمز الثنائي الزائف للتعليمات
element_width ushort عدد وحدات البايت في كل عنصر
الحجم uint عدد العناصر في الجدول
البيانات ubyte[] قيم البيانات

ملاحظة: إجمالي عدد وحدات الرموز البرمجية لنسخة من جدول هذا هو (size * element_width + 1) / 2 + 4.

تفاصيل العملية الحسابية

ملاحظة: يجب أن تتّبع عمليات النقطة العائمة قواعد IEEE 754، باستخدام التقريب إلى أقرب عدد صحيح ونقص تدريجي، ما لم يُنصّ على خلاف ذلك.

رمز التشغيل الدلالات في C الملاحظات
عدد صحيح سالب int32 a;
int32 result = -a;
التكمّل الثنائي الوحدي
not-int int32 a;
int32 result = ~a;
تكملة أحادية من القيم الواحدة
neg-long int64 a;
int64 result = -a;
التكمّل الثنائي الوحدي
not-long int64 a;
int64 result = ~a;
تكملة أحادية من القيم الواحدة
neg-float float a;
float result = -a;
النفي باستخدام النقطة العائمة
neg-double double a;
double result = -a;
النفي باستخدام النقطة العائمة
int-to-long int32 a;
int64 result = (int64) a;
توقيع إضافة int32 إلى int64
int-to-float int32 a;
float result = (float) a;
تحويل int32 إلى float باستخدام التقريب إلى أقرب عدد صحيح ويؤدي ذلك إلى فقدان الدقة لبعض القيم.
int-to-double int32 a;
double result = (double) a;
تحويل int32 إلى double
long-to-int int64 a;
int32 result = (int32) a;
اقتطاع int64 إلى int32
long-to-float int64 a;
float result = (float) a;
تحويل int64 إلى float باستخدام التقريب إلى أقرب عدد صحيح ويؤدي ذلك إلى فقدان الدقة لبعض القيم.
من طويل إلى مزدوج int64 a;
double result = (double) a;
تحويل int64 إلى double باستخدام التقريب إلى أقرب عدد صحيح ويؤدي ذلك إلى فقدان الدقة لبعض القيم.
float-to-int float a;
int32 result = (int32) a;
تحويل float إلى int32 باستخدام التقريب إلى الصفر NaN و-0.0 (صفر سالب) يُحوَّلان إلى العدد الصحيح 0. يتم تحويل القيم التي لا نهائية والقيم التي تبلغ قيمتها عددًا كبيرًا جدًا بحيث لا يمكن تمثيلها إلى إما 0x7fffffff أو -0x80000000 استنادًا إلى العلامة.
float-to-long float a;
int64 result = (int64) a;
تحويل float إلى int64 باستخدام التقريب إلى الصفر تنطبق هنا قواعد الحالات الخاصة نفسها التي تنطبق على float-to-int، باستثناء أنّ القيم خارج النطاق يتم تحويلها إلى 0x7fffffffffffffff أو -0x8000000000000000 حسب العلامة.
float-to-double float a;
double result = (double) a;
تحويل float إلى double مع الحفاظ على القيمة تمامًا
double-to-int double a;
int32 result = (int32) a;
تحويل double إلى int32 باستخدام التقريب إلى الصفر تنطبق هنا قواعد الحالات الخاصة نفسها التي تنطبق على float-to-int.
مزدوج إلى طويل double a;
int64 result = (int64) a;
تحويل double إلى int64 باستخدام التقريب إلى الصفر تنطبق هنا قواعد الحالات الخاصة نفسها التي تنطبق على float-to-long.
double-to-float double a;
float result = (float) 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، بدون إضافة علامة
int-to-short int32 a;
int32 result = (a << 16) >> 16;
اقتطاع القيمة من int32 إلى int16، إشارة إلى توسيع النطاق
add-int int32 a, b;
int32 result = a + b;
إضافة التكميليَين
sub-int int32 a, b;
int32 result = a - b;
طرح باستخدام المكمل الثنائي
rsub-int int32 a, b;
int32 result = b - a;
طرح عكسي باستخدام الترميز الثنائي
mul-int int32 a, b;
int32 result = a * b;
الضرب باستخدام المكمل الثنائي
div-int int32 a, b;
int32 result = a / b;
قسمة باستخدام المكمل الثنائي، ويتم تقريبها باتجاه الصفر (أي يتم اقتطاعها لتكون عددًا صحيحًا). يؤدي ذلك إلى طرح ArithmeticException إذا b == 0.
rem-int int32 a, b;
int32 result = a % b;
الباقي بنظام التكميلي الثنائية بعد القسمة علامة النتيجة هي نفسها علامة a، ويتم تعريفها بدقة أكبر على أنّها result == a - (a / b) * b. يؤدي ذلك إلى طرح ArithmeticException إذا b == 0.
and-int int32 a, b;
int32 result = a & b;
استخدام AND على مستوى البت.
or-int int32 a, b;
int32 result = a | b;
استخدام OR على مستوى البت.
xor-int int32 a, b;
int32 result = a ^ b;
استخدام XOR على مستوى البت
shl-int int32 a, b;
int32 result = a << (b & 0x1f);
تحويل بتي إلى اليسار (مع وسيطة مُخفَّاة)
shr-int int32 a, b;
int32 result = a >> (b & 0x1f);
تحويل بتي بقيمة موجبة يمينًا (مع وسيطة مُخفَّاة)
ushr-int uint32 a, b;
int32 result = a >> (b & 0x1f);
التحويل الصحيح لأعداد ثنائية إلى اليمين (مع وسيطة مُعرَّفة)
add-long int64 a, b;
int64 result = a + b;
إضافة التكميليَين
قصيرة جدًا int64 a, b;
int64 result = a - b;
طرح باستخدام المكمل الثنائي
mul-long int64 a, b;
int64 result = a * b;
الضرب باستخدام المكمل الثنائي
div-long int64 a, b;
int64 result = a / b;
قسمة باستخدام المكمل الثنائي، ويتم تقريبها باتجاه الصفر (أي يتم اقتطاعها لتكون عددًا صحيحًا). يؤدي ذلك إلى طرح ArithmeticException إذا b == 0.
rem-long int64 a, b;
int64 result = a % b;
الباقي بعد القسمة باستخدام طريقة المكمل الثنائي علامة النتيجة هي نفسها علامة a، ويتم تعريفها بدقة أكبر على أنّها result == a - (a / b) * b. يؤدي ذلك إلى طرح ArithmeticException إذا b == 0.
and-long int64 a, b;
int64 result = a & b;
استخدام AND على مستوى البت.
or-long int64 a, b;
int64 result = a | b;
استخدام OR على مستوى البت.
xor-long int64 a, b;
int64 result = a ^ b;
استخدام XOR على مستوى البت
shl-long int64 a;
int32 b;
int64 result = a << (b & 0x3f);
تحويل بتي إلى اليسار (مع وسيطة مُخفَّاة)
shr-long int64 a;
int32 b;
int64 result = a >> (b & 0x3f);
تحويل بتي بقيمة موجبة يمينًا (مع وسيطة مُخفَّاة)
ushr-long uint64 a;
int32 b;
int64 result = a >> (b & 0x3f);
التحويل الصحيح لأعداد ثنائية إلى اليمين (مع وسيطة مُعرَّفة)
add-float float a, b;
float result = a + b;
إضافة الأرقام العشرية
sub-float float a, b;
float result = a - b;
طرح الأرقام العشرية
mul-float float a, b;
float result = a * b;
عملية ضرب الأرقام العشرية
div-float float a, b;
float result = a / b;
قسمة النقطة العائمة
rem-float float a, b;
float result = a % b;
الباقي بعد القسمة بفاصلة عائمة تختلف هذه الدالة عن المتبقي وفقًا لمعيار IEEE 754 ويتم تعريفها على النحو التالي: result == a - roundTowardZero(a / b) * b.
add-double double a, b;
double result = a + b;
إضافة الأرقام العشرية
سرير مزدوج صغير double a, b;
double result = a - b;
طرح الأرقام العشرية
mul-double double a, b;
double result = a * b;
عملية ضرب النقطة العائمة
div-double double a, b;
double result = a / b;
قسمة النقطة العائمة
rem-double double a, b;
double result = a % b;
الباقي بعد القسمة بفاصلة عائمة تختلف هذه الدالة عن المتبقي وفقًا لمعيار IEEE 754 ويتم تعريفها على النحو التالي: result == a - roundTowardZero(a / b) * b.