قالب بایت‌کد Dalvik

طراحی عمومی

  • مدل ماشین و قراردادهای فراخوانی تقریباً برای تقلید از معماری‌های واقعی رایج و قراردادهای فراخوانی سبک C درنظر گرفته شده‌اند:
    • این ماشین مبتنی بر ثبت است و قاب‌ها هنگام ایجاد در اندازه ثابت هستند. هر قاب از تعداد مشخصی ثبات (که توسط روش مشخص می‌شود) و همچنین هرگونه داده کمکی موردنیاز برای اجرای روش تشکیل شده است، مانند (اما نه محدود به) شمارنده برنامه و ارجاع به فایل .dex که حاوی روش است.
    • وقتی برای مقادیر بیت (مثل اعداد صحیح و اعداد ممیز شناور) استفاده می‌شوند، ثبات‌ها ۳۲ بیت پهنا دارند. جفت‌های ثبات مجاور برای مقادیر ۶۴ بیتی استفاده می‌شوند. برای جفت‌های ثبات، الزامی برای تراز وجود ندارد.
    • وقتی از ثبات‌ها برای ارجاع به شیء استفاده می‌شود، ثبات‌ها به‌اندازه کافی بزرگ درنظر گرفته می‌شوند تا دقیقاً یک ارجاع را در خود جای دهند.
    • ازنظر نمایش بیتی، (Object) null == (int) 0.
    • متغیرهای مستقل N برای یک روش در آخرین ثبات‌های N قاب فراخوانی روش به‌ترتیب قرار می‌گیرند. متغیرهای مستقل گسترده دو ثبات مصرف می‌کنند. مرجع this به‌عنوان اولین آرگومان به روش‌های نمونه ارسال می‌شود.
  • واحد ذخیره‌سازی در جریان دستورالعمل یک مقدار ۱۶ بیتی بدون علامت است. برخی‌از بیت‌ها در برخی‌از دستورالعمل‌ها نادیده گرفته می‌شوند / باید صفر باشند.
  • دستورالعمل‌ها بدون دلیل به نوع خاصی محدود نمی‌شوند. برای مثال، دستورالعمل‌هایی که مقادیر ثبات ۳۲ بیتی را بدون تفسیر منتقل می‌کنند لازم نیست مشخص کنند که آیا درحال انتقال اعداد صحیح هستند یا اعداد اعشاری.
  • مجموعه‌های ثابت جداگانه شماره‌گذاری‌شده و نمایه‌شده‌ای برای ارجاع به رشته‌ها، انواع، فیلدها، و روش‌ها وجود دارد.
  • داده‌های تحت‌اللفظی بیتی به‌صورت درون‌خطی در جاری‌سازی دستورالعمل نشان داده می‌شود.
  • زیرا در عمل، نیاز یک روش به بیش‌از ۱۶ ثبات غیرمعمول است، و ازآنجایی‌که نیاز به بیش‌از هشت ثبات معمولاً اتفاق می‌افتد، بسیاری از دستورالعمل‌ها به آدرس‌دهی فقط ۱۶ ثبات اول محدود می‌شوند. درصورت امکان معقول، دستورالعمل‌ها اجازه ارجاع به حداکثر ۲۵۶ ثبات اول را می‌دهند. علاوه‌براین، برخی‌از دستورالعمل‌ها دارای انواع مختلفی هستند که امکان شمارش ثبت‌های بسیار بزرگ‌تر را فراهم می‌کنند، ازجمله یک جفت دستورالعمل move که می‌توانند ثبت‌ها را در محدوده v0 – v65535 آدرس‌دهی کنند. در مواردی که نوع دستورالعمل برای رسیدگی به ثبات موردنظر دردسترس نیست، انتظار می‌رود که محتوای ثبات از ثبات اصلی به ثبات پایین (قبل‌از عملیات) و/یا از ثبات نتیجه پایین به ثبات بالا (بعداز عملیات) منتقل شود.
  • چندین «شبه‌دستورالعمل» وجود دارد که برای نگهداری بارداده‌های متغیر طول استفاده می‌شود، که توسط دستورالعمل‌های معمولی به آن‌ها ارجاع داده می‌شود (برای مثال، fill-array-data). چنین دستورالعمل‌هایی هرگز نباید درطول جریان عادی اجرا مواجه شوند. علاوه‌براین، دستورالعمل‌ها باید در جبران‌های بایت‌کد با شماره زوج (یعنی، تراز ۴ بایتی) قرار داشته باشند. برای برآورده کردن این الزام، ابزارهای تولید dex باید اگر چنین دستورالعملی درغیراین‌صورت ناهم‌تراز باشد، یک دستورالعمل nop اضافی به‌عنوان فاصله‌گذار منتشر کنند. درنهایت، اگرچه الزامی نیست، انتظار می‌رود که اکثر ابزارها این دستورالعمل‌ها را در انتهای روش‌ها صادر کنند، زیرا درغیراین‌صورت احتمالاً دستورالعمل‌های اضافی برای انشعاب در اطراف آن‌ها لازم خواهد بود.
  • وقتی در سیستم درحال اجرا نصب می‌شود، برخی‌از دستورالعمل‌ها ممکن است تغییر کنند و قالب آن‌ها به‌عنوان بهینه‌سازی پیونددهی ایستا در زمان نصب تغییر کند. این کار برای اجرای سریع‌تر پس‌از مشخص شدن پیوند انجام می‌شود. برای دیدن گونه‌های پیشنهادی، به سند قالب‌های دستورالعمل مرتبط مراجعه کنید. کلمه «پیشنهادی» با دقت استفاده شده است؛ اجرای این موارد اجباری نیست.
  • نحو انسانی و یادمان‌ها:
    • Dest-then-source ordering for arguments.
    • برخی‌از کدعمل‌ها دارای پسوند نام ابهام‌زدایی هستند تا نوع(های) عملیات را نشان دهند:
      • کدهای عملیاتی ۳۲ بیتی نوع عمومی بدون علامت هستند.
      • کدهای عملیاتی ۶۴ بیتی نوع-عمومی با -wide پسوندگذاری می‌شوند.
      • کدهای عملیاتی خاص نوع با نوع آن‌ها (یا مخفف مستقیم) پسوندگذاری می‌شوند، یکی از این موارد: -boolean -byte -char -short -int -long -float -double -object -string -class -void.
    • برخی‌از کدهای عملیاتی پسوند ابهام‌زدایی دارند تا عملیات‌های یکسان را که چیدمان‌ها یا گزینه‌های دستورالعمل متفاوتی دارند از یکدیگر متمایز کنند. این پسوندها با یک خط مورب («/») از نام‌های اصلی جدا می‌شوند و عمدتاً برای ایجاد یک نگاشت یک‌به‌یک با ثابت‌های ایستا در کدی که فایل‌های اجرایی را تولید و تفسیر می‌کند (یعنی برای کاهش ابهام برای انسان‌ها) وجود دارند.
    • در توضیحات اینجا، عرض یک مقدار (که مثلاً نشان‌دهنده محدوده یک ثابت یا تعداد ثبات‌هایی است که احتمالاً آدرس‌دهی شده‌اند) بااستفاده از یک نویسه برای هر چهار بیت عرض تأکید می‌شود.
    • برای مثال، در دستورالعمل «move-wide/from16 vAA, vBBBB»:
      • «move» کد عملیات پایه است که نشان‌دهنده عملیات پایه است (مقدار ثبات را جابه‌جا کنید).
      • «wide» پسوند نام است که نشان می‌دهد این تابع روی داده‌های پهن (۶۴ بیتی) عمل می‌کند.
      • «from16» پسوند کد عملیات است که نشان‌دهنده گونه‌ای است که مرجع ثبات ۱۶ بیتی به‌عنوان منبع دارد.
      • ‫«vAA» ثبات مقصد است (که با عملیات مشخص می‌شود؛ بازهم قانون این است که آرگومان‌های مقصد همیشه اول می‌آیند) که باید در محدوده v0 تا v255 باشد.
      • ‫«vBBBB» ثبت منبع است که باید در محدوده v0 تا v65535 باشد.
  • برای جزئیات بیشتر درباره قالب‌های مختلف دستورالعمل (فهرست‌شده در بخش «Op & Format») و همچنین جزئیات مربوط به نحو کد عملیات، به سند قالب‌های دستورالعمل مراجعه کنید.
  • برای جزئیات بیشتر درباره اینکه کدبایت در تصویر بزرگ‌تر چه جایگاهی دارد، به سند قالب فایل .dex مراجعه کنید.

خلاصه مجموعه بایت‌کد

عملگر و قالب یادآور / نحو آرگومان‌ها شرح
‫۰۰ ۱۰ برابر nop   چرخه‌های زباله.

توجه: دستورات شبه‌حامل داده با این کد عملیات برچسب‌گذاری می‌شوند، در این حالت بایت مرتبه بالای واحد کد عملیات ماهیت داده را نشان می‌دهد. «قالب packed-switch-payload»، «قالب sparse-switch-payload»، و «قالب fill-array-data-payload» را در زیر ببینید.

‫۰۱ ۱۲ برابر move vA, vB A: ثبات مقصد (۴ بیت)
B: ثبات منبع (۴ بیت)
محتوای یک ثبت غیرشیء را به ثبت دیگری منتقل کنید.
‫۰۲ ۲۲ برابر انتقال/از۱۶ vAA،‏ vBBBB A: ثبات مقصد (۸ بیت)
B: ثبات منبع (۱۶ بیت)
محتوای یک ثبت غیرشیء را به ثبت دیگری منتقل کنید.
‫۳۲ برابر ۰۳ انتقال/۱۶ vAAAA،‏ vBBBB A: ثبات مقصد (۱۶ بیت)
B: ثبات منبع (۱۶ بیت)
محتوای یک ثبت غیرشیء را به ثبت دیگری منتقل کنید.
‫۰۴ ۱۲ برابر انتقال-گسترده vA، vB جفت ثبت مقصد A: (۴ بیت)
جفت ثبت منبع B: (۴ بیت)
محتویات یک جفت ثبات را به جفت ثبات دیگری منتقل می‌کند.

توجه: انتقال از vN به vN-1 یا vN+1 قانونی است، بنابراین پیاده‌سازی‌ها باید به‌گونه‌ای تنظیم شوند که قبل‌از نوشتن هر چیزی، هر دو نیمه جفت ثبات خوانده شود.

‫۲۲×۰۵ move-wide/from16 vAA, vBBBB جفت ثبات مقصد A: (۸ بیت)
جفت ثبات منبع B: (۱۶ بیت)
محتویات یک جفت ثبات را به جفت ثبات دیگری منتقل می‌کند.

توجه: ملاحظات پیاده‌سازی همانند move-wide در بالا است.

‫۰۶ ۳۲ برابر move-wide/16 vAAAA, vBBBB جفت ثبات مقصد A: (۱۶ بیت)
جفت ثبات منبع B: (۱۶ بیت)
محتویات یک جفت ثبات را به جفت ثبات دیگری منتقل می‌کند.

توجه: ملاحظات پیاده‌سازی همانند move-wide در بالا است.

07 12x move-object vA, vB ثبت مقصد A: (۴ بیت)
ثبت منبع B: (۴ بیت)
محتوای یک ثبات حاوی شیء را به ثبات دیگری منتقل کنید.
‫۲۲×۸ move-object/from16 vAA, vBBBB ثبت مقصد A: (۸ بیت)
ثبت منبع B: (۱۶ بیت)
انتقال محتویات یک ثبت‌نام حامل شیء به ثبت‌نام حامل شیء دیگر.
09 32x move-object/16 vAAAA, vBBBB A: ثبات مقصد (۱۶ بیت)
B: ثبات منبع (۱۶ بیت)
محتوای یک ثبات حاوی شیء را به ثبات دیگری منتقل کنید.
‫0a 11x move-result vAA ثبات مقصد A: (۸ بیت) نتیجه تک‌کلمه‌ای غیرشیء از جدیدترین invoke-kind را به ثبات نشان‌داده‌شده منتقل کنید. این کار باید به‌عنوان دستورالعمل بلافاصله پس‌از invoke-kind که نتیجه (تک‌کلمه‌ای، غیرشیء) آن نباید نادیده گرفته شود انجام شود؛ در هر جای دیگری نامعتبر است.
0b 11x move-result-wide vAA جفت ثبات مقصد A: (۸ بیت) نتیجه دوکلمه‌ای جدیدترین invoke-kind را به جفت ثبات نشان‌داده‌شده منتقل کنید. این کار باید به‌عنوان دستورالعمل بلافاصله پس‌از invoke-kind که نتیجه (دوبل‌کلمه‌ای) آن نباید نادیده گرفته شود انجام شود؛ در هر جای دیگری نامعتبر است.
‫0c 11x move-result-object vAA ثبات مقصد A: (۸ بیت) نتیجه شیء جدیدترین invoke-kind را به ثبات مشخص‌شده منتقل می‌کند. این کار باید به‌عنوان دستورالعمل بلافاصله پس‌از invoke-kind یا filled-new-array که نتیجه (شیء) آن نباید نادیده گرفته شود انجام شود؛ هر جای دیگری نامعتبر است.
‫۰ روز ۱۱ بار انتقال-استثنا vAA ثبات مقصد A: (۸ بیت) استثنای اخیراً گرفته‌شده را در ثبات داده‌شده ذخیره کنید. این باید اولین دستورالعمل هر مدیریت‌کننده استثنایی باشد که استثنای گرفته‌شده آن نباید نادیده گرفته شود، و این دستورالعمل باید فقط همیشه به‌عنوان اولین دستورالعمل مدیریت‌کننده استثنایی رخ دهد؛ در هر جای دیگری نامعتبر است.
۰ در ۱۰ برگرداندن-باطل کردن   برگشت از روش void.
۰ از ۱۱ return vAA ثبات مقدار برگشتی A: (۸ بیت) از روش برگرداننده مقدار غیرشیئی تک‌عرضی (۳۲ بیتی) برمی‌گرداند.
‫۱۱×۱۰ return-wide vAA A: جفت ثبات مقدار برگشتی (۸ بیت) برگشت از روش مقدار برگشتی دوبرابر پهنا (۶۴ بیتی).
‫۱۱ ۱۱ برابر return-object vAA ثبات مقدار برگشتی A: (۸ بیت) از روشی که شیء برمی‌گرداند برگردید.
‫۱۲ ۱۱n const/4 vA, #+B ثبت مقصد A: (۴ بیت)
B: عدد صحیح علامت‌دار (۴ بیت)
مقدار تحت‌اللفظی داده‌شده (با علامت توسعه‌یافته به ۳۲ بیت) را به ثبات مشخص‌شده منتقل کنید.
‫۱۳ ۲۱ ثانیه const/16 vAA, #+BBBB A: ثبات مقصد (۸ بیت)
B: عدد صحیح علامت‌دار (۱۶ بیت)
مقدار تحت‌اللفظی داده‌شده (علامت گسترش‌یافته به ۳۲ بیت) را به ثبت‌کننده مشخص‌شده منتقل می‌کند.
‫۱۴ ۳۱i const vAA, #+BBBBBBBB ثبت مقصد A: (۸ بیت)
B: ثابت ۳۲ بیتی اختیاری
مقدار دقیق داده‌شده را به ثبات مشخص‌شده منتقل می‌کند.
۱۵ ۲۱ ساعت const/high16 vAA, #+BBBB0000 ثبت مقصد A: (۸ بیت)
B: عدد صحیح علامت‌دار (۱۶ بیت)
مقدار تحت‌اللفظی داده‌شده (که با صفر از راست تا ۳۲ بیت گسترش یافته است) را به ثبات مشخص‌شده منتقل می‌کند.
‫۱۶ ۲۱ ثانیه const-wide/16 vAA, #+BBBB ثبت مقصد A: (۸ بیت)
B: عدد صحیح علامت‌دار (۱۶ بیت)
مقدار تحت‌اللفظی داده‌شده (علامت گسترش‌یافته به ۶۴ بیت) را به جفت ثبات مشخص‌شده منتقل می‌کند.
17 31i const-wide/32 vAA, #+BBBBBBBB ثبت مقصد A: (۸ بیت)
B: عدد صحیح علامت‌دار (۳۲ بیت)
مقدار تحت‌اللفظی داده‌شده (با علامت توسعه‌یافته به ۶۴ بیت) را به جفت ثبات مشخص‌شده منتقل می‌کند.
۱۸ ۵۱ل const-wide vAA, #+BBBBBBBBBBBBBBBB A: ثبات مقصد (۸ بیت)
B: ثابت دلخواه با عرض دوبرابر (۶۴ بیت)
مقدار تحت‌اللفظی داده‌شده را به جفت ثبات مشخص‌شده منتقل می‌کند.
۱۹ ساعت ۲۱ دقیقه const-wide/high16 vAA, #+BBBB000000000000 A: ثبات مقصد (۸ بیت)
B: عدد صحیح علامت‌دار (۱۶ بیت)
مقدار حرفی داده‌شده (با صفر در سمت راست تا ۶۴ بیت گسترش‌یافته) را به جفت ثبات مشخص‌شده منتقل می‌کند.
1a 21c const-string vAA, string@BBBB ثبت مقصد A: (۸ بیت)
شاخص رشته B:
مرجعی را به رشته مشخص‌شده توسط نمایه داده‌شده به ثبات مشخص‌شده منتقل می‌کند.
‫1b 31c const-string/jumbo vAA, string@BBBBBBBB ثبت مقصد A: (۸ بیت)
شاخص رشته B:
مرجع را به رشته مشخص‌شده توسط نمایه داده‌شده به ثبات مشخص‌شده منتقل می‌کند.
1c 21c const-class vAA, type@BBBB A: ثبات مقصد (۸ بیت)
B: نمایه نوع
مرجع را به کلاس مشخص‌شده با نمایه داده‌شده به ثبات مشخص‌شده منتقل می‌کند. در مواردی که نوع نشان‌داده‌شده اولیه است، این ارجاعی به کلاس تباهیده نوع اولیه ذخیره می‌کند.
۱ روز ۱۱ بار monitor-enter vAA ثبات حامل مرجع A: (۸ بیت) مانیتور را برای شیء نشان‌داده‌شده به‌دست آورید.
‫‎1e 11x monitor-exit vAA A: ثبات مرجع‌دار (۸ بیت) مانیتور را برای شیء نشان‌داده‌شده رها کنید.

توجه: اگر این دستورالعمل نیاز به ایجاد استثنا دارد، باید این کار را به‌گونه‌ای انجام دهد که گویی رایانه قبلاً از دستورالعمل عبور کرده است. شاید مفید باشد که این را به‌عنوان اجرای موفقیت‌آمیز دستورالعمل (به‌نوعی) درنظر بگیرید، و استثنا پس‌از دستورالعمل اما قبل‌از اینکه دستورالعمل بعدی فرصت اجرا پیدا کند، پرتاب می‌شود. این تعریف امکان می‌دهد که یک روش از یک بلوک جامع پاک‌سازی پایشگر (برای نمونه، finally) به‌عنوان پاک‌سازی پایشگر برای خود آن بلوک استفاده کند، به‌عنوان راهی برای مدیریت استثناهای اختیاری که ممکن است به‌دلیل پیاده‌سازی تاریخی Thread.stop() ایجاد شوند، درحالی‌که همچنان بهداشت پایشگر مناسب را مدیریت می‌کند.

1f 21c check-cast vAA, type@BBBB ‫A: ثبات حامل مرجع (۸ بیت)
شاخص نوع B: (۱۶ بیت)
اگر مرجع در ثبات داده‌شده نتواند به نوع نشان‌داده‌شده تبدیل شود، ClassCastException پرتاب می‌شود.

توجه: ازآنجایی‌که A همیشه باید مرجع باشد (و نه مقدار اولیه)، اگر B به نوع اولیه اشاره کند، این کار در زمان اجرا قطعاً با خطا مواجه خواهد شد (یعنی استثنایی ایجاد خواهد کرد).

۲۰ تا ۲۲ درجه سانتی‌گراد instance-of vA،‏ vB،‏ type@CCCC ثبت مقصد A: (۴ بیت)
ثبت حامل مرجع B: (۴ بیت)
شاخص نوع C: (۱۶ بیت)
در ثبات مقصد ارائه‌شده 1 ذخیره می‌شود اگر مرجع نشان‌داده‌شده نمونه‌ای از نوع ارائه‌شده باشد، یا 0 اگر نباشد.

توجه: ازآنجایی‌که B همیشه باید مرجع باشد (و نه مقدار اولیه)، اگر C به نوع اولیه اشاره کند، همیشه منجر به ذخیره شدن 0 می‌شود.

21 12x آرایه-طول vA، vB ثبت مقصد A: (۴ بیت)
ثبت حامل مرجع آرایه B: (۴ بیت)
طول آرایه نشان‌داده‌شده را در ثبات مقصد داده‌شده، در ورودی‌ها ذخیره می‌کند
۲۲ ۲۱c new-instance vAA, type@BBBB ثبت مقصد A: (۸ بیت)
شاخص نوع B:
نمونه جدیدی از نوع نشان‌داده‌شده بسازید و مرجعی به آن در مقصد ذخیره کنید. نوع باید به کلاس غیرآرایه‌ای ارجاع دهد.
‫۲۳ ۲۲c new-array vA, vB, type@CCCC ثبت مقصد A: (۴ بیت)
ثبت اندازه B:
شاخص نوع C:
آرایه جدیدی از نوع و اندازه مشخص‌شده می‌سازد. نوع باید نوع آرایه باشد.
۲۴ ۳۵ پرشده-آرایه-جدید {vC, vD, vE, vF, vG}، نوع@BBBB اندازه آرایه A: و تعداد کلمات آرگومان (۴ بیت)
شاخص نوع B: (۱۶ بیت)
ثبات‌های آرگومان C..G: (هرکدام ۴ بیت)
آرایه‌ای از نوع و اندازه داده‌شده بسازید و آن را با محتوای ارائه‌شده پر کنید. نوع باید نوع آرایه باشد. محتوای آرایه باید تک‌کلمه‌ای باشد (یعنی آرایه‌ای از long یا double نباشد، اما انواع مرجع قابل‌قبول است). نمونه ساخته‌شده به‌عنوان «نتیجه» ذخیره می‌شود، همان‌طور که دستورالعمل‌های فراخوانی روش نتایج خود را ذخیره می‌کنند، بنابراین نمونه ساخته‌شده باید با دستورالعمل move-result-object بلافاصله بعدی به ثبات منتقل شود (اگر قرار است استفاده شود).
۲۵ ۳rc filled-new-array/range {vCCCC .. vNNNN}, type@BBBB اندازه آرایه A: و تعداد کلمات آرگومان (۸ بیت)
شاخص نوع B: (۱۶ بیت)
ثبات اولین آرگومان C: (۱۶ بیت)
N = A + C - 1
آرایه‌ای از نوع و اندازه داده‌شده بسازید و آن را با محتوای ارائه‌شده پر کنید. شفاف‌سازی‌ها و محدودیت‌ها همانند filled-new-array است که در بالا توضیح داده شد.
‫۲۶ ۳۱t fill-array-data vAA, +BBBBBBBB (با داده‌های تکمیلی همان‌طور که در زیر در «قالب fill-array-data-payload» مشخص شده است) مرجع آرایه A: (۸ بیت)
آفست «انشعاب» علامت‌دار B: به شبه‌دستور داده‌های جدول (۳۲ بیت)
آرایه داده‌شده را با داده‌های نشان‌داده‌شده پر کنید. مرجع باید به آرایه‌ای از عناصر پایه باشد و جدول داده باید ازنظر نوع با آن مطابقت داشته باشد و نباید حاوی عناصر بیشتری از آنچه در آرایه جا می‌شود باشد. یعنی، آرایه ممکن است بزرگ‌تر از جدول باشد، و اگر چنین باشد، فقط عناصر اولیه آرایه تنظیم می‌شوند و بقیه بدون تغییر باقی می‌مانند.
‫۲۷ ۱۱برابر پرتاب کردن vAA A: ثبت استثنا (۸ بیت)
استثنای نشان‌داده‌شده را درنظر بگیرید.
‫۲۸ ۱۰ تایی goto +AA آفست شاخه امضاشده A: (۸ بیت) بدون قیدوشرط به دستورالعمل نشان‌داده‌شده می‌پرد.

توجه: انحراف شاخه نباید 0 باشد. (یک حلقه چرخش ممکن است به‌صورت قانونی با goto/32 یا با گنجاندن nop به‌عنوان هدف قبل‌از شاخه ساخته شود.)

29 20t goto/16 +AAAA ‫A: انحراف شاخه امضاشده (۱۶ بیت)
بدون قیدوشرط به دستورالعمل نشان‌داده‌شده پرش کنید.

توجه: انحراف شاخه نباید 0 باشد. (یک حلقه چرخش ممکن است به‌صورت قانونی با goto/32 یا با گنجاندن nop به‌عنوان هدف قبل‌از شاخه ساخته شود.)

2a 30t goto/32 +AAAAAAAA ‫A: انحراف شاخه امضاشده (۳۲ بیت)
بدون قیدوشرط به دستورالعمل نشان‌داده‌شده پرش کنید.
‫۲ خوابه ۳۱ متری packed-switch vAA, +BBBBBBBB (با داده‌های تکمیلی طبق مشخصات زیر در «قالب packed-switch-payload») برای آزمایش A: ثبت کنید
‫B: افست «شاخه» را به شبه‌دستور داده‌های جدول امضا کرد (۳۲ بیت)
بااستفاده از جدولی از فاصله‌های متناظر با هر مقدار در یک محدوده صحیح خاص، براساس مقدار موجود در ثبات داده‌شده به دستورالعمل جدیدی می‌پرد، یا اگر هیچ تطابقی وجود نداشته باشد، به دستورالعمل بعدی می‌رود.
‫۲ ثانیه ۳۱ تیک sparse-switch vAA, +BBBBBBBB (با داده‌های تکمیلی به‌صورت مشخص‌شده در زیر در «قالب sparse-switch-payload») برای آزمایش A: ثبت کنید
‫B: افست «شاخه» را به شبه‌دستور داده‌های جدول امضا کرد (۳۲ بیت)
براساس مقدار موجود در ثبات داده‌شده، بااستفاده از جدول مرتب جفت‌های مقدار-آفست، به دستورالعمل جدیدی می‌پرد، یا اگر مطابقت وجود نداشته باشد، به دستورالعمل بعدی می‌رود.
۲ تا ۳۱، ۲۳ بار cmpkind vAA،‏ vBB،‏ vCC
‫2d: cmpl-float (گرایش lt)
‫2e: cmpg-float (گرایش gt)
‫2f: cmpl-double (گرایش lt)
‫30: cmpg-double (گرایش gt)
‫31: cmp-long
ثبت مقصد A: (۸ بیت)
B: ثبت یا جفت منبع اول
C: ثبت یا جفت منبع دوم
مقایسه ممیز شناور یا long نشان‌داده‌شده را انجام دهید، a را روی 0 تنظیم کنید اگر b == c، 1 اگر b > c، یا -1 اگر b < c. «انحراف» فهرست‌شده برای عملیات ممیز شناور نشان می‌دهد که مقایسه‌ها چگونه NaN می‌شوند: دستورالعمل‌های «انحراف بزرگ‌تر از» برای مقایسه‌های NaN، مقدار 1 را برمی‌گردانند، و دستورالعمل‌های «انحراف کوچک‌تر از» مقدار -1 را برمی‌گردانند.

برای مثال، برای بررسی اینکه آیا نقطه شناور x < y بهتر است از cmpg-float استفاده کنید؛ نتیجه -1 نشان می‌دهد که آزمایش درست بوده است و مقادیر دیگر نشان می‌دهد که آزمایش نادرست بوده است، چه به‌دلیل مقایسه معتبر و چه به‌دلیل اینکه یکی از مقادیر NaN بوده است.

‫۳۲..۳۷ ۲۲ت if-test vA, vB, +CCCC
32: if-eq
33: if-ne
34: if-lt
35: if-ge
36: if-gt
37: if-le
A: اولین ثبات برای آزمایش (۴ بیت)
B: دومین ثبات برای آزمایش (۴ بیت)
C: انحراف شاخه علامت‌دار (۱۶ بیت)
اگر مقادیر دو ثبات داده‌شده طبق مشخصات مقایسه شوند، به مقصد داده‌شده منشعب می‌شود.

توجه: انحراف شاخه نباید 0 باشد. (یک حلقه چرخش ممکن است به‌صورت قانونی با شاخه‌بندی حول یک goto به عقب یا با گنجاندن یک nop به‌عنوان هدف قبل‌از شاخه ساخته شود.)

38..3d 21t if-testz vAA, +BBBB
‫۳۸: if-eqz
‫۳۹: if-nez
‫۳a: if-ltz
‫۳b: if-gez
‫۳c: if-gtz
‫۳d: if-lez
A: برای آزمایش ثبت کنید (۸ بیت)
B: انحراف شاخه امضاشده (۱۶ بیت)
اگر مقدار ثبات داده‌شده با ۰ مقایسه شود و همان‌طور که مشخص شده است شاخه به مقصد داده‌شده برود.

توجه: انحراف شاخه نباید 0 باشد. (یک حلقه چرخش ممکن است به‌صورت قانونی با شاخه‌بندی حول یک goto به عقب یا با گنجاندن یک nop به‌عنوان هدف قبل‌از شاخه ساخته شود.)

۳ تا ۴۳ ۱۰ برابر (استفاده‌نشده)   (استفاده‌نشده)
‫۴۴..۵۱ ۲۳ برابر 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:؛ می‌تواند منبع یا مقصد باشد (۸ بیت)
ثبت آرایه B: (۸ بیت)
ثبت شاخص C: (۸ بیت)
عملیات آرایه شناسایی‌شده را در نمایه شناسایی‌شده آرایه داده‌شده انجام دهید، و در ثبت‌کننده مقدار بارگیری یا ذخیره کنید.
‫۵۲..۵f 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:؛ می‌تواند منبع یا مقصد باشد (۴ بیت)
ثبت شیء B: (۴ بیت)
شاخص مرجع فیلد نمونه C: (۱۶ بیت)
عملیات فیلد نمونه شیء شناسایی‌شده را با فیلد شناسایی‌شده انجام دهید و در ثبات مقدار بارگیری یا ذخیره کنید.

توجه: این کدعمل‌ها نامزدهای مناسبی برای پیونددهی ایستا هستند، با تغییر آرگومان فیلد به یک افست مستقیم‌تر.

60..6d 21c sstaticop vAA, field@BBBB
‫۶۰: sget
‫۶۱: sget-wide
‫۶۲: sget-object
‫۶۳: sget-boolean
‫۶۴: sget-byte
‫۶۵: sget-char
‫۶۶: sget-short
‫۶۷: sput
‫۶۸: sput-wide
‫۶۹: sput-object
‫۶a: sput-boolean
‫۶b: sput-byte
‫۶c: sput-char
‫۶d: sput-short
A: ثبت یا جفت کردن مقدار؛ ممکن است منبع یا مقصد باشد (۸ بیت)
B: نمایه مرجع فیلد ایستا (۱۶ بیت)
عملیات فیلد ایستا شیء شناسایی‌شده را با فیلد ایستای شناسایی‌شده انجام دهید و آن را در ثبات مقدار بار کنید یا ذخیره کنید.

توجه: این کدعمل‌ها نامزدهای مناسبی برای پیونددهی ایستا هستند، با تغییر آرگومان فیلد به یک افست مستقیم‌تر.

‫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: آرگومان (۴ بیت)
شاخص مرجع روش B: (۱۶ بیت)
ثبات‌های آرگومان C..G: (هرکدام ۴ بیت)
روش نشان‌داده‌شده را فراخوانی کنید. نتیجه (درصورت وجود) ممکن است با یک گونه مناسب move-result* به‌عنوان دستورالعمل بلافاصله بعدی ذخیره شود.

از invoke-virtual برای فراخوانی روش مجازی معمولی استفاده می‌شود که روشی است که static، private، یا سازنده نیست.

وقتی method_id به روشی از کلاس غیرمیانای ارجاع می‌دهد، از invoke-super برای فراخوانی نزدیک‌ترین روش مجازی کلاس برتر استفاده می‌شود (برخلاف روشی که همان method_id را در کلاس فراخواننده دارد). همان محدودیت‌های روش برای invoke-virtual اعمال می‌شود.

در فایل‌های Dex نسخه 037 یا جدیدتر، اگر 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 (استفاده‌نشده)   (استفاده‌نشده)
‫۷۴..۷۸ ۳rc فراخوانی-نوع/محدوده {vCCCC .. vNNNN}, meth@BBBB
‫۷۴: فراخوانی-مجازی/محدوده
‫۷۵: فراخوانی-فوق/محدوده
‫۷۶: فراخوانی-مستقیم/محدوده
‫۷۷: فراخوانی-ایستا/محدوده
‫۷۸: فراخوانی-میانای/محدوده
تعداد کلمات آرگومان A: (۸ بیت)
شاخص مرجع روش B: (۱۶ بیت)
ثبت‌کننده اولین آرگومان C: (۱۶ بیت)
N = A + C - 1
روش نشان‌داده‌شده را فراخوانی کنید. برای جزئیات، هشدارها، و پیشنهادها، اولین invoke-kind شرح بالا را ببینید.
‫79..7a 10x (استفاده‌نشده)   (استفاده‌نشده)
‫۷ تا ۸ فرنگی ۱۲ بار 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: (۴ بیت)
ثبت یا جفت منبع B: (۴ بیت)
عملیات یکتایی مشخص‌شده را روی ثبات منبع انجام دهید، و نتیجه را در ثبات مقصد ذخیره کنید.
‫۹۰..اف ۲۳ برابر binop vAA, vBB, vCC
‫۹۰: add-int
‫۹۱: sub-int
‫۹۲: mul-int
‫۹۳: div-int
‫۹۴: rem-int
‫۹۵: and-int
‫۹۶: or-int
‫۹۷: xor-int
‫۹۸: shl-int
‫۹۹: shr-int
‫۹a: ushr-int
‫۹b: add-long
‫۹c: sub-long
‫۹d: mul-long
‫۹e: div-long
‫۹f: 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: (۸ بیت)
ثبت یا جفت‌سازی منبع اول B: (۸ بیت)
ثبت یا جفت‌سازی منبع دوم C: (۸ بیت)
عملکرد عملیات دودویی شناسایی‌شده روی دو ثبات منبع، ذخیره نتیجه در ثبات مقصد.

توجه: برخلاف دیگر عملیات‌های ریاضی -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: و منبع اول (۴ بیت)
ثبت یا جفت کردن منبع دوم B: (۴ بیت)
عملیات دودویی شناسایی‌شده را روی دو ثبات منبع انجام دهید، نتیجه را در اولین ثبات منبع ذخیره کنید.

توجه: برخلاف دیگر -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 (reverse subtract)
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: ثبات مقصد (۴ بیت)
B: ثبات منبع (۴ بیت)
C: ثابت عدد صحیح علامت‌دار (۱۶ بیت)
عملیات دودویی نشان‌داده‌شده را روی ثبات نشان‌داده‌شده (آرگومان اول) و مقدار دقیق (آرگومان دوم) انجام می‌دهد و نتیجه را در ثبات مقصد ذخیره می‌کند.

توجه: 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: ثبات مقصد (۸ بیت)
B: ثبات منبع (۸ بیت)
C: ثابت عدد صحیح علامت‌دار (۸ بیت)
عملگر دودویی نشان‌داده‌شده را روی ثبات نشان‌داده‌شده (اولین آرگومان) و مقدار ثابت (دومین آرگومان) اجرا کنید و نتیجه را در ثبات مقصد ذخیره کنید.

توجه: برای جزئیات بیشتر درباره معناشناسی rsub-int، بخش زیر را ببینید.

e3..f9 10x (استفاده‌نشده)   (استفاده‌نشده)
fa 45cc invoke-polymorphic {vC, vD, vE, vF, vG}, meth@BBBB, proto@HHHH تعداد کلمات آرگومان A: (۴ بیت)
شاخص مرجع روش B: (۱۶ بیت)
گیرنده C: (۴ بیت)
ثبات‌های آرگومان D..G: (هرکدام ۴ بیت)
شاخص مرجع پیش‌نمونه H: (۱۶ بیت)
روش چندریختی امضای نشان‌داده‌شده را فراخوانی کنید. نتیجه (درصورت وجود) ممکن است با یک گونه مناسب move-result* به‌عنوان دستورالعمل بلافاصله بعدی ذخیره شود.

مرجع روش باید به روش چندریختی امضا، مانند java.lang.invoke.MethodHandle.invoke یا java.lang.invoke.MethodHandle.invokeExact باشد.

گیرنده باید شیئی باشد که از روش چندریختی امضای فراخوانده‌شده پشتیبانی کند.

مرجع پیش‌نمونه انواع آرگومان‌های ارائه‌شده و نوع برگشتی موردانتظار را توصیف می‌کند.

وقتی invoke-polymorphic بایت‌کد اجرا می‌شود، ممکن است استثناهایی ایجاد کند. استثناها در مستندات API برای روش چندریختی امضای فراخوانده‌شده شرح داده شده است.

در فایل‌های Dex از نسخه 038 به بعد وجود دارد.
fb 4rcc invoke-polymorphic/range {vCCCC .. vNNNN}, meth@BBBB, proto@HHHH تعداد کلمات آرگومان A: (۸ بیت)
شاخص مرجع روش B: (۱۶ بیت)
گیرنده C: (۱۶ بیت)
شاخص مرجع پیش‌نمونه H: (۱۶ بیت)
N = A + C - 1
دستگیره روش نشان‌داده‌شده را فراخوانی کنید. برای جزئیات،invoke-polymorphic توضیحات بالا را ببینید.

از نسخه 038 به بعد در فایل‌های Dex وجود دارد.
fc 35c invoke-custom {vC, vD, vE, vF, vG}, call_site@BBBB تعداد کلمات آرگومان A: (۴ بیت)
B: شاخص مرجع سایت تماس (۱۶ بیت)
ثبت‌کننده‌های آرگومان C..G: (هرکدام ۴ بیت)
سایت تماس نشان‌داده‌شده را حل‌وفصل و فراخوانی می‌کند. نتیجه فراخوانی (درصورت وجود) ممکن است با یک گونه 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 مطرح می‌شود:
  • روش پیونددهنده bootstrap نمی‌تواند نمونه java.lang.invoke.CallSite را برگرداند.
  • ‫java.lang.invoke.CallSite برگشتی دارای هدف کنترل روش null است.
  • هدف دسته روش از نوع درخواستی نیست.
از نسخه 038 به بعد در فایل‌های Dex وجود دارد.
fd 3rc invoke-custom/range {vCCCC .. vNNNN}, call_site@BBBB تعداد کلمات آرگومان A: (۸ بیت)
شاخص مرجع سایت تماس B: (۱۶ بیت)
ثبت آرگومان اول C: (۱۶ بیت)
N = A + C - 1
سایت تماس را حل‌وفصل و فراخوانی کنید. برای جزئیات،invoke-custom توضیحات بالا را ببینید.

در فایل‌های Dex از نسخه 038 به بعد وجود دارد.
fe 21c const-method-handle vAA, method_handle@BBBB A: ثبات مقصد (۸ بیت)
B: نمایه دسته روش (۱۶ بیت)
مرجع را به دستگیره روش مشخص‌شده توسط نمایه داده‌شده به ثبات مشخص‌شده منتقل کنید.

از نسخه 039 به بعد در فایل‌های Dex وجود دارد.
ff 21c const-method-type vAA, proto@BBBB ثبت مقصد A: (۸ بیت)
مرجع پیش‌نمونه روش B: (۱۶ بیت)
مرجع را به نمونه اولیه روش مشخص‌شده با نمایه داده‌شده به ثبات مشخص‌شده منتقل می‌کند.

از نسخه 039 به بعد در فایل‌های Dex وجود دارد.

قالب packed-switch-payload

نام قالب شرح
ident ushort = 0x0100 درحال شناسایی شبه‌کد عملیاتی
اندازه ushort تعداد ورودی‌ها در جدول
کلید اول قطع توپ اولین (و پایین‌ترین) مقدار مورد تعویض
هدف‌ها 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;
مکمل یک‌تایی.
منفی-طولانی int64 a;
int64 result = -a;
مکمل دو یگانی.
کوتاه int64 a;
int64 result = ~a;
مکمل یک‌تایی.
neg-float float a;
float result = -a;
نفی نقطه شناور.
منفی-دوبرابر double a;
double result = -a;
نفی نقطه شناور.
int-to-long int32 a;
int64 result = (int64) a;
تمدید int32 تا int64 را امضا کنید.
عدد صحیح به شناور 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 a;
int64 result = (int64) a;
تبدیل float به int64، بااستفاده از گرد کردن به‌سمت صفر. قوانین مورد خاص مشابه با float-to-int در اینجا اعمال می‌شود، با این تفاوت که مقادیر خارج از محدوده بسته به علامت به 0x7fffffffffffffff یا -0x8000000000000000 تبدیل می‌شوند.
تبدیل شناور به دوبرابر 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 a;
float result = (float) a;
تبدیل double به float، بااستفاده از گرد کردن به نزدیک‌ترین عدد. این کار باعث می‌شود دقت برخی‌از مقادیر ازبین برود.
int-to-byte int32 a;
int32 result = (a << 24) >> 24;
کوته‌سازی int32 به int8، علامت گسترش نتیجه.
عدد به نویسه int32 a;
int32 result = a & 0xffff;
کوتاه کردن int32 به uint16، بدون افزونه علامت.
عدد صحیح به کوتاه int32 a;
int32 result = (a << 16) >> 16;
کوته‌سازی int32 به int16، علامت گسترش نتیجه.
افزودن-عدد صحیح int32 a, b;
int32 result = a + b;
افزودن مکمل دو.
زیرمجموعه 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;
تقسیم مکمل دو، گردشده به‌سمت صفر (یعنی، کوتاه شده به عدد صحیح). اگر b == 0، این کار ArithmeticException را پرتاب می‌کند.
rem-int int32 a, b;
int32 result = a % b;
باقیمانده مکمل دو پس‌از تقسیم. علامت نتیجه همان علامت a است و دقیق‌تر به‌صورت result == a - (a / b) * b تعریف می‌شود. اگر b == 0 باشد، این تابع ArithmeticException را برمی‌گرداند.
و-صحیح int32 a, b;
int32 result = a & b;
«و» بیتی.
or-int int32 a, b;
int32 result = a | b;
«یا» بیتی.
xor-int int32 a, b;
int32 result = a ^ b;
«یا انحصاری» بیتی.
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);
انتقال بدون علامت بیتی به راست (با آرگومان پوشانده‌شده).
افزودن-طولانی 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;
تقسیم مکمل دو، گردشده به‌سمت صفر (یعنی، به عدد صحیح کوچک می‌شود). اگر b == 0 باشد، این ArithmeticException را برمی‌گرداند.
rem-long int64 a, b;
int64 result = a % b;
باقیمانده مکمل دو پس‌از تقسیم. علامت نتیجه همان علامت a است و دقیق‌تر به‌صورت result == a - (a / b) * b تعریف می‌شود. اگر b == 0 باشد، این تابع ArithmeticException را برمی‌گرداند.
و طولانی int64 a, b;
int64 result = a & b;
«و» بیتی.
یا طولانی int64 a, b;
int64 result = a | b;
«یا» بیتی.
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;
افزودن نقطه شناور.
زیرشناور 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 تعریف می‌شود.
افزودن-دوبرابر 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 تعریف می‌شود.