সাধারণ ডিজাইন
- মেশিন মডেল ও কলিং কনভেনশনকে সাধারণ রিয়েল আর্কিটেকচার ও C-স্টাইল কলিং কনভেনশনের
অনুকরণ করার জন্য তৈরি করা হয়েছে:
- মেশিনটি রেজিস্টার-ভিত্তিক এবং তৈরি করার পরে ফ্রেমের সাইজ নির্দিষ্ট করা হয়।
প্রতিটি ফ্রেমে নির্দিষ্ট সংখ্যক রেজিস্টার (মেথড দ্বারা নির্দিষ্ট করা) এবং মেথড এক্সিকিউট করার জন্য প্রয়োজনীয়
অতিরিক্ত ডেটা থাকে, যেমন (তবে এর মধ্যেই সীমাবদ্ধ নয়) প্রোগ্রাম কাউন্টার এবং
.dexমেথড থাকা ফাইলের রেফারেন্স। - বিট ভ্যালুর (যেমন, ইন্টিজার এবং ফ্লোটিং পয়েন্ট নম্বর) জন্য ব্যবহার করা হলে, রেজিস্টারকে ৩২ বিট চওড়া হিসেবে বিবেচনা করা হয়। ৬৪-বিট ভ্যালুর জন্য সংলগ্ন রেজিস্টার পেয়ার ব্যবহার করা হয়। রেজিস্টার পেয়ারের জন্য কোনও অ্যালাইনমেন্টের প্রয়োজন নেই।
- অবজেক্ট রেফারেন্সের জন্য ব্যবহার করা হলে, রেজিস্টারগুলিকে যথেষ্ট বড় বলে বিবেচনা করা হয় যাতে ঠিক একটি রেফারেন্স রাখা যায়।
- বিটওয়াইজ উপস্থাপনার ক্ষেত্রে,
(Object) null == (int) 0। - কোনও পদ্ধতির N আর্গুমেন্ট, পদ্ধতির ইনভোকেশন ফ্রেমের শেষ N রেজিস্টারে
ক্রম অনুযায়ী যায়। ওয়াইড আর্গুমেন্ট
দুটি রেজিস্টার ব্যবহার করে। ইনস্ট্যান্স পদ্ধতিতে প্রথম আর্গুমেন্ট হিসেবে
thisরেফারেন্স পাস করা হয়।
- মেশিনটি রেজিস্টার-ভিত্তিক এবং তৈরি করার পরে ফ্রেমের সাইজ নির্দিষ্ট করা হয়।
প্রতিটি ফ্রেমে নির্দিষ্ট সংখ্যক রেজিস্টার (মেথড দ্বারা নির্দিষ্ট করা) এবং মেথড এক্সিকিউট করার জন্য প্রয়োজনীয়
অতিরিক্ত ডেটা থাকে, যেমন (তবে এর মধ্যেই সীমাবদ্ধ নয়) প্রোগ্রাম কাউন্টার এবং
- নির্দেশাবলী স্ট্রিমে স্টোরেজ ইউনিট হল ১৬-বিট আনসাইনড কোয়ান্টিটি। কিছু নির্দেশাবলীতে কিছু বিট উপেক্ষা করা হয় / শূন্য হতে হবে।
- নির্দেশাবলী অযথা কোনও নির্দিষ্ট ধরনের মধ্যে সীমাবদ্ধ নয়। যেমন, ব্যাখ্যা না করেই ৩২-বিট রেজিস্টার ভ্যালু সরানোর নির্দেশাবলী সেগুলি int নাকি float সরাচ্ছে তা উল্লেখ করতে হবে না।
- স্ট্রিং, টাইপ, ফিল্ড ও মেথডের রেফারেন্সের জন্য আলাদাভাবে গণনা ও ইন্ডেক্স করা কনস্ট্যান্ট পুল আছে।
- নির্দেশাবলী স্ট্রিমে বিটওয়াইজ লিটেরাল ডেটা ইন-লাইন হিসেবে দেখানো হয়।
- কারণ, বাস্তবে, কোনও পদ্ধতির জন্য ১৬টির বেশি রেজিস্টারের প্রয়োজন হওয়া অস্বাভাবিক, এবং আটটির বেশি রেজিস্টারের প্রয়োজন হওয়া হল
যুক্তিযুক্তভাবে সাধারণ, অনেক নির্দেশাবলী শুধুমাত্র প্রথম ১৬টি
রেজিস্টারকে অ্যাড্রেস করার মধ্যেই সীমাবদ্ধ। যৌক্তিকভাবে সম্ভব হলে, নির্দেশাবলী প্রথম ২৫৬টি রেজিস্টার পর্যন্ত রেফারেন্সের অনুমতি দেয়। এছাড়াও, কিছু নির্দেশের ভেরিয়েন্ট আছে
যা অনেক বেশি রেজিস্টার কাউন্টের অনুমতি দেয়, এর মধ্যে আছে এক জোড়া ক্যাচ-অল
moveনির্দেশ যাv0–v65535রেঞ্জের মধ্যে রেজিস্টার অ্যাড্রেস করতে পারে। যেসব ক্ষেত্রে কোনও নির্দেশনার ভেরিয়েন্ট কাঙ্খিত রেজিস্টারকে অ্যাড্রেস করার জন্য উপলভ্য থাকে না, সেখানে আশা করা হয় যে রেজিস্টারের কন্টেন্ট আসল রেজিস্টার থেকে লো রেজিস্টারে (অপারেশনের আগে) এবং/অথবা লো রেজাল্ট রেজিস্টার থেকে হাই রেজিস্টারে (অপারেশনের পরে) সরানো হবে। - বিভিন্ন দৈর্ঘ্যের ডেটা পেলোড ধরে রাখার জন্য বেশ কিছু "সিউডো-নির্দেশ" ব্যবহার করা হয়, যেগুলি নিয়মিত নির্দেশ দ্বারা রেফার করা হয় (যেমন,
fill-array-data)। এই ধরনের নির্দেশ স্বাভাবিকভাবে প্রোগ্রাম চালানোর সময় কখনই পাওয়া উচিত নয়। এছাড়াও, নির্দেশাবলীকে অবশ্যই জোড় সংখ্যাযুক্ত বাইটকোড অফসেটে (অর্থাৎ, ৪-বাইট অ্যালাইনমেন্ট) থাকতে হবে। এই প্রয়োজনীয়তা পূরণ করতে, dex জেনারেশন টুলকে স্পেসার হিসেবে অতিরিক্তnopনির্দেশ দিতে হবে, যদি এই ধরনের নির্দেশ অন্যথায় সারিবদ্ধ না হয়। সবশেষে, যদিও এটি বাধ্যতামূলক নয়, তবে এটি আশা করা হয় যে বেশিরভাগ টুল এই নির্দেশাবলী মেথডের শেষে প্রয়োগ করবে, কারণ অন্যথায়, এগুলির চারপাশে ব্রাঞ্চ করার জন্য অতিরিক্ত নির্দেশাবলীর প্রয়োজন হবে। - চলমান সিস্টেমে ইনস্টল করা হলে, কিছু নির্দেশাবলী পরিবর্তন করা হতে পারে, ইনস্টল-টাইম স্ট্যাটিক লিঙ্কিং অপ্টিমাইজেশন হিসেবে তাদের ফর্ম্যাট পরিবর্তন করা হয়। লিঙ্ক করা হয়ে গেলে যাতে দ্রুত এক্সিকিউট করা যায় সেই জন্য এটি করা হয়। সাজেস্ট করা ভ্যারিয়েন্টের জন্য নির্দেশাবলী ফর্ম্যাট ডকুমেন্ট দেখুন। "সাজেস্ট করা" শব্দটি ভেবেচিন্তে ব্যবহার করা হয়েছে; এগুলি প্রয়োগ করা বাধ্যতামূলক নয়।
- হিউম্যান-সিনট্যাক্স ও নেমোনিক্স:
- আর্গুমেন্টের জন্য ডেস্টিনেশন-তারপর-সোর্স অর্ডারিং।
- কিছু অপকোডের নামের শেষে একটি দ্ব্যর্থতা নিরসনকারী প্রত্যয় থাকে যা নির্দেশ করে যে
সেগুলি কোন ধরনের ডেটার উপর কাজ করে:
- টাইপ-জেনারেল ৩২-বিট অপকোড আনমার্ক করা থাকে।
- টাইপ-জেনারেল ৬৪-বিট অপকোডের শেষে
-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 ও ফর্ম্যাট" বিকল্পের অধীনে তালিকাভুক্ত) এবং অপকোড সিনট্যাক্স সম্পর্কে আরও বিস্তারিত জানতে, নির্দেশাবলী ফর্ম্যাট ডকুমেন্ট দেখুন।
- কোথায় বাইটকোড ফিট করে সেই সম্পর্কে আরও বিস্তারিত জানতে
.dexফাইল ফর্ম্যাট ডকুমেন্ট দেখুন।
বাইটকোড সেটের সারাংশ
| Op & Format | নেমোনিক / সিনট্যাক্স | আর্গুমেন্ট | বর্ণনা |
|---|---|---|---|
| ০০ ১০x | না | বর্জ্য চক্র।
মনে রাখবেন:
এই অপকোড দিয়ে ডেটা-বিয়ারিং ছদ্ম-নির্দেশাবলী ট্যাগ করা হয়, সেক্ষেত্রে
অপকোড ইউনিটের হাই-অর্ডার বাইট ডেটার ধরন নির্দেশ করে।
নিচে " |
|
| ০১ ১২x | vA, vB সরান | A: ডেস্টিনেশন রেজিস্টার (৪ বিট)B: সোর্স রেজিস্টার (৪ বিট) |
একটি নন-অবজেক্ট রেজিস্টারের কন্টেন্ট অন্যটিতে সরান। |
| 02 22x | move/from16 vAA, vBBBB | A: ডেস্টিনেশন রেজিস্টার (৮ বিট)B: সোর্স রেজিস্টার (১৬ বিট) |
একটি নন-অবজেক্ট রেজিস্টারের কন্টেন্ট অন্যটিতে সরান। |
| 03 32x | move/16 vAAAA, vBBBB | A: ডেস্টিনেশন রেজিস্টার (১৬ বিট)B: সোর্স রেজিস্টার (১৬ বিট) |
একটি নন-অবজেক্ট রেজিস্টারের কন্টেন্ট অন্যটিতে সরান। |
| 04 12x | মুভ-ওয়াইড vA, vB | A: ডেস্টিনেশন রেজিস্টার পেয়ার (৪ বিট)B: সোর্স রেজিস্টার পেয়ার (৪ বিট) |
একটি রেজিস্টার-পেয়ারের কন্টেন্ট অন্যটিতে সরান।
মনে রাখবেন:
|
| ০৫ ২২x | move-wide/from16 vAA, vBBBB | A: ডেস্টিনেশন রেজিস্টার পেয়ার (৮ বিট)B: সোর্স রেজিস্টার পেয়ার (১৬ বিট) |
একটি রেজিস্টার-পেয়ারের কন্টেন্ট অন্যটিতে সরান।
মনে রাখবেন:
প্রয়োগ করার সময় উপরে উল্লেখ করা |
| ০৬ ৩২x | move-wide/16 vAAAA, vBBBB | A: ডেস্টিনেশন রেজিস্টার পেয়ার (১৬ বিট)B: সোর্স রেজিস্টার পেয়ার (১৬ বিট) |
একটি রেজিস্টার-পেয়ারের কন্টেন্ট অন্যটিতে সরান।
মনে রাখবেন:
প্রয়োগ করার সময় উপরে উল্লেখ করা |
| 07 12x | move-object vA, vB | A: ডেস্টিনেশন রেজিস্টার (৪ বিট)B: সোর্স রেজিস্টার (৪ বিট) |
একটি অবজেক্ট-বেয়ারিং রেজিস্টারের কন্টেন্ট অন্যটিতে সরান। |
| ০৮ ২২x | move-object/from16 vAA, vBBBB | A: ডেস্টিনেশন রেজিস্টার (৮ বিট)B: সোর্স রেজিস্টার (১৬ বিট) |
একটি অবজেক্ট-বিয়ারিং রেজিস্টারের কন্টেন্ট অন্যটিতে সরান। |
| ০৯ ৩২x | 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
যার (অবজেক্ট) ফলাফল উপেক্ষা করা যাবে না, তার ঠিক পরেই
নির্দেশাবলী হিসেবে করতে হবে; অন্য কোথাও করলে তা অবৈধ হবে। |
| ০ দিন ১১x | move-exception vAA | A: গন্তব্য রেজিস্টার (৮ বিট) |
প্রদত্ত রেজিস্টারে এইমাত্র ধরা পড়া ব্যতিক্রম সেভ করুন। এটি অবশ্যই এমন কোনও ব্যতিক্রম হ্যান্ডলারের প্রথম নির্দেশ হতে হবে যার ধরা ব্যতিক্রম উপেক্ষা করা যাবে না এবং এই নির্দেশটি অবশ্যই শুধুমাত্র ব্যতিক্রম হ্যান্ডলারের প্রথম নির্দেশ হিসেবেই হতে হবে; অন্য কোথাও এটি ব্যবহার করা যাবে না। |
| ০e ১০x | return-void | void পদ্ধতি থেকে ফিরে আসুন। |
|
| 0f 11x | vAA ফেরত দিন | A: রিটার্ন ভ্যালু রেজিস্টার (৮ বিট) |
সিঙ্গেল-উইথ (৩২-বিট) নন-অবজেক্ট ভ্যালু-রিটার্নিং মেথড থেকে রিটার্ন। |
| ১০ ১১x | return-wide vAA | A: রিটার্ন ভ্যালু রেজিস্টার-পেয়ার (৮ বিট) |
ডবল-উইথ (৬৪-বিট) ভ্যালু-রিটার্নিং পদ্ধতি থেকে রিটার্ন। |
| 11 11x | return-object vAA | A: রিটার্ন ভ্যালু রেজিস্টার (৮ বিট) |
অবজেক্ট-রিটার্নিং পদ্ধতি থেকে রিটার্ন করুন। |
| 12 11n | const/4 vA, #+B | A: ডেস্টিনেশন রেজিস্টার (৪ বিট)B: সাইনড ইন্টিজার (৪ বিট) |
প্রদত্ত আক্ষরিক মান (৩২ বিটে সাইন-এক্সটেন্ড করা) নির্দিষ্ট রেজিস্টারে সরান। |
| ১৩ ২১সে | const/16 vAA, #+BBBB | A: ডেস্টিনেশন রেজিস্টার (৮ বিট)B: সাইনড ইন্টিজার (১৬ বিট) |
প্রদত্ত আক্ষরিক মান (৩২ বিটে সাইন-এক্সটেন্ড করা) নির্দিষ্ট রেজিস্টারে সরান। |
| 14 31i | 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: সাইনড ইন্টিজার (৩২ বিট) |
প্রদত্ত আক্ষরিক মান (৬৪ বিট পর্যন্ত সাইন-এক্সটেন্ড করা) নির্দিষ্ট রেজিস্টার-পেয়ারে সরান। |
| 18 51l | 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: রেফারেন্স-বেয়ারিং রেজিস্টার (৮ বিট) |
নির্দেশিত অবজেক্টের জন্য মনিটর রিলিজ করুন।
মনে রাখবেন:
এই নির্দেশাবলীকে ব্যতিক্রম তৈরি করতে হলে, এটি অবশ্যই
এমনভাবে করতে হবে যেন পিসি আগেই নির্দেশাবলী অতিক্রম করে গেছে।
এটি এমনভাবে ভাবলে সহায়ক হতে পারে যে নির্দেশটি সফলভাবে
এক্সিকিউট (এক অর্থে) হয়েছে এবং নির্দেশটি এক্সিকিউট হওয়ার পরে
কিন্তু পরের নির্দেশটি রান করার সুযোগ পাওয়ার আগে
ব্যতিক্রমটি থ্রো করা হয়েছে। এই সংজ্ঞাটি কোনও পদ্ধতির জন্য
একটি মনিটর ক্লিন-আপ ক্যাচ-অল (যেমন, |
| 1f 21c | check-cast vAA, type@BBBB | A: রেফারেন্স-বিয়ারিং রেজিস্টার (৮ বিট)B: টাইপ ইন্ডেক্স (১৬ বিট) |
প্রদত্ত রেজিস্টারে থাকা রেফারেন্সকে
উল্লিখিত টাইপে কাস্ট করা না গেলে ClassCastException থ্রো করুন।
মনে রাখবেন: যেহেতু |
| 20 22c | instance-of vA, vB, type@CCCC | A: ডেস্টিনেশন রেজিস্টার (৪ বিট)B: রেফারেন্স-বেয়ারিং রেজিস্টার (৪ বিট)C: টাইপ ইনডেক্স (১৬ বিট) |
উল্লেখ করা রেফারেন্স প্রদত্ত প্রকারের একটি ইনস্ট্যান্স হলে,
প্রদত্ত গন্তব্য রেজিস্টার 1-এ স্টোর করুন,
অথবা না হলে 0-এ স্টোর করুন।
মনে রাখবেন: যেহেতু |
| ২১ ১২x | array-length vA, vB | A: ডেস্টিনেশন রেজিস্টার (৪ বিট)B: অ্যারে রেফারেন্স-বিয়ারিং রেজিস্টার (৪ বিট) |
প্রদত্ত ডেস্টিনেশন রেজিস্টারে, এন্ট্রি হিসেবে, উল্লিখিত অ্যারের দৈর্ঘ্য স্টোর করে |
| ২২ ২১(গ) | new-instance vAA, type@BBBB | A: গন্তব্য রেজিস্টার (৮ বিট)B: টাইপ ইন্ডেক্স |
উল্লিখিত ধরনের একটি নতুন ইনস্ট্যান্স তৈরি করে, গন্তব্যে সেটির একটি রেফারেন্স স্টোর করে। টাইপটি অবশ্যই একটি নন-অ্যারে ক্লাসকে রেফার করবে। |
| 23 22c | new-array vA, vB, type@CCCC | A: ডেস্টিনেশন রেজিস্টার (৪ বিট)B: সাইজ রেজিস্টারC: টাইপ ইন্ডেক্স |
উল্লেখ করা ধরন ও সাইজের নতুন অ্যারে তৈরি করুন। টাইপ অবশ্যই অ্যারে টাইপ হতে হবে। |
| ২৪ ৩৫গ | filled-new-array {vC, vD, vE, vF, vG}, type@BBBB |
A: অ্যারের সাইজ ও আর্গুমেন্টের শব্দ সংখ্যা (৪ বিট)B: টাইপ ইনডেক্স (১৬ বিট)C..G: আর্গুমেন্ট রেজিস্টার (প্রতিটি ৪ বিট)
|
প্রদত্ত ধরন ও সাইজের একটি অ্যারে তৈরি করুন এবং সেটি সাপ্লাই করা কন্টেন্ট দিয়ে
পূরণ করুন। টাইপ অবশ্যই অ্যারে টাইপ হতে হবে। অ্যারের
কন্টেন্ট অবশ্যই এক শব্দের হতে হবে (অর্থাৎ,
long বা double-এর কোনও অ্যারে নয়, তবে রেফারেন্স
টাইপ গ্রহণযোগ্য)। তৈরি করা
ইনস্ট্যান্স "ফলাফল" হিসেবে স্টোর করা হয়, ঠিক যেভাবে মেথড ইনভোকেশন
নির্দেশাবলী তাদের ফলাফল স্টোর করে, তাই তৈরি করা ইনস্ট্যান্সকে
অবশ্যই অবিলম্বে পরবর্তী
move-result-object নির্দেশাবলীর (যদি এটি ব্যবহার করতে হয়) সাথে একটি রেজিস্টারে সরাতে হবে। |
| 25 3rc | filled-new-array/range {vCCCC .. vNNNN}, type@BBBB | A: অ্যারের সাইজ ও আর্গুমেন্ট শব্দ সংখ্যা (৮ বিট)B: টাইপ ইনডেক্স (১৬ বিট)C: প্রথম আর্গুমেন্ট রেজিস্টার (১৬ বিট)N = A + C - 1 |
প্রদত্ত ধরন ও সাইজের একটি অ্যারে তৈরি করুন এবং
সেটিতে সাপ্লাই করা কন্টেন্ট যোগ করুন। filled-new-array-এর মতো, উপরে বর্ণিত
স্পষ্টীকরণ ও বিধিনিষেধ একই। |
| ২৬ ৩১t | fill-array-data vAA, +BBBBBBBB (with supplemental data as specified
below in "fill-array-data-payload Format") |
A: অ্যারে রেফারেন্স (৮ বিট)B: টেবিল ডেটা সিউডো-ইনস্ট্রাকশনে সাইন করা "ব্রাঞ্চ" অফসেট
(৩২ বিট)
|
প্রদত্ত অ্যারেতে নির্দেশিত ডেটা পূরণ করুন। রেফারেন্সটি অবশ্যই প্রিমিটিভের একটি অ্যারে হতে হবে এবং ডেটা টেবিলটি অবশ্যই টাইপের সাথে মিলতে হবে এবং অ্যারেতে ফিট হওয়ার চেয়ে বেশি এলিমেন্ট থাকা উচিত নয়। অর্থাৎ, অ্যারেটি টেবিলের চেয়ে বড় হতে পারে এবং যদি তাই হয়, তাহলে অ্যারের শুধুমাত্র প্রাথমিক উপাদান সেট করা হয়, বাকিগুলি অপরিবর্তিত থাকে। |
| ২৭ ১১x | throw vAA | A: ব্যতিক্রম-বহনকারী রেজিস্টার (৮ বিট) |
উল্লেখ করা ব্যতিক্রমটি থ্রো করুন। |
| ২৮ ১০ট | goto +AA | A: স্বাক্ষরিত ব্রাঞ্চ অফসেট (৮ বিট) |
উল্লেখ করা নির্দেশাবলী অনুসরণ করুন।
মনে রাখবেন:
ব্রাঞ্চ অফসেট |
| 29 20t | goto/16 +AAAA | A: স্বাক্ষরিত ব্রাঞ্চ অফসেট (১৬ বিট) |
কোনও শর্ত ছাড়াই নির্দেশিত নির্দেশে যান।
মনে রাখবেন:
ব্রাঞ্চ অফসেট |
| 2a 30t | goto/32 +AAAAAAAA | A: স্বাক্ষরিত ব্রাঞ্চ অফসেট (৩২ বিট) |
কোনও শর্ত ছাড়াই নির্দেশিত নির্দেশে যান। |
| 2b 31t | packed-switch vAA, +BBBBBBBB (নিচে "packed-switch-payload ফর্ম্যাট"-এ
উল্লেখ করা সাপ্লিমেন্টাল ডেটা সহ) |
A:টেস্ট করার জন্য রেজিস্টার করুনB: টেবিল ডেটা সিউডো-নির্দেশাবলীতে "ব্রাঞ্চ" অফসেট সই করা হয়েছে
(৩২ বিট)
|
প্রদত্ত রেজিস্টারে থাকা ভ্যালুর উপর ভিত্তি করে নতুন নির্দেশে যান, নির্দিষ্ট ইন্টিগ্রাল রেঞ্জে প্রতিটি ভ্যালুর সাথে সম্পর্কিত অফসেটের টেবিল ব্যবহার করে অথবা কোনও মিল না থাকলে পরবর্তী নির্দেশে যান। |
| 2c 31t | sparse-switch vAA, +BBBBBBBB (with supplemental data as
specified below in "sparse-switch-payload Format") |
A:টেস্ট করার জন্য রেজিস্টার করুনB: টেবিল ডেটা সিউডো-নির্দেশের জন্য "ব্রাঞ্চ" অফসেট সই করা হয়েছে
(৩২ বিট)
|
প্রদত্ত রেজিস্টারে থাকা ভ্যালুর উপর ভিত্তি করে নতুন নির্দেশিকায় জাম্প করুন, ভ্যালু-অফসেট পেয়ারের একটি সাজানো টেবিল ব্যবহার করে অথবা কোনও ম্যাচ না থাকলে পরবর্তী নির্দেশিকায় চলে যান। |
| 2d..31 23x | cmpkind vAA, vBB, vCC 2d: cmpl-float (lt bias) 2e: cmpg-float (gt bias) 2f: cmpl-double (lt bias) 30: cmpg-double (gt bias) 31: cmp-long |
A: ডেস্টিনেশন রেজিস্টার (৮ বিট)B: প্রথম সোর্স রেজিস্টার বা পেয়ারC: দ্বিতীয় সোর্স রেজিস্টার বা পেয়ার |
উল্লিখিত ফ্লোটিং পয়েন্ট বা long তুলনা করুন,
b == c হলে a-কে 0 হিসেবে সেট করুন,
b > c হলে 1 হিসেবে সেট করুন,
অথবা b < c হলে -1 হিসেবে সেট করুন।
ফ্লোটিং পয়েন্ট অপারেশনের জন্য তালিকাভুক্ত "বায়াস"
NaN তুলনা কীভাবে করা হয় তা নির্দেশ করে: "gt বায়াস"
নির্দেশাবলী NaN তুলনা করার জন্য 1 রিটার্ন করে,
এবং "lt বায়াস" নির্দেশাবলী -1 রিটার্ন করে।
যেমন, ফ্লোটিং পয়েন্ট
|
| 32..37 22t | if-test vA, vB, +CCCC 32: if-eq 33: if-ne 34: if-lt 35: if-ge 36: if-gt 37: if-le |
A: প্রথমে পরীক্ষা করার জন্য রেজিস্টার করুন (৪ বিট)B: দ্বিতীয়বার পরীক্ষা করার জন্য রেজিস্টার করুন (৪ বিট)C: স্বাক্ষরিত ব্রাঞ্চ অফসেট (১৬ বিট) |
উল্লেখ করা দুটি রেজিস্টারের ভ্যালু
নির্দিষ্ট করা উপায়ে তুলনা করা হলে, প্রদত্ত গন্তব্যে ব্রাঞ্চ করা হয়।
মনে রাখবেন:
ব্রাঞ্চ অফসেট |
| 38..3d 21t | if-testz vAA, +BBBB 38: if-eqz 39: if-nez 3a: if-ltz 3b: if-gez 3c: if-gtz 3d: if-lez |
A: রেজিস্টার টু টেস্ট (৮ বিট)B: সাইনড ব্রাঞ্চ অফসেট (১৬ বিট) |
উল্লেখ করা রেজিস্টারের ভ্যালু নির্দিষ্ট করা
0-এর সাথে তুলনা করে প্রদত্ত গন্তব্যে ব্রাঞ্চ করুন।
মনে রাখবেন:
ব্রাঞ্চ অফসেট |
| 3e..43 10x | (ব্যবহার করা হয়নি) | (ব্যবহার করা হয়নি) | |
| 44..51 23x | arrayop vAA, vBB, vCC ৪৪: aget ৪৫: aget-wide ৪৬: aget-object ৪৭: aget-boolean ৪৮: aget-byte ৪৯: 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: ইন্ডেক্স রেজিস্টার (৮ বিট) |
প্রদত্ত অ্যারের শনাক্ত করা ইন্ডেক্সে শনাক্ত করা অ্যারে অপারেশনটি পারফর্ম করুন, ভ্যালু রেজিস্টারে লোড বা সেভ করুন। |
| 52..5f 22c | iinstanceop vA, vB, field@CCCC 52: iget 53: iget-wide 54: iget-object 55: iget-boolean 56: iget-byte 57: iget-char 58: iget-short 59: iput 5a: iput-wide 5b: iput-object 5c: iput-boolean 5d: iput-byte 5e: iput-char 5f: iput-short |
A: ভ্যালু রেজিস্টার বা পেয়ার; সোর্স বা ডেস্ট হতে পারে
(৪ বিট)B: অবজেক্ট রেজিস্টার (৪ বিট)C: ইনস্ট্যান্স ফিল্ড রেফারেন্স ইন্ডেক্স (১৬ বিট) |
শনাক্ত করা ফিল্ডের সাথে শনাক্ত করা অবজেক্ট ইনস্ট্যান্স ফিল্ড অপারেশন পারফর্ম করুন, ভ্যালু রেজিস্টারে লোড বা স্টোর করুন।
মনে রাখবেন: এই অপকোডগুলি স্ট্যাটিক লিঙ্কিংয়ের জন্য উপযুক্ত, ফিল্ড আর্গুমেন্ট পরিবর্তন করে আরও সরাসরি অফসেট করা। |
| 60..6d 21c | sstaticop vAA, field@BBBB 60: sget 61: sget-wide 62: sget-object 63: sget-boolean 64: sget-byte 65: sget-char 66: sget-short 67: sput 68: sput-wide 69: sput-object 6a: sput-boolean 6b: sput-byte 6c: sput-char 6d: sput-short |
A: ভ্যালু রেজিস্টার বা পেয়ার; সোর্স বা ডেস্ট হতে পারে
(৮ বিট)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* ভেরিয়েন্টের সাথে
পরবর্তী নির্দেশ হিসেবে
সেভ করা হতে পারে।
Dex ফাইল ভার্সন
মনে রাখবেন: এই অপকোডগুলি স্ট্যাটিক লিঙ্কিংয়ের জন্য উপযুক্ত, মেথড আর্গুমেন্টকে আরও সরাসরি অফসেট হিসেবে পরিবর্তন করা (বা সেগুলির পেয়ার)। |
| ৭৩ ১০x | (ব্যবহার করা হয়নি) | (ব্যবহার করা হয়নি) | |
| 74..78 3rc | invoke-kind/range {vCCCC .. vNNNN}, meth@BBBB 74: invoke-virtual/range 75: invoke-super/range 76: invoke-direct/range 77: invoke-static/range 78: invoke-interface/range |
A: আর্গুমেন্ট শব্দ সংখ্যা (৮ বিট)B: মেথড রেফারেন্স ইন্ডেক্স (১৬ বিট)C: প্রথম আর্গুমেন্ট রেজিস্টার (১৬ বিট)N = A + C - 1 |
উল্লেখ করা মেথড কল করুন। বিবরণ, সতর্কতা ও সাজেশন সম্পর্কে জানতে, উপরে দেওয়া invoke-kind
বিবরণ দেখুন।
|
| 79..7a 10x | (ব্যবহার করা হয়নি) | (ব্যবহার করা হয়নি) | |
| 7b..8f 12x | unop vA, vB 7b: neg-int 7c: not-int 7d: neg-long 7e: not-long 7f: neg-float 80: neg-double 81: int-to-long 82: int-to-float 83: int-to-double 84: long-to-int 85: long-to-float 86: long-to-double 87: float-to-int 88: float-to-long 89: float-to-double 8a: double-to-int 8b: double-to-long 8c: double-to-float 8d: int-to-byte 8e: int-to-char 8f: int-to-short |
A: গন্তব্য রেজিস্টার বা পেয়ার (৪ বিট)B: সোর্স রেজিস্টার বা পেয়ার (৪ বিট) |
সোর্স রেজিস্টারে শনাক্ত করা unary অপারেশনটি পারফর্ম করুন, ফলাফলটি ডেস্টিনেশন রেজিস্টারে সেভ করুন। |
| 90..af 23x | binop vAA, vBB, vCC 90: add-int 91: sub-int 92: mul-int 93: div-int 94: rem-int 95: and-int 96: or-int 97: xor-int 98: shl-int 99: shr-int 9a: ushr-int 9b: add-long 9c: sub-long 9d: mul-long 9e: div-long 9f: rem-long a0: and-long a1: or-long a2: xor-long a3: shl-long a4: shr-long a5: ushr-long a6: add-float a7: sub-float a8: mul-float a9: div-float aa: rem-float ab: add-double ac: sub-double ad: mul-double ae: div-double af: rem-double |
A: গন্তব্য রেজিস্টার বা পেয়ার (৮ বিট)B: প্রথম সোর্স রেজিস্টার বা পেয়ার (৮ বিট)C: দ্বিতীয় সোর্স রেজিস্টার বা পেয়ার (৮ বিট) |
দুটি সোর্স রেজিস্টারে শনাক্ত করা বাইনারি অপারেশন পারফর্ম করে,
ফলাফলটি ডেস্টিনেশন রেজিস্টারে স্টোর করে।
মনে রাখবেন:
অন্যান্য |
| 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: দ্বিতীয় সোর্স রেজিস্টার বা পেয়ার (৪ বিট) |
দুটি সোর্স রেজিস্টারে চিহ্নিত বাইনারি অপারেশন পারফর্ম করুন,
প্রথম সোর্স রেজিস্টারে ফলাফল স্টোর করুন।
মনে রাখবেন:
অন্যান্য |
| 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: সাইন করা 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: সাইন করা 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 ডকুমেন্টেশনে
ব্যতিক্রমগুলি বর্ণনা করা হয়েছে।038 ও তার পরের ভার্সন থেকে Dex ফাইলে উপস্থিত।
|
| 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-এর ক্ষেত্রেও এটি প্রযোজ্য:
038 ও তার পরের যেকোনও ভার্সনের Dex ফাইলে উপস্থিত।
|
| fd 3rc | invoke-custom/range {vCCCC .. vNNNN}, call_site@BBBB |
A: আর্গুমেন্ট শব্দ সংখ্যা (৮ বিট) B: কল সাইট রেফারেন্স ইনডেক্স (১৬ বিট) C: প্রথম আর্গুমেন্ট রেজিস্টার (১৬-বিট) N = A + C - 1
|
কল সাইট সংক্রান্ত সমস্যার সমাধান করুন এবং কল সাইট ইনভোক করুন। আরও বিবরণের জন্য উপরে দেওয়া invoke-custom
বিবরণ দেখুন।038 এবং তার পরবর্তী ভার্সনের Dex ফাইলে উপস্থিত।
|
| 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 ফাইলে উপস্থিত।
|
প্যাক করা-সুইচ-পেলোড ফর্ম্যাট
| নাম | ফর্ম্যাট | বর্ণনা |
|---|---|---|
| ident | ushort = 0x0100 | সিউডো-অপকোড শনাক্ত করা হচ্ছে |
| সাইজ | ushort | টেবিলে এন্ট্রির সংখ্যা |
| first_key | int | প্রথম (এবং সবচেয়ে কম) সুইচ কেস ভ্যালু |
| টার্গেট | 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 Semantics | নোট |
|---|---|---|
| neg-int | int32 a; int32 result = -a; |
একক দুইয়ের পরিপূরক। |
| not-int | int32 a; int32 result = ~a; |
একক পরিপূরক। |
| neg-long | int64 a; int64 result = -a; |
একক দুইয়ের পরিপূরক। |
| বেশি সময় ধরে নয় | int64 a; int64 result = ~a; |
একক পরিপূরক। |
| neg-float | float a; float result = -a; |
ফ্লোটিং পয়েন্ট নেগেশন। |
| neg-double | double a; double result = -a; |
ফ্লোটিং পয়েন্ট নেগেশন। |
| int-to-long | int32 a; int64 result = (int64) a; |
int32-এর এক্সটেনশন int64-এ সাইন-ইন করুন। |
| int-to-float | int32 a; float result = (float) a; |
int32 থেকে float-এ কনভার্সন, এর মাধ্যমে
নিকটতম পূর্ণসংখ্যায় পরিণত করা। এর ফলে কিছু ভ্যালুর ক্ষেত্রে যথাযথতা কমে যায়।
|
| int-to-double | int32 a; double result = (double) a; |
int32 থেকে double-এ কনভার্সন। |
| long-to-int | int64 a; int32 result = (int32) a; |
int64-কে int32-এ ট্রাঙ্কেট করা। |
| লং-টু-ফ্লোট | int64 a; float result = (float) a; |
int64 থেকে float-এ কনভার্সন, নিকটতম পূর্ণসংখ্যায় পরিণত করার পদ্ধতি ব্যবহার করে। এর ফলে কিছু ভ্যালুর ক্ষেত্রে নির্ভুলতা কমে যায়।
|
| লং-টু-ডবল | int64 a; double result = (double) a; |
int64 থেকে double-এ কনভার্সন, এর মাধ্যমে
নিকটতম পূর্ণসংখ্যায় পরিণত করা। এর ফলে কিছু ভ্যালুর ক্ষেত্রে নির্ভুলতা কমে যায়।
|
| float-to-int | float a; int32 result = (int32) a; |
float থেকে int32-এ কনভার্সন, এর মাধ্যমে
শূন্যের দিকে রাউন্ড করা। NaN ও -0.0 (নেগেটিভ জিরো)
পূর্ণসংখ্যা 0-এ কনভার্ট হয়। অসীম মান এবং মানগুলি
প্রতিনিধিত্ব করার জন্য খুব বড় ম্যাগনিটিউড হলে সেগুলি চিহ্ন অনুসারে
0x7fffffff বা -0x80000000-এ রূপান্তরিত হয়।
|
| float-to-long | float a; int64 result = (int64) a; |
float থেকে int64-এ কনভার্সন, এর মাধ্যমে
শূন্যের দিকে রাউন্ড করা। এখানেও
float-to-int-এর মতো একই বিশেষ কেস সংক্রান্ত নিয়ম প্রযোজ্য, তবে রেঞ্জের বাইরে থাকা ভ্যালু
সাইন অনুযায়ী 0x7fffffffffffffff বা
-0x8000000000000000-এ কনভার্ট হয়ে যায়।
|
| ফ্লোট-টু-ডবল | float 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 পর্যন্ত ট্রানকেশন, সাইন
ফলাফল এক্সটেন্ড করা।
|
| int-to-char | int32 a; int32 result = a & 0xffff; |
int32 থেকে uint16 পর্যন্ত ট্রানকেশন, সাইন এক্সটেনশন
ছাড়াই।
|
| int-to-short | int32 a; int32 result = (a << 16) >> 16; |
int32 থেকে int16 পর্যন্ত ট্রানকেশন, সাইন
ফলাফল এক্সটেন্ড করা।
|
| add-int | int32 a, b; int32 result = a + b; |
টু-কমপ্লিমেন্ট যোগ। |
| sub-int | int32 a, b; int32 result = a - b; |
টু-কমপ্লিমেন্ট বিয়োগ। |
| rsub-int | int32 a, b; int32 result = b - a; |
টু'স কমপ্লিমেন্ট রিভার্স বিয়োগ। |
| mul-int | int32 a, b; int32 result = a * b; |
টু'জ কমপ্লিমেন্ট মাল্টিপ্লিকেশন। |
| div-int | int32 a, b; int32 result = a / b; |
টু-কমপ্লিমেন্ট ডিভিশন, শূন্যের দিকে রাউন্ড করা (অর্থাৎ, পূর্ণসংখ্যায় ট্রানকেট করা)।
এটি ArithmeticException থ্রো করে যদি
b == 0.
|
| rem-int | int32 a, b; int32 result = a % b; |
ভাগ করার পরে টু'জ কমপ্লিমেন্ট অবশিষ্ট। ফলাফলের চিহ্ন
a-এর চিহ্নের মতোই এবং এটি আরও নিখুঁতভাবে
result == a - (a / b) * b হিসেবে সংজ্ঞায়িত করা হয়েছে। এটি
ArithmeticException থ্রো করে যদি b == 0 হয়।
|
| and-int | int32 a, b; int32 result = a & b; |
বিটওয়াইজ AND। |
| or-int | int32 a, b; int32 result = a | b; |
বিটওয়াইজ OR. |
| xor-int | int32 a, b; int32 result = a ^ b; |
বিটওয়াইজ XOR। |
| shl-int | int32 a, b; int32 result = a << (b & 0x1f); |
বিটওয়াইজ শিফ্ট লেফ্ট (মাস্কড আর্গুমেন্ট সহ)। |
| shr-int | int32 a, b; int32 result = a >> (b & 0x1f); |
বিটওয়াইজ সাইনড শিফ্ট রাইট (মাস্কড আর্গুমেন্ট সহ)। |
| ushr-int | uint32 a, b; int32 result = a >> (b & 0x1f); |
বিটওয়াইজ আনসাইনড শিফ্ট ডানদিকে (মাস্ক করা আর্গুমেন্ট সহ)। |
| add-long | int64 a, b; int64 result = a + b; |
টু-কমপ্লিমেন্ট যোগ। |
| সাব-লং | int64 a, b; int64 result = a - b; |
টু-কমপ্লিমেন্ট বিয়োগ। |
| mul-long | int64 a, b; int64 result = a * b; |
টু'জ কমপ্লিমেন্ট মাল্টিপ্লিকেশন। |
| div-long | int64 a, b; int64 result = a / b; |
টু'স কমপ্লিমেন্ট ডিভিশন, শূন্যের দিকে রাউন্ড করা (অর্থাৎ, পূর্ণসংখ্যায় ট্রানকেট করা
হয়)। এটি ArithmeticException থ্রো করে যদি
b == 0.
|
| rem-long | int64 a, b; int64 result = a % b; |
ভাগ করার পরে টু'জ কমপ্লিমেন্ট অবশিষ্ট। ফলাফলের চিহ্ন
a-এর চিহ্নের মতো এবং এটিকে আরও সঠিকভাবে
result == a - (a / b) * b হিসেবে সংজ্ঞায়িত করা হয়েছে। এটি
ArithmeticException থ্রো করে যদি b == 0 হয়।
|
| এবং-দীর্ঘ | int64 a, b; int64 result = a & b; |
বিটওয়াইজ AND। |
| or-long | int64 a, b; int64 result = a | b; |
বিটওয়াইজ OR. |
| xor-long | int64 a, b; int64 result = a ^ b; |
বিটওয়াইজ XOR। |
| shl-long | int64 a; int32 b; int64 result = a << (b & 0x3f); |
বিটওয়াইজ শিফ্ট লেফট (মাস্ক করা আর্গুমেন্ট সহ)। |
| shr-long | int64 a; int32 b; int64 result = a >> (b & 0x3f); |
বিটওয়াইজ সাইনড শিফট রাইট (মাস্ক করা আর্গুমেন্ট সহ)। |
| ushr-long | uint64 a; int32 b; int64 result = a >> (b & 0x3f); |
বিটওয়াইজ আনসাইনড শিফ্ট ডানদিকে (মাস্ক করা আর্গুমেন্ট সহ)। |
| add-float | float a, b; float result = a + b; |
ফ্লোটিং পয়েন্ট যোগ করা। |
| সাব-ফ্লোট | float a, b; float result = a - b; |
ফ্লোটিং পয়েন্ট বিয়োগ। |
| mul-float | float a, b; float result = a * b; |
ফ্লোটিং পয়েন্ট মাল্টিপ্লিকেশন। |
| div-float | float a, b; float result = a / b; |
ফ্লোটিং পয়েন্ট ডিভিশন। |
| rem-float | float a, b; float result = a % b; |
ভাগ করার পরে ফ্লটিং পয়েন্টের অবশিষ্ট। এই ফাংশনটি IEEE 754 ভাগশেষের থেকে আলাদা
এবং এটিকে এইভাবে সংজ্ঞায়িত করা হয়:
result == a - roundTowardZero(a / b) * b.
|
| add-double | double a, b; double result = a + b; |
ফ্লোটিং পয়েন্ট যোগ করা। |
| সাব-ডবল | double a, b; double result = a - b; |
ফ্লোটিং পয়েন্ট বিয়োগ। |
| mul-double | double a, b; double result = a * b; |
ফ্লোটিং পয়েন্ট মাল্টিপ্লিকেশন। |
| div-double | double a, b; double result = a / b; |
ফ্লোটিং পয়েন্ট ডিভিশন। |
| rem-double | double a, b; double result = a % b; |
ভাগ করার পরে ফ্লোটিং পয়েন্ট ভাগশেষ। এই ফাংশনটি IEEE 754 ভাগশেষের থেকে আলাদা
এবং এটিকে এইভাবে সংজ্ঞায়িত করা হয়:
result == a - roundTowardZero(a / b) * b.
|