فرمت بایت کد Dalvik

طراحی کلی

  • مدل ماشین و قراردادهای فراخوانی تقریباً تقلید از معماری های واقعی رایج و قراردادهای فراخوانی سبک C است:
    • این دستگاه مبتنی بر رجیستر است و اندازه فریم ها در زمان ایجاد ثابت می شود. هر فریم شامل تعداد خاصی از ثبات ها (مشخص شده توسط روش) و همچنین داده های اضافی مورد نیاز برای اجرای متد است، مانند شمارنده برنامه (اما نه محدود به) و یک مرجع به فایل .dex که حاوی متد است. .
    • هنگامی که برای مقادیر بیت (مانند اعداد صحیح و اعداد ممیز شناور) استفاده می شود، رجیسترها با عرض 32 بیت در نظر گرفته می شوند. جفت های ثبت مجاور برای مقادیر 64 بیتی استفاده می شوند. برای جفت های ثبت نیازی به تراز وجود ندارد.
    • هنگامی که برای ارجاعات شیء استفاده می شود، رجیسترها به اندازه کافی گسترده در نظر گرفته می شوند که دقیقاً یک چنین مرجع را در خود جای دهند.
    • از نظر نمایش بیتی، (Object) null == (int) 0 .
    • آرگومان های N به ترتیب در آخرین N ثبات فریم فراخوانی متد قرار می گیرند. آرگومان های گسترده دو ثبات را مصرف می کنند. متدهای نمونه با this مرجع به عنوان اولین آرگومان ارسال می شوند.
  • واحد ذخیره سازی در جریان دستورالعمل یک مقدار 16 بیتی بدون علامت است. برخی از بیت ها در برخی دستورالعمل ها نادیده گرفته می شوند / باید صفر باشند.
  • دستورالعمل ها به طور رایگان به نوع خاصی محدود نمی شوند. برای مثال، دستورالعمل‌هایی که مقادیر رجیستر 32 بیتی را بدون تفسیر جابه‌جا می‌کنند، لازم نیست مشخص کنند که آیا در حال حرکت هستند یا شناور.
  • برای ارجاع به رشته ها، انواع، فیلدها و متدها، مجموعه های ثابت شمارش شده و نمایه شده جداگانه وجود دارد.
  • داده های تحت اللفظی بیتی به صورت خطی در جریان دستورالعمل نشان داده می شوند.
  • از آنجا که، در عمل، غیرمعمول است که یک روش به بیش از 16 ثبات نیاز داشته باشد، و از آنجا که نیاز به بیش از هشت رجیستر به طور منطقی رایج است ، بسیاری از دستورالعمل ها تنها به آدرس دادن به 16 ثبات اول محدود می شوند. در صورت امکان، دستورالعمل ها به حداکثر 256 ثبت اول اجازه ارجاع می دهند. به‌علاوه، برخی دستورالعمل‌ها دارای انواعی هستند که تعداد ثبت‌های بسیار بزرگ‌تری را امکان‌پذیر می‌سازند، از جمله یک جفت دستورالعمل move که می‌توانند رجیسترها را در محدوده v0v65535 آدرس‌دهی کنند. در مواردی که یک نوع دستورالعمل برای آدرس دادن به یک ثبات مورد نظر در دسترس نیست، انتظار می رود که محتویات ثبات از ثبات اصلی به یک ثبات پایین (قبل از عملیات) و/یا از یک ثبات نتیجه کم به یک ثبات بالا منتقل شوند. ثبت نام (بعد از عملیات).
  • چندین "شبه دستورالعمل" وجود دارد که برای نگهداری بارهای داده با طول متغیر استفاده می شود، که با دستورالعمل های معمولی به آنها اشاره می شود (به عنوان مثال، fill-array-data ). چنین دستوراتی هرگز نباید در طول جریان عادی اجرا با آنها مواجه شد. علاوه بر این، دستورالعمل‌ها باید روی آفست‌های بایت کد زوج با شماره (یعنی تراز ۴ بایتی) قرار گیرند. برای برآورده کردن این نیاز، ابزارهای تولید dex باید یک دستور nop اضافی را به عنوان فاصله‌گذار منتشر کنند، در صورتی که در غیر این صورت، چنین دستورالعملی ناهمتراز باشد. در نهایت، اگرچه لازم نیست، انتظار می‌رود که اکثر ابزارها این دستورالعمل‌ها را در انتهای روش‌ها منتشر کنند، زیرا در غیر این صورت احتمالاً به دستورالعمل‌های اضافی برای انشعاب در اطراف آنها نیاز است.
  • هنگامی که بر روی یک سیستم در حال اجرا نصب می شود، ممکن است برخی از دستورالعمل ها تغییر کرده و قالب آنها را به عنوان یک بهینه سازی پیوند ثابت زمان نصب تغییر دهند. این برای اجازه اجرای سریعتر پس از مشخص شدن پیوند است. برای انواع پیشنهادی، به سند فرمت‌های دستورالعمل مرتبط مراجعه کنید. کلمه "پیشنهاد شده" به طور توصیه شده استفاده می شود. اجرای این موارد اجباری نیست.
  • نحو انسانی و یادگاری:
    • سفارش آرگومان‌ها را Dest-سپس منبع.
    • برخی از کدهای عملیاتی دارای پسوند نامی ابهام‌کننده برای نشان دادن نوع(های)ی هستند که روی آنها کار می‌کنند:
      • کدهای نوع عمومی 32 بیتی بدون علامت هستند.
      • کدهای نوع عمومی 64 بیتی با پسوند -wide اضافه می شوند.
      • کدهای نوع خاص با نوع خود (یا یک مخفف ساده) پسوند می‌شوند، یکی از موارد زیر: -boolean -byte -char -short -int -long -float -double -object -string -class -void .
    • برخی از کدهای عملیاتی دارای پسوند ابهام‌زدایی برای تشخیص عملیات مشابه هستند که دارای طرح‌بندی دستورالعمل‌ها یا گزینه‌های متفاوتی هستند. این پسوندها با اسلش (" / ") از نام های اصلی جدا می شوند و عمدتاً وجود دارند تا نگاشت یک به یک با ثابت های ثابت در کد وجود داشته باشد که فایل های اجرایی را تولید و تفسیر می کند (یعنی برای کاهش ابهام). برای انسان).
    • در توضیحات اینجا، عرض یک مقدار (نشان دهنده، به عنوان مثال، محدوده یک ثابت یا تعداد رجیسترهایی که احتمالا آدرس داده شده است) با استفاده از یک کاراکتر در هر چهار بیت عرض تاکید می شود.
    • به عنوان مثال، در دستورالعمل " move-wide/from16 vAA, vBBBB ":
      • " move " اپکد پایه است که عملیات پایه را نشان می دهد (حرکت مقدار ثبات).
      • " wide " پسوند نامی است که نشان می دهد بر روی داده های گسترده (64 بیتی) کار می کند.
      • " from16 " پسوند opcode است که نشان‌دهنده گونه‌ای است که مرجع ثبت 16 بیتی به عنوان منبع دارد.
      • " vAA " رجیستر مقصد است (که توسط عملیات مشخص می شود؛ دوباره، قانون این است که آرگومان های مقصد همیشه اول هستند)، که باید در محدوده v0v255 باشد.
      • " vBBBB " ثبت منبع است که باید در محدوده v0v65535 باشد.
  • برای جزئیات بیشتر در مورد فرمت‌های دستورالعمل‌های مختلف (در فهرست «Op & Format») و همچنین جزئیات مربوط به نحو opcode، به سند فرمت‌های دستورالعمل مراجعه کنید.
  • برای جزئیات بیشتر درباره محل قرار گرفتن بایت کد در تصویر بزرگتر، به سند فرمت فایل .dex مراجعه کنید.

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

عملیات و قالب یادگاری / نحو استدلال ها شرح
00 10 برابر نه چرخه زباله

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

01 12x حرکت vA، vB A: ثبت مقصد (4 بیت)
B: ثبت منبع (4 بیت)
محتویات یک ثبات غیر شی را به دیگری منتقل کنید.
02 22x حرکت/از 16 vAA، vBBBB A: ثبت مقصد (8 بیت)
B: ثبت منبع (16 بیت)
محتویات یک ثبات غیر شی را به دیگری منتقل کنید.
03 32x move/16 vAAAA، vBBBB A: ثبت مقصد (16 بیت)
B: ثبت منبع (16 بیت)
محتویات یک ثبات غیر شی را به دیگری منتقل کنید.
04 12x حرکت گسترده vA، vB A: جفت ثبت مقصد (4 بیت)
B: جفت ثبت منبع (4 بیت)
محتویات یک جفت ثبات را به جفت دیگر منتقل کنید.

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

05 22x حرکت گسترده/از 16 vAA، vBBBB A: جفت ثبت مقصد (8 بیت)
B: جفت ثبت منبع (16 بیت)
محتویات یک جفت ثبات را به جفت دیگر منتقل کنید.

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

06 32x حرکت گسترده/16 vAAAA، vBBBB A: جفت ثبت مقصد (16 بیت)
B: جفت ثبت منبع (16 بیت)
محتویات یک جفت ثبات را به جفت دیگر منتقل کنید.

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

07 12x حرکت شی 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 حرکت نتیجه vAA A: ثبت مقصد (8 بیت) نتیجه غیر شیء تک کلمه ای جدیدترین invoke- kind به رجیستر مشخص شده منتقل کنید. این باید به عنوان دستورالعمل بلافاصله پس از invoke- kind انجام شود که نتیجه آن (تک کلمه، غیر شی) نادیده گرفته شود. هر جای دیگری نامعتبر است
0b 11x حرکت - نتیجه - گسترده vAA A: جفت ثبت مقصد (8 بیت) نتیجه دو کلمه ای جدیدترین invoke- kind را به جفت ثبات نشان داده شده منتقل کنید. این باید به عنوان دستورالعمل بلافاصله پس از invoke- kind انجام شود که نتیجه (دو کلمه ای) آن نباید نادیده گرفته شود. هر جای دیگری نامعتبر است
0c 11x حرکت - نتیجه - شی vAA A: ثبت مقصد (8 بیت) نتیجه شیء جدیدترین invoke- kind به رجیستر مشخص شده منتقل کنید. این باید به عنوان دستورالعمل بلافاصله پس از یک آرایه invoke- kind یا filled-new-array انجام شود که نتیجه (شیء) نباید نادیده گرفته شود. هر جای دیگری نامعتبر است
0d 11x حرکت استثنایی vAA A: ثبت مقصد (8 بیت) یک استثنای تازه کشف شده را در رجیستر داده شده ذخیره کنید. این باید اولین دستورالعمل هر کنترل کننده استثنایی باشد که استثنای کشف شده آن نباید نادیده گرفته شود، و این دستورالعمل فقط باید به عنوان اولین دستورالعمل یک کنترل کننده استثنا باشد. هر جای دیگری نامعتبر است
0e 10x بازگشت-باطل بازگشت از یک روش void
0f 11x بازگشت vAA A: ثبت ارزش بازگشتی (8 بیت) برگرداندن از یک روش بازگردان ارزش غیر شی با عرض (32 بیت).
10 11x vAA گسترده بازگشت A: جفت ثبت ارزش بازگشتی (8 بیت) بازگشت از یک روش بازگردان ارزش دو عرض (64 بیتی).
11 11x بازگشت - شی vAA A: ثبت ارزش بازگشتی (8 بیت) بازگشت از روش بازگشت شی.
12 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 لیتر به طور گسترده vAA، #+BBBBBBBBBBBBBBBBB A: ثبت مقصد (8 بیت)
B: ثابت دلخواه دو عرض (64 بیتی).
مقدار تحت اللفظی داده شده را به جفت ثبت مشخص شده منتقل کنید.
19 ساعت 21 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 vAA، type@BBBB A: ثبت مقصد (8 بیت)
B: شاخص نوع
یک مرجع را به کلاس مشخص شده توسط ایندکس داده شده در ثبات مشخص شده منتقل کنید. در مواردی که نوع مشخص شده اولیه باشد، این یک مرجع به کلاس degenerate نوع اولیه ذخیره می کند.
1d 11x مانیتور - vAA را وارد کنید A: ثبات مرجع (8 بیت) مانیتور را برای شی مشخص شده بدست آورید.
1e 11x مانیتور-خروج vAA A: ثبات مرجع (8 بیت) مانیتور را برای شی مشخص شده رها کنید.

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

1f 21c چک کردن vAA، نوع@BBBB A: ثبات مرجع (8 بیت)
B: نوع شاخص (16 بیت)
اگر مرجع موجود در ثبات داده شده نمی تواند به نوع مشخص شده ارسال شود، یک ClassCastException پرتاب کنید.

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

20 22c نمونه vA، vB، type@CCCC A: ثبت مقصد (4 بیت)
B: رجیستر دارای مرجع (4 بیت)
C: نوع شاخص (16 بیت)
اگر مرجع مشخص شده نمونه ای از نوع داده شده است، 1 در ثبات مقصد داده شده ذخیره کنید، یا اگر نه، 0 ذخیره کنید.

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

21 12x طول آرایه vA، vB A: ثبت مقصد (4 بیت)
B: رجیستر ارجاع آرایه (4 بیت)
طول آرایه مشخص شده را در ورودی ها در مقصد داده شده ذخیره کنید
22 21c نمونه جدید vAA، نوع@BBBB A: ثبت مقصد (8 بیت)
B: شاخص نوع
یک نمونه جدید از نوع مشخص شده بسازید و یک مرجع به آن در مقصد ذخیره کنید. نوع باید به یک کلاس غیر آرایه اشاره داشته باشد.
23 22c آرایه جدید vA، vB، type@CCCC A: ثبت مقصد (4 بیت)
B: ثبت اندازه
C: شاخص نوع
یک آرایه جدید با نوع و اندازه مشخص شده بسازید. نوع باید از نوع آرایه باشد.
24 35c آرایه پرشده-جدید {vC، vD، vE، vF، vG}، type@BBBB A: اندازه آرایه و تعداد کلمات آرگومان (4 بیت)
B: نوع شاخص (16 بیت)
C..G: رجیسترهای آرگومان (هر کدام 4 بیت)
آرایه ای با نوع و اندازه داده شده بسازید و آن را با محتویات ارائه شده پر کنید. نوع باید از نوع آرایه باشد. محتویات آرایه باید تک کلمه ای باشد (یعنی آرایه های long یا double وجود ندارد، اما انواع مرجع قابل قبول هستند). نمونه ساخته شده به عنوان "نتیجه" ذخیره می شود به همان روشی که دستورالعمل های فراخوانی متد نتایج خود را ذخیره می کند، بنابراین نمونه ساخته شده باید با یک دستور move-result-object بلافاصله بعدی به یک ثبات منتقل شود (اگر قرار است از آن استفاده شود. ).
25 3rc پرشده-جدید-آرایه/محدوده {vCCCC .. vNNNN}، نوع@BBBB A: اندازه آرایه و تعداد کلمات آرگومان (8 بیت)
B: نوع شاخص (16 بیت)
C: ثبت آرگومان اول (16 بیت)
N = A + C - 1
آرایه ای با نوع و اندازه داده شده بسازید و آن را با محتویات ارائه شده پر کنید. توضیح‌ها و محدودیت‌ها همان filled-new-array هستند که در بالا توضیح داده شد.
26 31 تن fill-array-data vAA، +BBBBBBBB (با داده‌های تکمیلی همانطور که در زیر در "فرمت fill-array-data-payload " مشخص شده است) A: مرجع آرایه (8 بیت)
B: "شاخه" امضا شده به شبه دستورالعمل آفست به داده های جدول (32 بیت)
آرایه داده شده را با داده های مشخص شده پر کنید. ارجاع باید به آرایه‌ای از موارد اولیه باشد و جدول داده‌ها باید از نظر نوع با آن مطابقت داشته باشد و نباید بیشتر از عناصری که در آرایه جا می‌شود، داشته باشد. یعنی ممکن است آرایه بزرگتر از جدول باشد و در این صورت فقط عناصر اولیه آرایه تنظیم می شوند و باقیمانده تنها می ماند.
27 11x vAA را پرتاب کنید A: ثبات دارای استثنا (8 بیت)
استثنای مشخص شده را پرتاب کنید.
28 10 تن goto +AA A: افست شاخه امضا شده (8 بیت) بدون قید و شرط به دستورالعمل مشخص شده بپرید.

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

29 20 تن 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: "شاخه" امضا شده به شبه دستورالعمل آفست به داده های جدول (32 بیت)
بر اساس مقدار موجود در ثبات داده شده، با استفاده از یک جدول مرتب شده از جفت‌های ارزش-افست، به دستور جدیدی بروید، یا اگر مطابقت نداشت، به دستورالعمل بعدی بروید.
2d..31 23x cmp نوع vAA، vBB، vCC
2d: cmpl-float (lt bias)
2e: cmpg-float (gt bias)
2f: cmpl-double (lt bias)
30: cmpg-double (gt bias)
31: سانتی متر طول
A: ثبت مقصد (8 بیت)
B: ثبت منبع اول یا جفت
C: ثبت یا جفت منبع دوم
ممیز شناور نشان داده شده یا مقایسه long را انجام دهید، اگر b == c ، a را روی 0 ، اگر b > c 1 ، و اگر b < c -1 قرار دهید، تنظیم کنید. "بایاس" لیست شده برای عملیات ممیز شناور نشان می دهد که چگونه با مقایسه های NaN رفتار می شود: دستورالعمل های "gt bias" 1 را برای مقایسه NaN برمی گرداند و دستورالعمل های "lt bias" -1 را برمی گرداند.

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

32..37 22t اگر- vA، vB، +CCCC را آزمایش کنید
32: if-eq
33: اگر-نه
34: if-lt
35: if-ge
36: if-gt
37: if-le
A: ابتدا برای تست ثبت نام کنید (4 بیت)
B: ثبت نام دوم برای آزمایش (4 بیت)
C: افست شاخه امضا شده (16 بیت)
در صورتی که مقادیر دو رجیستر داده شده مطابق با مشخص شده مقایسه شوند، به مقصد داده شده منشعب شوید.

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

38..3d 21t اگر- z vAA، +BBBB را تست کنید
38: if-eqz
39: اگر-نز
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: سن
45: در سطح سنی
46: aget-object
47: aget-boolean
48: aget-byte
49: aget-char
4a: سن کوتاه
4b: aput
4c: قدرت ورودی
4d: aput-object
4e: aput-boolean
4f: aput-byte
50: aput-char
51: aput-کوتاه
A: ثبت ارزش یا جفت. ممکن است مبدا یا مقصد (8 بیت)
B: ثبت آرایه (8 بیت)
C: ثبت فهرست (8 بیت)
عملیات آرایه شناسایی شده را در شاخص شناسایی شده آرایه داده شده، بارگیری یا ذخیره در ثبات ارزش انجام دهید.
52..5f 22c i instanceop vA، vB، field@CCCC
52: iget
53: iget-wide
54: iget-object
55: iget-boolean
56: iget-byte
57: iget-char
58: iget-کوتاه
59: ورودی
5a: Iput-wide
5b: iput-object
5c: iput-boolean
5d: ورودی-بایت
5e: iput-char
5f: ورودی-کوتاه
A: ثبت ارزش یا جفت. ممکن است مبدا یا مقصد (4 بیت)
B: ثبت شی (4 بیت)
C: شاخص مرجع فیلد نمونه (16 بیت)
عملیات فیلد نمونه شی شناسایی شده را با فیلد شناسایی شده، بارگیری یا ذخیره در ثبات مقدار انجام دهید.

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

60..6d 21c s staticop vAA، field@BBBB
60: پیدا کردن
61: گسترده
62: sget-object
63: sget-boolean
64: sget-byte
65: sget-char
66: کوتاه کردن
67: خلط
68: به صورت گسترده
69: ابژه
6a: sput-boolean
6b: sput-byte
6c: sput-char
6d: sput-short
A: ثبت ارزش یا جفت. ممکن است مبدا یا مقصد (8 بیت)
B: شاخص مرجع میدان استاتیک (16 بیت)
عملیات فیلد استاتیک شی شناسایی شده را با فیلد استاتیک شناسایی شده، بارگیری یا ذخیره در ثبات مقدار انجام دهید.

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

6e..72 35c نوع فراخوانی {vC، vD، vE، vF، vG}، meth@BBBB
6e: فراخوانی-مجازی
6f: فراخوانی-سوپر
70: فراخوانی-مستقیم
71: فراخوانی-استاتیک
72: فراخوانی-رابط
A: تعداد کلمات آرگومان (4 بیت)
B: شاخص مرجع روش (16 بیت)
C..G: رجیسترهای آرگومان (هر کدام 4 بیت)
با روش مشخص شده تماس بگیرید. نتیجه (در صورت وجود) ممکن است با یک نوع move-result* مناسب به عنوان دستورالعمل بلافاصله بعدی ذخیره شود.

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

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

در فایل‌های Dex نسخه 037 یا بالاتر، اگر method_id به یک متد واسط اشاره دارد، invoke-super برای فراخوانی خاص‌ترین و بدون رد شدن نسخه آن متد تعریف‌شده در آن رابط استفاده می‌شود. محدودیت‌های روش مشابهی برای invoke-virtual وجود دارد. در فایل‌های Dex قبل از نسخه 037 ، داشتن interface 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: فراخوانی-مجازی/محدوده
75: فراخوانی-سوپر/محدوده
76: invoke-direct/range
77: فراخوانی-استاتیک/محدوده
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: نفی
7c: غیرمنتظره
7d: نگ طولانی
7e: نه طولانی
7f: neg-float
80: نگ-دوبل
81: بین به طولانی
82: داخل به شناور
83: بین به دو
84: طولانی به اینت
85: طولانی به شناور
86: طولانی به دو
87: float-to-int
88: شناور به بلند
89: شناور به دو برابر
8a: double-to-in
8b: دو به بلند
8c: دو برابر به شناور
8d: int-to-byte
8e: int-to-char
8f: میان به کوتاه
A: ثبت مقصد یا جفت (4 بیت)
B: ثبت منبع یا جفت (4 بیت)
عملیات unary شناسایی شده را روی ثبات مبدا انجام دهید و نتیجه را در ثبات مقصد ذخیره کنید.
90..af 23x binop vAA، vBB، vCC
90: افزودنی
91: فرعی
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: افزودن طولانی
9c: زیر طولانی
9d: چندتایی
9e: div-long
9f: rem-long
a0: و-طول
a1: یا طولانی
a2: xor-long
a3: shl-long
a4: shr-long
الف5: عشر طولانی
a6: اضافه کردن شناور
a7: زیر شناور
a8: چند شناور
a9: div-float
aa: rem-float
ab: افزودن-دوبل
ac: زیر دو برابر
آگهی: مولتی دوبل
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
ج4: 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
سی دی: 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: ثابت int signed (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: ثابت int signed (8 بیت)
عملیات باینری مشخص شده را روی ثبات نشان داده شده (آگومان اول) و مقدار واقعی (آگومان دوم) انجام دهید و نتیجه را در ثبات مقصد ذخیره کنید.

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

e3..f9 10x (استفاده نشده) (استفاده نشده)
فا 45 سی سی فراخوانی-چند شکلی {vC، vD، vE، vF، vG}، meth@BBBB، proto@HHHH A: تعداد کلمات آرگومان (4 بیت)
B: شاخص مرجع روش (16 بیت)
C: گیرنده (4 بیت)
D..G: رجیسترهای آرگومان (هر کدام 4 بیت)
H: شاخص مرجع نمونه اولیه (16 بیت)
روش چند شکلی امضای مشخص شده را فراخوانی کنید. نتیجه (در صورت وجود) ممکن است با یک نوع move-result* مناسب به عنوان دستورالعمل بلافاصله بعدی ذخیره شود.

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

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

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

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

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

ارائه در فایل های Dex از نسخه 038 به بعد.
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-type vAA، proto@BBBB A: ثبت مقصد (8 بیت)
B: مرجع نمونه اولیه روش (16 بیت)
یک مرجع را به نمونه اولیه متد مشخص شده توسط ایندکس داده شده در ثبات مشخص شده منتقل کنید.

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

فرمت packed-switch-payload

نام قالب شرح
شناسایی ushort = 0x0100 شناسایی شبه اپکد
اندازه کوتاه تعداد ورودی های جدول
first_key بین المللی اولین (و کمترین) مقدار مورد سوئیچ
اهداف بین المللی[] فهرست اهداف شاخه نسبی size اهداف نسبت به آدرس کد عملیات سوئیچ هستند، نه مربوط به این جدول.

توجه: تعداد کل واحدهای کد برای یک نمونه از این جدول (size * 2) + 4 است.

قالب پراکنده-سوئیچ-بار

نام قالب شرح
شناسایی ushort = 0x0200 شناسایی شبه اپکد
اندازه کوتاه تعداد ورودی های جدول
کلیدها بین المللی[] فهرست مقادیر کلیدی size ، طبقه بندی شده از کم به زیاد
اهداف بین المللی[] فهرستی از اهداف شاخه نسبی size ، که هر کدام مربوط به مقدار کلید در همان شاخص است. اهداف نسبت به آدرس کد عملیات سوئیچ هستند، نه مربوط به این جدول.

توجه: تعداد کل واحدهای کد برای یک نمونه از این جدول (size * 4) + 2 است.

فرمت پر آرایه-داده-بارد

نام قالب شرح
شناسایی ushort = 0x0300 شناسایی شبه اپکد
عنصر_عرض کوتاه تعداد بایت ها در هر عنصر
اندازه unint تعداد عناصر در جدول
داده ها یوبایت[] مقادیر داده

توجه: تعداد کل واحدهای کد برای یک نمونه از این جدول (size * element_width + 1) / 2 + 4 است.

جزئیات عملیات ریاضی

توجه: عملیات ممیز شناور باید از قوانین IEEE 754 پیروی کند، با استفاده از دور به نزدیکترین و تدریجی، مگر در مواردی که خلاف آن ذکر شده باشد.

اپکد ج معناشناسی یادداشت
نفی int32 a;
نتیجه int32 = -a;
متمم دوگانه Unary.
غیرمنتظره int32 a;
نتیجه int32 = ~a;
مکمل های تک تک.
طولانی int64 a;
نتیجه int64 = -a;
متمم دوگانه Unary.
نه طولانی int64 a;
نتیجه int64 = ~a;
مکمل های تک تک.
neg-float شناور a;
نتیجه شناور = -a;
نفی نقطه شناور.
نفی دو دو برابر a;
نتیجه مضاعف = -a;
نفی نقطه شناور
دارای ضعف در طول int32 a ؛
int64 نتیجه = (int64) a ؛
گسترش int32 به int64 .
با شناور int32 a ؛
نتیجه شناور = (شناور) a ؛
تبدیل int32 به float ، با استفاده از دور و دور. این برای برخی از مقادیر دقت را از دست می دهد.
دو برابر int32 a ؛
نتیجه دو برابر = (دو برابر) a ؛
تبدیل int32 به double .
طولانی تا حد int64 a ؛
int32 نتیجه = (int32) a ؛
کوتاه شدن int64 به int32 .
با شناور int64 a ؛
نتیجه شناور = (شناور) a ؛
تبدیل int64 به float ، با استفاده از دور و دور. این برای برخی از مقادیر دقت را از دست می دهد.
دو برابر int64 a ؛
نتیجه دو برابر = (دو برابر) a ؛
تبدیل int64 به double ، با استفاده از دور و دور. این برای برخی از مقادیر دقت را از دست می دهد.
شناور شناور a ؛
int32 نتیجه = (int32) a ؛
تبدیل float به int32 ، با استفاده از Round-Toward-Zero. NaN و -0.0 (صفر منفی) به عدد صحیح 0 تبدیل می شوند. بی نهایت و مقادیر با بزرگی بیش از حد بزرگ که باید نشان داده شود ، بسته به علامت به 0x7fffffff یا -0x80000000 تبدیل می شود.
شناور شناور a ؛
int64 نتیجه = (int64) a ؛
تبدیل float به int64 ، با استفاده از Round-Toward-Zero. همان موارد ویژه ای که برای float-to-int در اینجا اعمال می شود ، به جز اینکه مقادیر خارج از محدوده به 0x7fffffffffffffff یا -0x8000000000000000 بسته به علامت تبدیل می شوند.
شناور شناور a ؛
نتیجه دو برابر = (دو برابر) a ؛
تبدیل float به double ، حفظ مقدار دقیقاً.
دو نقطه دو برابر
int32 نتیجه = (int32) a ؛
تبدیل double به int32 ، با استفاده از Round-Toward-Zero. همان موارد خاص که در مورد float-to-int اعمال می شود در اینجا اعمال می شود.
دو برابر دو برابر
int64 نتیجه = (int64) a ؛
تبدیل double به int64 ، با استفاده از Round-Toward-Zero. همان موارد خاص که برای float-to-long در اینجا اعمال می شود.
دو شناور دو برابر
نتیجه شناور = (شناور) a ؛
تبدیل double به float ، با استفاده از دور و دور. این برای برخی از مقادیر دقت را از دست می دهد.
بایت int32 a ؛
int32 نتیجه = (a << 24) >> 24 ؛
کوتاه شدن int32 به int8 ، علامت را گسترش می دهد.
دارای ضعف int32 a ؛
int32 نتیجه = a & 0xffff ؛
کوتاه شدن int32 به uint16 ، بدون گسترش علامت.
بی نقص int32 a ؛
int32 نتیجه = (a << 16) >> 16 ؛
کوتاه شدن int32 به int16 ، علامت را گسترش می دهد.
افزودنی int32 a ، b ؛
int32 نتیجه = a + b ؛
علاوه بر این ، دوقلو.
زیر نقطه int32 a ، b ؛
int32 نتیجه = a - b ؛
تفریق دوقلو.
RSUB int32 a ، b ؛
int32 نتیجه = b - a ؛
تفریق معکوس دوقلو.
مولک int32 a ، b ؛
int32 نتیجه = a * b ؛
ضرب دو برابر.
گودال int32 a ، b ؛
int32 نتیجه = a / b ؛
تقسیم دوقلو ، به سمت صفر (یعنی کوتاه به عدد صحیح). اگر b == 0 باشد ، این ArithmeticException پرتاب می کند.
rem-intin int32 a ، b ؛
نتیجه int32 = a ٪ b ؛
دوقلو پس از تقسیم باقی مانده است. نشانه نتیجه همانند a است و به طور دقیق تر به عنوان result == a - (a / b) * b تعریف می شود. اگر b == 0 باشد ، این ArithmeticException پرتاب می کند.
وه int32 a ، b ؛
int32 نتیجه = a & b ؛
بیت در صورت و.
یا int32 a ، b ؛
نتیجه int32 = a | ب
بیت در صورت یا.
مقید int32 a ، b ؛
int32 نتیجه = a ^ b ؛
Bitwise Xor.
از روی intin int32 a ، b ؛
int32 نتیجه = a << (b & 0x1f) ؛
Shift Bitwise سمت چپ (با استدلال نقاب دار).
در int32 a ، b ؛
int32 نتیجه = a >> (b & 0x1f) ؛
BITWISE SIGHT RIGHT RIGHT (با استدلال نقاب دار).
ushr-int uint32 a ، b ؛
int32 نتیجه = a >> (b & 0x1f) ؛
Shift Shift بدون امضا به سمت راست (با استدلال نقاب دار).
هم زمان int64 a ، b ؛
int64 نتیجه = a + b ؛
علاوه بر این ، دوقلو.
فرعی int64 a ، b ؛
int64 نتیجه = a - b ؛
تفریق دوقلو.
مولک int64 a ، b ؛
int64 نتیجه = a * b ؛
ضرب دو برابر.
دارای دو طرفه int64 a ، b ؛
int64 نتیجه = a / b ؛
تقسیم دوقلو ، به سمت صفر (یعنی کوتاه به عدد صحیح). اگر b == 0 باشد ، این ArithmeticException پرتاب می کند.
رتا int64 a ، b ؛
نتیجه int64 = a ٪ b ؛
دوقلو پس از تقسیم باقی مانده است. نشانه نتیجه همانند a است و به طور دقیق تر به عنوان result == a - (a / b) * b تعریف می شود. اگر b == 0 باشد ، این ArithmeticException پرتاب می کند.
وهمی int64 a ، b ؛
int64 نتیجه = a & b ؛
بیت در صورت و.
فراوان int64 a ، b ؛
int64 نتیجه = a | ب
بیت در صورت یا.
زور int64 a ، b ؛
int64 نتیجه = a ^ b ؛
Bitwise Xor.
دارای SHL طولانی int64 a ؛
int32 b ؛
int64 نتیجه = a << (b & 0x3f) ؛
Shift Bitwise سمت چپ (با استدلال نقاب دار).
دارای SHR طولانی int64 a ؛
int32 b ؛
int64 نتیجه = a >> (b & 0x3f) ؛
BITWISE SIGHT RIGHT RIGHT (با استدلال نقاب دار).
ushr طولانی uint64 a ؛
int32 b ؛
int64 نتیجه = a >> (b & 0x3f) ؛
Shift Shift بدون امضا به سمت راست (با استدلال نقاب دار).
باک شناور A ، B ؛
نتیجه شناور = a + b ؛
علاوه بر نقطه شناور.
زیر شناور شناور A ، B ؛
نتیجه شناور = a - b ؛
تفریق نقطه شناور.
شناور شناور A ، B ؛
نتیجه شناور = a * b ؛
ضرب نقطه شناور.
شناور شناور A ، B ؛
نتیجه شناور = a / b ؛
بخش نقطه شناور.
شناور شناور A ، B ؛
نتیجه شناور = A ٪ B ؛
نقطه شناور باقی مانده پس از تقسیم. این عملکرد متفاوت از باقیمانده IEEE 754 است و به عنوان result == a - roundTowardZero(a / b) * b تعریف شده است.
افزودنی Double A ، B ؛
نتیجه مضاعف = a + b ؛
علاوه بر نقطه شناور.
فرعی Double A ، B ؛
دو نتیجه = a - b ؛
تفریق نقطه شناور.
مولک Double A ، B ؛
نتیجه مضاعف = a * b ؛
ضرب نقطه شناور.
دوام Double A ، B ؛
نتیجه مضاعف = a / b ؛
بخش نقطه شناور.
دوام کردن Double A ، B ؛
نتیجه دو برابر = A ٪ B ؛
نقطه شناور باقی مانده پس از تقسیم. این عملکرد متفاوت از باقیمانده IEEE 754 است و به عنوان result == a - roundTowardZero(a / b) * b تعریف شده است.