التصميم العام
- يهدف نموذج الآلة واصطلاحات الاستدعاء إلى محاكاة التصاميم الحقيقية الشائعة واصطلاحات الاستدعاء بأسلوب C تقريبًا:
- تستند الآلة إلى السجلّ، ويكون حجم اللقطات ثابتًا عند إنشائها.
يتألّف كل إطار من عدد معيّن من السجلات (يتم تحديده من قِبل
الطريقة) بالإضافة إلى أي بيانات مساعدة مطلوبة لتنفيذ الطريقة،
مثل (على سبيل المثال لا الحصر) عدّاد البرنامج وإشارة إلىملف
.dex
الذي يحتوي على الطريقة. - عند استخدامها لقيم البت (مثل الأعداد الصحيحة والأرقام المشتقة من النقطة العائمة)، تُعتبر السجلات بسعة 32 بت. يتم استخدام أزواج السجلّ المجاورة للقيم 64 بت. ما مِن شرط للتنسيق لمثيلات السجلات.
- عند استخدامها لمراجع الكائنات، تُعدّ السجلات واسعة بما يكفي لاستيعاب مرجع واحد بالضبط.
- من حيث التمثيل الثنائي،
(Object) null == (int) 0
. - تنتقل N وسيطة إلى الطريقة في آخر N سجل
من إطار استدعاء الطريقة، بالترتيب. تستهلك الوسيطات الواسعة
سجلّين. يتم تمرير مرجع
this
إلى طرق المثيل كوسيطة أولى.
- تستند الآلة إلى السجلّ، ويكون حجم اللقطات ثابتًا عند إنشائها.
يتألّف كل إطار من عدد معيّن من السجلات (يتم تحديده من قِبل
الطريقة) بالإضافة إلى أي بيانات مساعدة مطلوبة لتنفيذ الطريقة،
مثل (على سبيل المثال لا الحصر) عدّاد البرنامج وإشارة إلىملف
- وحدة التخزين في تسلسل التعليمات هي كمية غير موقَّعة بسعة 16 بت. يتم تجاهل بعض الوحدات في بعض التعليمات / يجب أن تكون صفرًا.
- لا تقتصر التعليمات على نوع معيّن بدون داعٍ. على سبيل المثال، فإنّ التعليمات التي تنقل قيم سجلّات 32 بت بدون تفسير لا يجب أن تحدّد ما إذا كانت تنقل أعدادًا صحيحة أو أعدادًا كسرية.
- هناك مجموعات ثابتة مُدرَجة ومُفهرسة بشكل منفصل ل إشارات إلى السلاسل والأنواع والحقول والطُرق.
- يتم تمثيل البيانات الثنائية الثابتة بشكل مضمّن في تسلسل التعليمات.
- لأنّه من غير الشائع أن تحتاج إحدى الطرق إلى أكثر من
16 سجلاً، ولأنّ الحاجة إلى أكثر من ثمانية سجلات
شائعة بشكل معقول، تقتصر العديد من التعليمات على معالجة
أول 16
سجلاً فقط. تسمح التعليمات، كلما أمكن ذلك بشكل معقول، بالمراجع التي تشير إلى
ما يصل إلى أول 256 سجلًّا. بالإضافة إلى ذلك، تحتوي بعض التعليمات على صيغ
تسمح بعدد أكبر بكثير من السجلات، بما في ذلك زوج من تعليمات
move
التي يمكنها معالجة السجلات في النطاقv0
–v65535
. في الحالات التي لا يكون فيها أحد الصيغ الخاصة بالتعليمات متاحًا لمعالجة سجلّ مطلوب، من المتوقّع أن يتم نقل محتويات السجلّ من السجلّ الأصلي إلى سجلّ منخفض (قبل الإجراء ) و/أو نقلها من سجلّ النتائج المنخفض إلى سجلّ مرتفع (بعد الإجراء). - هناك العديد من "التعليمات الزائفة" التي تُستخدَم لتخزين حمولات بيانات بطول متغيّر، والتي تتم الإشارة إليها من خلال تعليمات عاديّة (مثل
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
" هو سجلّ الوجهة (مضمّن في العملية، ومرة أخرى، القاعدة هي أنّ الوسيطات الوجهة تأتي دائمًا أولاً)، والتي يجب أن تكون في النطاقv0
–v255
. - "
vBBBB
" هو سجلّ المصدر الذي يجب أن يكون في النطاقv0
–v65535
.
- "
- اطّلِع على مستند تنسيقات التعليماتلمزيد من التفاصيل حول تنسيقات التعليمات المختلفة (المدرَجة ضمن "الرمز البرمجي والتنسيق") بالإضافة إلى تفاصيل حول بنية رمز التشغيل.
- يُرجى الاطّلاع على مستند تنسيق ملف
.dex
للحصول على مزيد من التفاصيل حول مكان استخدام رمز الآلة في السياق الأوسع.
ملخّص لمجموعة الرموز النيابية
الإجراء والتنسيق | البنية / الحيلة التذكيرية | الوسيطات | الوصف |
---|---|---|---|
00 10x | لا | دورات النفايات
ملاحظة:
يتم وضع علامة على التعليمات الزائفة التي تحمل البيانات باستخدام رمز التشغيل هذا، وفي هذه الحالة، يشير البايت ذو الترتيب الأعلى لوحدة رمز التشغيل إلى طبيعة
البيانات. اطّلِع على "تنسيق |
|
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 بت) |
نقل محتوى زوج سجلّات إلى زوج آخر
ملاحظة:
من القانوني الانتقال من |
05 22x | move-wide/from16 vAA, vBBBB | A: زوج سجلّ الوجهة (8 بت)B: زوج سجلّ المصدر (16 بت) |
نقل محتوى زوج سجلّات إلى زوج آخر
ملاحظة:
اعتبارات التنفيذ هي نفسها المُدرجة في |
06 32x | move-wide/16 vAAAA, vBBBB | A: زوج سجلّ الوجهة (16 بت)B: زوج سجلّ المصدر (16 بت) |
نقل محتوى زوج سجلّات إلى زوج آخر
ملاحظة:
اعتبارات التنفيذ هي نفسها المُوضَّحة في |
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 بت) |
ارفع الشاشة عن الجسم المشار إليه.
ملاحظة:
إذا كان يجب أن يُلقي هذا التوجيه استثناءً، يجب أن يفعل ذلك
كما لو كان الكمبيوتر قد تجاوز التوجيه.
قد يكون من المفيد اعتبار أنّه تم تنفيذ التعليمات بنجاح (بمعنى ما)، وتم طرح الاستثناء بعد
التعليمات ولكن قبل أن تحصل التعليمات التالية على فرصة
للتنفيذ. يتيح هذا التعريف لأي طريقة استخدام
أداة تنظيف شاملة لرصد الأخطاء (مثل |
1f 21c | check-cast vAA, type@BBBB | A: سجلّ يحمل مرجعًا (8 بت)B: فهرس النوع (16 بت) |
ارفِع خطأ ClassCastException إذا تعذّر تحويل المرجع في
السجلّ المحدّد إلى النوع المُشار إليه.
ملاحظة: بما أنّ |
20 22c | instance-of vA, vB, type@CCCC | A: سجلّ الوجهة (4 بت)B: سجلّ يحمل مرجعًا (4 بت)C: فهرس النوع (16 بت) |
تخزين 1
في سجلّ الوجهة المحدّد إذا كان المرجع المحدّد هو مثيل للنوع المحدّد،
أو 0 إذا لم يكن كذلك
ملاحظة: بما أنّ |
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 بت) |
الانتقال بلا قيد أو شرط إلى التعليمات المُشار إليها
ملاحظة:
يجب ألا يكون الفاصل الزمني للفرع هو |
29 20t | goto/16 +AAAA | A: فهرس فرع موقَّت (16 بت) |
الانتقال بلا قيد أو شرط إلى التعليمات المُشار إليها
ملاحظة:
يجب ألا يكون الفاصل الزمني للفرع هو |
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 .
على سبيل المثال، للتحقّق مما إذا كانت النقطة العائمة
|
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 بت) |
الانتقال إلى الوجهة المحدّدة إذا كانت قيم السجلّين المحدّدَين
تتطابق على النحو المحدّد
ملاحظة:
يجب ألا يكون موضع فرع الإصدار |
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 على النحو المحدّد
ملاحظة:
يجب ألا يكون الفاصل الزمني للفرع هو |
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* مناسبة كتوجيه يليه
مباشرةً.
يتم استخدام عندما يشير العنصر في الإصدار يتم استخدام يُستخدَم يتم استخدام ملاحظة: إنّ رموز التشغيل هذه هي مرشّحات معقولة للربط الثابت، حيث يتم تغيير مَعلمة الطريقة لتكون إزاحة مباشرة أكثر (أو زوجًا منها). |
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 بت) |
تنفيذ العملية الثنائية المحدّدة على سجلّي المصدر،
وتخزين النتيجة في سجلّ الوجهة
ملاحظة:
على عكس العمليات الحسابية الأخرى |
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 بت) |
نفِّذ العملية الثنائية المحدّدة على سجلّي المصدر،
مع تخزين النتيجة في سجلّ المصدر الأول.
ملاحظة:
على عكس العمليات الحسابية الأخرى |
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 بت) |
نفِّذ العملية الثنائية المُشار إليها على السجلّ المُشار إليه (أول
وسيطة) والقيمة الحرفية (الوسيطة الثانية)، مع تخزين النتيجة في
سجلّ الوجهة.
ملاحظة:
لا يحتوي الإصدار |
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 بت) |
نفِّذ العملية الثنائية المُشار إليها على السجلّ المُشار إليه (الوسيطة
الأولى) والقيمة الحرفية (الوسيطة الثانية)، مع تخزين النتيجة
في السجلّ الوجهة.
ملاحظة: يُرجى الاطّلاع أدناه على تفاصيل حول الدلالات المتعلّقة بعلامة
|
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 في الحالات التالية:
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 .
|