طراحی کلی
- مدل ماشین و قراردادهای فراخوانی تقریباً تقلید از معماری های واقعی رایج و قراردادهای فراخوانی سبک C است:
- این دستگاه مبتنی بر رجیستر است و اندازه فریم ها در زمان ایجاد ثابت می شود. هر فریم شامل تعداد خاصی از ثبات ها (مشخص شده توسط روش) و همچنین داده های اضافی مورد نیاز برای اجرای متد است، مانند شمارنده برنامه (اما نه محدود به) و یک مرجع به فایل
.dex
که حاوی متد است. . - هنگامی که برای مقادیر بیت (مانند اعداد صحیح و اعداد ممیز شناور) استفاده می شود، رجیسترها با عرض 32 بیت در نظر گرفته می شوند. جفت های ثبت مجاور برای مقادیر 64 بیتی استفاده می شوند. برای جفت های ثبت نیازی به تراز وجود ندارد.
- هنگامی که برای ارجاعات شیء استفاده می شود، رجیسترها به اندازه کافی گسترده در نظر گرفته می شوند که دقیقاً یک چنین مرجع را در خود جای دهند.
- از نظر نمایش بیتی،
(Object) null == (int) 0
. - آرگومان های N به ترتیب در آخرین N ثبات فریم فراخوانی متد قرار می گیرند. آرگومان های گسترده دو ثبات را مصرف می کنند. متدهای نمونه با
this
مرجع به عنوان اولین آرگومان ارسال می شوند.
- این دستگاه مبتنی بر رجیستر است و اندازه فریم ها در زمان ایجاد ثابت می شود. هر فریم شامل تعداد خاصی از ثبات ها (مشخص شده توسط روش) و همچنین داده های اضافی مورد نیاز برای اجرای متد است، مانند شمارنده برنامه (اما نه محدود به) و یک مرجع به فایل
- واحد ذخیره سازی در جریان دستورالعمل یک مقدار 16 بیتی بدون علامت است. برخی از بیت ها در برخی دستورالعمل ها نادیده گرفته می شوند / باید صفر باشند.
- دستورالعمل ها به طور رایگان به نوع خاصی محدود نمی شوند. برای مثال، دستورالعملهایی که مقادیر رجیستر 32 بیتی را بدون تفسیر جابهجا میکنند، لازم نیست مشخص کنند که آیا در حال حرکت هستند یا شناور.
- برای ارجاع به رشته ها، انواع، فیلدها و متدها، مجموعه های ثابت شمارش شده و نمایه شده جداگانه وجود دارد.
- داده های تحت اللفظی بیتی به صورت خطی در جریان دستورالعمل نشان داده می شوند.
- از آنجا که، در عمل، غیرمعمول است که یک روش به بیش از 16 ثبات نیاز داشته باشد، و از آنجا که نیاز به بیش از هشت رجیستر به طور منطقی رایج است ، بسیاری از دستورالعمل ها تنها به آدرس دادن به 16 ثبات اول محدود می شوند. در صورت امکان، دستورالعمل ها به حداکثر 256 ثبت اول اجازه ارجاع می دهند. بهعلاوه، برخی دستورالعملها دارای انواعی هستند که تعداد ثبتهای بسیار بزرگتری را امکانپذیر میسازند، از جمله یک جفت دستورالعمل
move
که میتوانند رجیسترها را در محدودهv0
–v65535
آدرسدهی کنند. در مواردی که یک نوع دستورالعمل برای آدرس دادن به یک ثبات مورد نظر در دسترس نیست، انتظار می رود که محتویات ثبات از ثبات اصلی به یک ثبات پایین (قبل از عملیات) و/یا از یک ثبات نتیجه کم به یک ثبات بالا منتقل شوند. ثبت نام (بعد از عملیات). - چندین "شبه دستورالعمل" وجود دارد که برای نگهداری بارهای داده با طول متغیر استفاده می شود، که با دستورالعمل های معمولی به آنها اشاره می شود (به عنوان مثال،
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
" رجیستر مقصد است (که توسط عملیات مشخص می شود؛ دوباره، قانون این است که آرگومان های مقصد همیشه اول هستند)، که باید در محدودهv0
–v255
باشد. - "
vBBBB
" ثبت منبع است که باید در محدودهv0
–v65535
باشد.
- "
- برای جزئیات بیشتر در مورد فرمتهای دستورالعملهای مختلف (در فهرست «Op & Format») و همچنین جزئیات مربوط به نحو opcode، به سند فرمتهای دستورالعمل مراجعه کنید.
- برای جزئیات بیشتر درباره محل قرار گرفتن بایت کد در تصویر بزرگتر، به سند فرمت فایل
.dex
مراجعه کنید.
خلاصه مجموعه بایت کد
عملیات و قالب | یادگاری / نحو | استدلال ها | شرح |
---|---|---|---|
00 10 برابر | نه | چرخه زباله نکته: شبه دستورالعمل های حاوی داده با این کد عملیاتی برچسب گذاری می شوند که در این صورت بایت با مرتبه بالا واحد اپکد ماهیت داده ها را نشان می دهد. «قالببندی | |
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 بیت) | محتویات یک جفت ثبات را به جفت دیگر منتقل کنید. توجه: انتقال از |
05 22x | حرکت گسترده/از 16 vAA، vBBBB | A: جفت ثبت مقصد (8 بیت)B: جفت ثبت منبع (16 بیت) | محتویات یک جفت ثبات را به جفت دیگر منتقل کنید. توجه: ملاحظات پیادهسازی همان |
06 32x | حرکت گسترده/16 vAAAA، vBBBB | A: جفت ثبت مقصد (16 بیت)B: جفت ثبت منبع (16 بیت) | محتویات یک جفت ثبات را به جفت دیگر منتقل کنید. توجه: ملاحظات پیادهسازی همان |
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 بیت) | مانیتور را برای شی مشخص شده رها کنید. توجه: اگر این دستورالعمل نیاز به ایجاد یک استثنا دارد، باید این کار را به گونهای انجام دهد که گویی کامپیوتر قبلاً از دستورالعمل گذشته است. ممکن است مفید باشد که این دستور را به عنوان دستوری که با موفقیت اجرا میشود (به یک معنا)، و استثنایی که بعد از دستورالعمل پرتاب میشود، اما قبل از اینکه دستور بعدی فرصت اجرا پیدا کند، مفید باشد. این تعریف این امکان را برای روشی فراهم میکند که از یک بلوک پاکسازی مانیتور (به عنوان مثال، |
1f 21c | چک کردن vAA، نوع@BBBB | A: ثبات مرجع (8 بیت)B: نوع شاخص (16 بیت) | اگر مرجع موجود در ثبات داده شده نمی تواند به نوع مشخص شده ارسال شود، یک ClassCastException پرتاب کنید. توجه: از آنجایی که |
20 22c | نمونه vA، vB، type@CCCC | A: ثبت مقصد (4 بیت)B: رجیستر دارای مرجع (4 بیت)C: نوع شاخص (16 بیت) | اگر مرجع مشخص شده نمونه ای از نوع داده شده است، 1 در ثبات مقصد داده شده ذخیره کنید، یا اگر نه، 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 بیت) | بدون قید و شرط به دستورالعمل مشخص شده بپرید. توجه: افست شاخه نباید |
29 20 تن | 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: "شاخه" امضا شده به شبه دستورالعمل آفست به داده های جدول (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 را برمی گرداند. به عنوان مثال، برای بررسی اینکه آیا نقطه شناور |
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 بیت) | در صورتی که مقادیر دو رجیستر داده شده مطابق با مشخص شده مقایسه شوند، به مقصد داده شده منشعب شوید. توجه: افست شاخه نباید |
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 مطابق با مشخص شده مقایسه شود، به مقصد داده شده منشعب شوید. توجه: افست شاخه نباید |
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* مناسب به عنوان دستورالعمل بلافاصله بعدی ذخیره شود. هنگامی که در فایلهای Dex نسخه توجه: این اپکدها کاندیدای معقولی برای پیوند استاتیک هستند و آرگومان روش را تغییر میدهند تا یک افست مستقیمتر (یا جفت آن) باشد. |
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 بیت) | عملیات باینری شناسایی شده را روی دو رجیستر منبع انجام دهید و نتیجه را در ثبات مقصد ذخیره کنید. نکته: بر خلاف سایر عملیات ریاضی |
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 بیت) | عملیات باینری شناسایی شده را روی دو رجیستر منبع انجام دهید و نتیجه را در ثبت منبع اول ذخیره کنید. توجه: بر خلاف سایر عملیات ریاضی |
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 بیت) | عملیات باینری مشخص شده را روی ثبات نشان داده شده (آگومان اول) و مقدار واقعی (آگومان دوم) انجام دهید و نتیجه را در ثبات مقصد ذخیره کنید. توجه: |
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 بیت) | عملیات باینری مشخص شده را روی ثبات نشان داده شده (آگومان اول) و مقدار واقعی (آگومان دوم) انجام دهید و نتیجه را در ثبات مقصد ذخیره کنید. توجه: برای جزئیات بیشتر در مورد معناشناسی |
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 نیز در صورتی که:
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 تعریف شده است. |