ডালভিক বাইটকোড

সাধারণ নকশা

  • মেশিন মডেল এবং কলিং কনভেনশনগুলি প্রায় সাধারণ বাস্তব আর্কিটেকচার এবং সি-স্টাইল কলিং কনভেনশনগুলি অনুকরণ করার জন্য বোঝানো হয়েছে:
    • মেশিনটি রেজিস্টার-ভিত্তিক, এবং ফ্রেম তৈরির সময় আকারে স্থির করা হয়। প্রতিটি ফ্রেমে একটি নির্দিষ্ট সংখ্যক রেজিস্টার (পদ্ধতি দ্বারা নির্দিষ্ট) এবং সেই সাথে পদ্ধতিটি চালানোর জন্য প্রয়োজনীয় যেকোন সহায়ক ডেটা থাকে, যেমন (তবে সীমাবদ্ধ নয়) প্রোগ্রাম কাউন্টার এবং .dex ফাইলের একটি রেফারেন্স যাতে পদ্ধতিটি রয়েছে। .
    • যখন বিট মানগুলির জন্য ব্যবহার করা হয় (যেমন পূর্ণসংখ্যা এবং ফ্লোটিং পয়েন্ট সংখ্যা), তখন রেজিস্টারগুলি 32 বিট প্রশস্ত হিসাবে বিবেচিত হয়। সংলগ্ন রেজিস্টার জোড়া 64-বিট মানের জন্য ব্যবহৃত হয়। রেজিস্টার জোড়া জন্য কোন প্রান্তিককরণ প্রয়োজন নেই.
    • অবজেক্ট রেফারেন্সের জন্য যখন ব্যবহার করা হয়, তখন রেজিস্টারগুলিকে ঠিক এরকম একটি রেফারেন্স রাখার জন্য যথেষ্ট প্রশস্ত বলে মনে করা হয়।
    • বিটওয়াইজ উপস্থাপনের ক্ষেত্রে, (Object) null == (int) 0
    • ক্রম অনুসারে পদ্ধতির আমন্ত্রণ ফ্রেমের শেষ N রেজিস্টারে একটি পদ্ধতিতে N আর্গুমেন্ট রয়েছে। প্রশস্ত আর্গুমেন্ট দুটি রেজিস্টার গ্রাস করে। উদাহরণ পদ্ধতি একটি তাদের প্রথম যুক্তি হিসাবে this রেফারেন্স পাস করা হয়.
  • নির্দেশ প্রবাহে স্টোরেজ ইউনিট হল একটি 16-বিট স্বাক্ষরবিহীন পরিমাণ। কিছু নির্দেশাবলীর কিছু বিট উপেক্ষা করা হয়/অবশ্যই শূন্য।
  • নির্দেশাবলী অকারণে একটি নির্দিষ্ট ধরণের মধ্যে সীমাবদ্ধ নয়। উদাহরণস্বরূপ, নির্দেশাবলী যা ব্যাখ্যা ছাড়াই 32-বিট রেজিস্টার মানগুলিকে স্থানান্তরিত করে সেগুলিকে ints বা ফ্লোটগুলি চলন্ত কিনা তা নির্দিষ্ট করতে হবে না।
  • স্ট্রিং, প্রকার, ক্ষেত্র এবং পদ্ধতির রেফারেন্সের জন্য আলাদাভাবে গণনা করা এবং সূচীকৃত ধ্রুবক পুল রয়েছে।
  • বিটওয়াইজ আক্ষরিক ডেটা নির্দেশ স্ট্রীমে ইন-লাইন উপস্থাপন করা হয়।
  • কারণ, বাস্তবে, একটি পদ্ধতির জন্য 16টির বেশি রেজিস্টারের প্রয়োজন হওয়া অস্বাভাবিক, এবং যেহেতু আটটির বেশি রেজিস্টারের প্রয়োজন যুক্তিসঙ্গতভাবে সাধারণ, অনেক নির্দেশাবলী শুধুমাত্র প্রথম 16টি রেজিস্টারকে সম্বোধন করার জন্য সীমাবদ্ধ। যখন যুক্তিসঙ্গতভাবে সম্ভব, নির্দেশাবলী প্রথম 256টি রেজিস্টার পর্যন্ত রেফারেন্সের অনুমতি দেয়। এছাড়াও, কিছু নির্দেশাবলীর ভেরিয়েন্ট রয়েছে যা অনেক বড় রেজিস্টার গণনার জন্য অনুমতি দেয়, যার মধ্যে এক জোড়া ক্যাচ-অল move নির্দেশাবলী রয়েছে যা v0v65535 রেঞ্জের রেজিস্টারগুলিকে সম্বোধন করতে পারে। এমন ক্ষেত্রে যেখানে একটি পছন্দসই রেজিস্টারের ঠিকানা দেওয়ার জন্য একটি নির্দেশের বৈকল্পিক উপলব্ধ নয়, এটি প্রত্যাশিত যে রেজিস্টারের বিষয়বস্তুগুলি মূল রেজিস্টার থেকে একটি নিম্ন রেজিস্টারে (অপারেশনের আগে) এবং/অথবা নিম্ন ফলাফলের রেজিস্টার থেকে উচ্চে স্থানান্তরিত হবে। নিবন্ধন (অপারেশনের পরে)।
  • বেশ কিছু "ছদ্ম-নির্দেশ" আছে যা পরিবর্তনশীল-দৈর্ঘ্যের ডেটা পেলোডগুলি ধরে রাখতে ব্যবহৃত হয়, যা নিয়মিত নির্দেশাবলী দ্বারা উল্লেখ করা হয় (উদাহরণস্বরূপ, fill-array-data )। এই ধরনের নির্দেশাবলী কার্যকর করার স্বাভাবিক প্রবাহের সময় কখনই সম্মুখীন হতে হবে না। উপরন্তু, নির্দেশাবলী অবশ্যই সমান-সংখ্যাযুক্ত বাইটকোড অফসেটগুলিতে অবস্থিত হওয়া আবশ্যক (অর্থাৎ, 4-বাইট সারিবদ্ধ)। এই প্রয়োজনীয়তা পূরণ করার জন্য, ডেক্স জেনারেশন টুলগুলিকে স্পেসার হিসাবে একটি অতিরিক্ত nop নির্দেশনা নির্গত করতে হবে যদি এই ধরনের নির্দেশ অন্যথায় আনলাইন করা হয়। অবশেষে, যদিও প্রয়োজন নেই, এটা প্রত্যাশিত যে বেশিরভাগ টুল পদ্ধতির শেষে এই নির্দেশগুলি নির্গত করতে বেছে নেবে, কারণ অন্যথায় এটি এমন হতে পারে যে তাদের চারপাশে শাখার জন্য অতিরিক্ত নির্দেশাবলীর প্রয়োজন হবে।
  • একটি চলমান সিস্টেমে ইনস্টল করা হলে, কিছু নির্দেশাবলী পরিবর্তন করা হতে পারে, তাদের বিন্যাস পরিবর্তন করে, একটি ইনস্টল-টাইম স্ট্যাটিক লিঙ্কিং অপ্টিমাইজেশান হিসাবে। লিঙ্কেজ জানা হয়ে গেলে এটি দ্রুত কার্যকর করার অনুমতি দেওয়ার জন্য। প্রস্তাবিত রূপগুলির জন্য সংশ্লিষ্ট নির্দেশ বিন্যাস নথি দেখুন। "প্রস্তাবিত" শব্দটি পরামর্শের সাথে ব্যবহার করা হয়; এগুলো বাস্তবায়ন করা বাধ্যতামূলক নয়।
  • মানব-সিনট্যাক্স এবং স্মৃতিবিদ্যা:
    • আর্গুমেন্টের জন্য গন্তব্য-তখন-উৎস ক্রম।
    • কিছু অপকোডের একটি দ্ব্যর্থহীন নাম প্রত্যয় রয়েছে যা তারা যে প্রকারে কাজ করে তা নির্দেশ করে:
      • টাইপ-সাধারণ 32-বিট অপকোডগুলি অচিহ্নিত।
      • টাইপ-জেনারেল 64-বিট অপকোড-এর সাথে প্রত্যয় যুক্ত হয় -wide
      • টাইপ-নির্দিষ্ট অপকোডগুলি তাদের টাইপের সাথে প্রত্যয়িত হয় (বা একটি সরল সংক্ষেপ), যার মধ্যে একটি: -boolean -byte -char -short -int -long -float -double -object -string -class -void
    • কিছু অপকোডের অন্যথায়-অভিন্ন ক্রিয়াকলাপগুলিকে আলাদা করার জন্য একটি দ্ব্যর্থহীন প্রত্যয় রয়েছে যেখানে বিভিন্ন নির্দেশ বিন্যাস বা বিকল্প রয়েছে। এই প্রত্যয়গুলিকে একটি স্ল্যাশ (" / ") দিয়ে প্রধান নাম থেকে পৃথক করা হয়েছে এবং প্রধানত বিদ্যমান থাকে যাতে কোডে স্ট্যাটিক ধ্রুবকগুলির সাথে এক-টু-ওয়ান ম্যাপিং থাকে যা এক্সিকিউটেবল তৈরি করে এবং ব্যাখ্যা করে (অর্থাৎ, অস্পষ্টতা কমাতে) মানুষের জন্য)।
    • এখানে বর্ণনায়, একটি মানের প্রস্থ (উদাহরণস্বরূপ, একটি ধ্রুবকের পরিসীমা বা সম্ভাব্যভাবে সম্বোধন করা নিবন্ধন সংখ্যা) প্রতি চার বিট প্রস্থে একটি অক্ষর ব্যবহার করে জোর দেওয়া হয়েছে।
    • উদাহরণস্বরূপ, নির্দেশে " move-wide/from16 vAA, vBBBB ":
      • " move " হল বেস অপকোড, বেস অপারেশন নির্দেশ করে (একটি রেজিস্টারের মান সরান)।
      • " wide " হল নাম প্রত্যয়, ইঙ্গিত করে যে এটি প্রশস্ত (64 বিট) ডেটাতে কাজ করে।
      • " from16 " হল opcode প্রত্যয়, একটি বৈকল্পিক নির্দেশ করে যার একটি উৎস হিসেবে 16-বিট রেজিস্টার রেফারেন্স রয়েছে।
      • " vAA " হল গন্তব্য রেজিস্টার (অপারেশন দ্বারা উহ্য; আবার, নিয়ম হল যে গন্তব্য আর্গুমেন্ট সর্বদা প্রথমে আসে), যা অবশ্যই v0v255 রেঞ্জের মধ্যে থাকতে হবে।
      • " vBBBB " হল সোর্স রেজিস্টার, যা অবশ্যই v0v65535 রেঞ্জের মধ্যে থাকতে হবে।
  • বিভিন্ন নির্দেশ বিন্যাস ("অপ এবং ফরম্যাট"-এর অধীনে তালিকাভুক্ত) এবং অপকোড সিনট্যাক্স সম্পর্কে বিশদ বিবরণের জন্য নির্দেশ বিন্যাস নথি দেখুন।
  • বাইটকোডটি বড় ছবিতে কোথায় ফিট করে সে সম্পর্কে আরও বিশদ বিবরণের জন্য .dex ফাইল বিন্যাস নথিটি দেখুন।

বাইটকোড সেটের সারাংশ

অপশন এবং ফরম্যাট স্মৃতিবিদ্যা / সিনট্যাক্স যুক্তি বর্ণনা
00 10x না বর্জ্য চক্র।

দ্রষ্টব্য: ডেটা-বহনকারী ছদ্ম-নির্দেশগুলি এই অপকোডের সাথে ট্যাগ করা হয়েছে, এই ক্ষেত্রে অপকোড ইউনিটের হাই-অর্ডার বাইট ডেটার প্রকৃতি নির্দেশ করে। নীচে " 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 move-wide/from16 vAA, vBBBB A: গন্তব্য রেজিস্টার জোড়া (8 বিট)
B: সোর্স রেজিস্টার পেয়ার (16 বিট)
একটি রেজিস্টার-জোড়ার বিষয়বস্তু অন্যটিতে সরান।

দ্রষ্টব্য: বাস্তবায়নের বিবেচ্যগুলি উপরে, move-wide হিসাবে একই।

06 32x move-wide/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: স্বাক্ষরিত int (4 বিট)
নির্দিষ্ট রেজিস্টারে প্রদত্ত আক্ষরিক মান (চিহ্ন-প্রসারিত 32 বিটে) সরান।
13 21 সে const/16 vAA, #+BBBB A: গন্তব্য রেজিস্টার (8 বিট)
B: স্বাক্ষরিত int (16 বিট)
নির্দিষ্ট রেজিস্টারে প্রদত্ত আক্ষরিক মান (চিহ্ন-প্রসারিত 32 বিটে) সরান।
14 31i const vAA, #+BBBBBBBB A: গন্তব্য রেজিস্টার (8 বিট)
B: নির্বিচারে 32-বিট ধ্রুবক
প্রদত্ত আক্ষরিক মানটি নির্দিষ্ট রেজিস্টারে সরান।
15 21 ঘন্টা const/high16 vAA, #+BBBB0000 A: গন্তব্য রেজিস্টার (8 বিট)
B: স্বাক্ষরিত int (16 বিট)
প্রদত্ত আক্ষরিক মান (ডান-শূন্য-32 বিটে প্রসারিত) নির্দিষ্ট রেজিস্টারে সরান।
16 21 সে const-wide/16 vAA, #+BBBB A: গন্তব্য রেজিস্টার (8 বিট)
B: স্বাক্ষরিত int (16 বিট)
প্রদত্ত আক্ষরিক মান (চিহ্ন-প্রসারিত 64 বিট) নির্দিষ্ট রেজিস্টার-জোড়ায় সরান।
17 31i const-wide/32 vAA, #+BBBBBBBB A: গন্তব্য রেজিস্টার (8 বিট)
B: স্বাক্ষরিত int (32 বিট)
প্রদত্ত আক্ষরিক মান (চিহ্ন-প্রসারিত 64 বিট) নির্দিষ্ট রেজিস্টার-জোড়ায় সরান।
18 51 লি const-wide vAA, #+BBBBBBBBBBBBBBBB A: গন্তব্য রেজিস্টার (8 বিট)
B: নির্বিচারে দ্বিগুণ-প্রস্থ (64-বিট) ধ্রুবক
প্রদত্ত আক্ষরিক মানটি নির্দিষ্ট রেজিস্টার-জোড়ায় সরান।
19 21 ঘন্টা const-wide/high16 vAA, #+BBBB000000000000 A: গন্তব্য রেজিস্টার (8 বিট)
B: স্বাক্ষরিত int (16 বিট)
প্রদত্ত আক্ষরিক মান (ডান-শূন্য-64 বিটে প্রসারিত) নির্দিষ্ট রেজিস্টার-জোড়ায় সরান।
1a 21c const-স্ট্রিং vAA, string@BBBB A: গন্তব্য রেজিস্টার (8 বিট)
B: স্ট্রিং ইনডেক্স
নির্দিষ্ট রেজিস্টারে প্রদত্ত সূচক দ্বারা নির্দিষ্ট করা স্ট্রিংয়ের একটি রেফারেন্স সরান।
1b 31c const-string/jumbo vAA, string@BBBBBBBB A: গন্তব্য রেজিস্টার (8 বিট)
B: স্ট্রিং ইনডেক্স
নির্দিষ্ট রেজিস্টারে প্রদত্ত সূচক দ্বারা নির্দিষ্ট করা স্ট্রিংয়ের একটি রেফারেন্স সরান।
1c 21c const-শ্রেণীর vAA, টাইপ@BBBB A: গন্তব্য রেজিস্টার (8 বিট)
B: টাইপ ইনডেক্স
নির্দিষ্ট রেজিস্টারে প্রদত্ত সূচক দ্বারা নির্দিষ্ট শ্রেণির একটি রেফারেন্স সরান। যে ক্ষেত্রে নির্দেশিত প্রকারটি আদিম, এটি আদিম প্রকারের অধঃপতিত শ্রেণীর একটি রেফারেন্স সংরক্ষণ করবে।
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 সবসময় একটি রেফারেন্স হতে হবে (এবং একটি আদিম মান নয়), এটি সর্বদা 0 সংরক্ষণ করা হবে যদি C একটি আদিম প্রকারকে বোঝায়।

21 12x অ্যারে-দৈর্ঘ্য vA, vB A: গন্তব্য রেজিস্টার (4 বিট)
B: অ্যারে রেফারেন্স-বিয়ারিং রেজিস্টার (4 বিট)
প্রদত্ত গন্তব্যে স্টোর করুন এন্ট্রিতে নির্দেশিত অ্যারের দৈর্ঘ্য নিবন্ধন করুন
22 21 গ নতুন-ইনস্ট্যান্স vAA, টাইপ@BBBB A: গন্তব্য রেজিস্টার (8 বিট)
B: টাইপ ইনডেক্স
গন্তব্যে এটির একটি রেফারেন্স সংরক্ষণ করে নির্দেশিত প্রকারের একটি নতুন উদাহরণ তৈরি করুন। টাইপ একটি নন-অ্যারে ক্লাস উল্লেখ করতে হবে।
23 22c new-array vA, vB, type@CCCC A: গন্তব্য রেজিস্টার (4 বিট)
B: সাইজ রেজিস্টার
C: টাইপ ইনডেক্স
নির্দেশিত প্রকার এবং আকারের একটি নতুন অ্যারে তৈরি করুন। ধরনটি অবশ্যই একটি অ্যারের প্রকার হতে হবে।
24 35 গ ভর্তি-নতুন-অ্যারে {vC, vD, vE, vF, vG}, type@BBBB A: অ্যারের আকার এবং আর্গুমেন্ট শব্দ সংখ্যা (4 বিট)
B: টাইপ ইনডেক্স (16 বিট)
C..G: আর্গুমেন্ট রেজিস্টার (প্রতিটি 4 বিট)
প্রদত্ত প্রকার এবং আকারের একটি অ্যারে তৈরি করুন, সরবরাহকৃত বিষয়বস্তু দিয়ে এটি পূরণ করুন। ধরনটি অবশ্যই একটি অ্যারের প্রকার হতে হবে। অ্যারের বিষয়বস্তু অবশ্যই একক-শব্দ হতে হবে (অর্থাৎ, long বা double কোনো অ্যারে নয়, তবে রেফারেন্স প্রকার গ্রহণযোগ্য)। নির্মাণকৃত দৃষ্টান্তটি "ফলাফল" হিসাবে সংরক্ষণ করা হয় যেভাবে পদ্ধতি আহ্বানের নির্দেশাবলী তাদের ফলাফলগুলি সঞ্চয় করে, তাই নির্মিত উদাহরণটি অবিলম্বে পরবর্তী move-result-object নির্দেশ সহ একটি রেজিস্টারে স্থানান্তরিত করা আবশ্যক (যদি এটি ব্যবহার করা হয়) )
25 3rc ভর্তি-নতুন-অ্যারে/রেঞ্জ {vCCCC .. vNNNN}, type@BBBB A: অ্যারের আকার এবং আর্গুমেন্ট শব্দ সংখ্যা (8 বিট)
B: টাইপ ইনডেক্স (16 বিট)
C: প্রথম আর্গুমেন্ট রেজিস্টার (16 বিট)
N = A + C - 1
প্রদত্ত প্রকার এবং আকারের একটি অ্যারে তৈরি করুন, সরবরাহকৃত বিষয়বস্তু দিয়ে এটি পূরণ করুন। স্পষ্টীকরণ এবং সীমাবদ্ধতাগুলি উপরে বর্ণিত filled-new-array মতোই।
26 31 টি ফিল-অ্যারে-ডেটা vAA, +BBBBBBBB (নিচে " fill-array-data-payload ফরম্যাটে" উল্লেখ করা সম্পূরক ডেটা সহ) A: অ্যারে রেফারেন্স (8 বিট)
B: সাক্ষরিত "শাখা" অফসেট সারণী ডেটা সিউডো-নির্দেশনা (32 বিট)
নির্দেশিত ডেটা দিয়ে প্রদত্ত অ্যারেটি পূরণ করুন। রেফারেন্সটি অবশ্যই প্রাইমিটিভের একটি অ্যারের হতে হবে এবং ডেটা টেবিলটি অবশ্যই এটির প্রকারের সাথে মেলে এবং অ্যারেতে ফিট হওয়ার চেয়ে বেশি উপাদান থাকবে না। অর্থাৎ, অ্যারেটি টেবিলের চেয়ে বড় হতে পারে এবং যদি তাই হয়, তবে কেবলমাত্র অ্যারের প্রাথমিক উপাদানগুলি সেট করা হয়, বাকিগুলিকে একা রেখে।
27 11x vAA নিক্ষেপ A: ব্যতিক্রম-বহনকারী রেজিস্টার (8 বিট)
নির্দেশিত ব্যতিক্রম নিক্ষেপ.
28 10t +AA যান A: স্বাক্ষরিত শাখা অফসেট (8 বিট) নিঃশর্তভাবে নির্দেশিত নির্দেশে ঝাঁপ দাও।

দ্রষ্টব্য: শাখা অফসেট 0 হতে হবে না। (একটি স্পিন লুপ আইনত goto/32 দিয়ে তৈরি করা যেতে পারে বা শাখার আগে একটি লক্ষ্য হিসাবে একটি nop অন্তর্ভুক্ত করে।)

29 20t goto/16 +AAAA A: স্বাক্ষরিত শাখা অফসেট (16 বিট)
নিঃশর্তভাবে নির্দেশিত নির্দেশে ঝাঁপ দাও।

দ্রষ্টব্য: শাখা অফসেট 0 হতে হবে না। (একটি স্পিন লুপ আইনত goto/32 দিয়ে তৈরি করা যেতে পারে বা শাখার আগে একটি লক্ষ্য হিসাবে একটি nop অন্তর্ভুক্ত করে।)

2a 30t goto/32 +AAAAAAAA A: স্বাক্ষরিত শাখা অফসেট (32 বিট)
নিঃশর্তভাবে নির্দেশিত নির্দেশে ঝাঁপ দাও।
2b 31t প্যাকড-সুইচ vAA, +BBBBBBBB (নিচে " packed-switch-payload ফর্ম্যাটে" উল্লেখ করা সম্পূরক ডেটা সহ) A: পরীক্ষার জন্য নিবন্ধন করুন
B: সাক্ষরিত "শাখা" অফসেট সারণী ডেটা সিউডো-নির্দেশনা (32 বিট)
একটি নির্দিষ্ট অবিচ্ছেদ্য পরিসরে প্রতিটি মানের সাথে সামঞ্জস্যপূর্ণ অফসেটগুলির একটি টেবিল ব্যবহার করে প্রদত্ত রেজিস্টারের মানের উপর ভিত্তি করে একটি নতুন নির্দেশে যান, অথবা কোন মিল না থাকলে পরবর্তী নির্দেশে যান।
2c 31t sparse-switch vAA, +BBBBBBBB (নিচে " sparse-switch-payload Format" এ উল্লেখিত সম্পূরক ডেটা সহ) A: পরীক্ষার জন্য নিবন্ধন করুন
B: সাক্ষরিত "শাখা" অফসেট সারণী ডেটা সিউডো-নির্দেশনা (32 বিট)
মান-অফসেট জোড়ার একটি অর্ডার করা টেবিল ব্যবহার করে প্রদত্ত রেজিস্টারের মানের উপর ভিত্তি করে একটি নতুন নির্দেশে যান, অথবা কোনো মিল না থাকলে পরবর্তী নির্দেশে যান।
2d..31 23x cmp ধরনের vAA, vBB, vCC
2d: cmpl-float (lt বায়াস)
2e: cmpg-float (gt বায়াস)
2f: cmpl-ডাবল (lt বায়াস)
30: cmpg-ডাবল (gt বায়াস)
31: cmp-লম্বা
A: গন্তব্য রেজিস্টার (8 বিট)
B: প্রথম সোর্স রেজিস্টার বা পেয়ার
C: দ্বিতীয় উৎস রেজিস্টার বা পেয়ার
নির্দেশিত ফ্লোটিং পয়েন্ট বা long তুলনা সম্পাদন করুন, a সেট করুন 0 যদি b == c , 1 যদি b > c , অথবা -1 যদি b < c । ফ্লোটিং পয়েন্ট ক্রিয়াকলাপগুলির জন্য তালিকাভুক্ত "পক্ষপাত" নির্দেশ করে যে কীভাবে NaN তুলনাগুলি আচরণ করা হয়: "gt পক্ষপাত" নির্দেশাবলী NaN তুলনার জন্য 1 প্রদান করে এবং "lt পক্ষপাত" নির্দেশাবলী -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: if-nez
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-বস্তু
47: বয়স-বুলিয়ান
48: এজেট-বাইট
49: aget-char
4a: বয়স-সংক্ষিপ্ত
4b: aput
4c: aput-ওয়াইড
4d: aput-অবজেক্ট
4e: aput-বুলিয়ান
4f: aput-byte
50: অপুট-চর
51: aput-short
A: মান নিবন্ধন বা জোড়া; উৎস বা গন্তব্য হতে পারে (8 বিট)
B: অ্যারে রেজিস্টার (8 বিট)
C: ইনডেক্স রেজিস্টার (8 বিট)
প্রদত্ত অ্যারের চিহ্নিত সূচকে চিহ্নিত অ্যারে অপারেশন সম্পাদন করুন, মান রেজিস্টারে লোড করা বা সঞ্চয় করা।
52..5f 22c i instanceop vA, vB, field@CCCC
52: iget
53: iget-ওয়াইড
54: iget-অবজেক্ট
55: iget-বুলিয়ান
56: iget-বাইট
57: iget-char
58: iget-ছোট
59: আইপুট
5a: আইপুট-ওয়াইড
5b: iput-অবজেক্ট
5c: iput-বুলিয়ান
5d: iput-byte
5e: iput-char
5f: iput-short
A: মান নিবন্ধন বা জোড়া; উৎস বা গন্তব্য হতে পারে (4 বিট)
B: অবজেক্ট রেজিস্টার (4 বিট)
C: উদাহরণ ক্ষেত্র রেফারেন্স সূচক (16 বিট)
চিহ্নিত ক্ষেত্র দ্বারা চিহ্নিত অবজেক্ট ইনস্ট্যান্স ক্ষেত্রের অপারেশন সম্পাদন করুন, মান রেজিস্টারে লোড করা বা সংরক্ষণ করা।

দ্রষ্টব্য: এই অপকোডগুলি স্ট্যাটিক লিঙ্কিংয়ের জন্য যুক্তিসঙ্গত প্রার্থী, ফিল্ড আর্গুমেন্টকে আরও সরাসরি অফসেট হতে পরিবর্তন করে।

60..6d 21c s staticop vAA, field@BBBB
60: sget
61: sget-ওয়াইড
62: sget-অবজেক্ট
63: sget-বুলিয়ান
64: sget-বাইট
65: sget-char
66: sget-ছোট
67: থুতু
68: স্পুট-ওয়াইড
69: থুতু-বস্তু
6a: থুতু-বুলিয়ান
6b: স্পুট-বাইট
6c: sput-char
6d: থুতু-ছোট
A: মান নিবন্ধন বা জোড়া; উৎস বা গন্তব্য হতে পারে (8 বিট)
B: স্ট্যাটিক ফিল্ড রেফারেন্স সূচক (16 বিট)
চিহ্নিত স্ট্যাটিক ফিল্ডের সাথে চিহ্নিত অবজেক্ট স্ট্যাটিক ফিল্ড অপারেশন সঞ্চালন করুন, মান রেজিস্টারে লোড করা বা সংরক্ষণ করুন।

দ্রষ্টব্য: এই অপকোডগুলি স্ট্যাটিক লিঙ্কিংয়ের জন্য যুক্তিসঙ্গত প্রার্থী, ফিল্ড আর্গুমেন্টকে আরও সরাসরি অফসেট হতে পরিবর্তন করে।

6e..72 35c আহ্বান- ধরনের {vC, vD, vE, vF, vG}, meth@BBBB
6e: ইনভোক-ভার্চুয়াল
6f: invoke-super
70: invoke-direct
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 জন্য একই পদ্ধতির সীমাবদ্ধতা রয়েছে। সংস্করণ 037 এর পূর্বে ডেক্স ফাইলগুলিতে, একটি ইন্টারফেস 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: invoke-static/range
78: ইনভোক-ইন্টারফেস/রেঞ্জ
A: আর্গুমেন্ট শব্দ গণনা (8 বিট)
B: পদ্ধতির রেফারেন্স সূচক (16 বিট)
C: প্রথম আর্গুমেন্ট রেজিস্টার (16 বিট)
N = A + C - 1
নির্দেশিত পদ্ধতিতে কল করুন। বিশদ বিবরণ, সতর্কতা এবং পরামর্শের জন্য উপরে প্রথম invoke- kind বিবরণ দেখুন।
79..7a 10x (অব্যবহৃত) (অব্যবহৃত)
7b..8f 12x unop vA, vB
7b: neg-int
7c: not-int
7d: নেগ-লং
7e: দীর্ঘ নয়
7f: neg-float
80: নেগ-ডবল
81: int-থেকে-লং
82: int-to-float
83: int-টু-ডবল
84: দীর্ঘ থেকে int
85: লং-টু-ফ্লোট
86: দীর্ঘ থেকে দ্বিগুণ
87: float-to-int
88: ভাসা থেকে দীর্ঘ
89: ফ্লোট-টু-ডাবল
8a: ডবল থেকে int
8b: দ্বিগুণ থেকে দীর্ঘ
8c: ডাবল-টু-ফ্লোট
8d: int-to-byte
8e: int-to-char
8f: int-to-short
A: গন্তব্য রেজিস্টার বা জোড়া (4 বিট)
B: সোর্স রেজিস্টার বা পেয়ার (4 বিট)
গন্তব্য রেজিস্টারে ফলাফল সংরক্ষণ করে সোর্স রেজিস্টারে চিহ্নিত ইউনারি অপারেশন করুন।
90..af 23x binop vAA, vBB, vCC
90: অ্যাড-ইন
91: উপ-int
92: mul-int
93: div-int
94: rem-int
95: এবং-int
96: or-int
97: xor-int
98: shl-int
99: shr-int
9a: ushr-int
9b: অ্যাড-লং
9c: উপ-দীর্ঘ
9d: মুল-লং
9e: ডিভ-লং
9f: রেম-লং
a0: এবং দীর্ঘ
a1: বা দীর্ঘ
a2: xor-লং
a3: shl-দীর্ঘ
a4: shr-লং
a5: উশর-দীর্ঘ
a6: অ্যাড-ফ্লোট
a7: সাব-ফ্লোট
a8: mul-float
a9: div-float
aa: rem-float
ab: অ্যাড-ডাবল
ac: সাব-ডবল
বিজ্ঞাপন: mul-ডবল
ae: ডিভ-ডবল
af: rem-ডাবল
A: গন্তব্য নিবন্ধন বা জোড়া (8 বিট)
B: প্রথম সোর্স রেজিস্টার বা পেয়ার (8 বিট)
C: দ্বিতীয় উৎস নিবন্ধন বা জোড়া (8 বিট)
দুটি উৎস রেজিস্টারে চিহ্নিত বাইনারি অপারেশন সম্পাদন করুন, ফলাফলটি গন্তব্য রেজিস্টারে সংরক্ষণ করুন।

দ্রষ্টব্য: অন্যান্য -long গাণিতিক ক্রিয়াকলাপগুলির বিপরীতে (যা তাদের প্রথম এবং তাদের দ্বিতীয় উত্স উভয়ের জন্য নিবন্ধন জোড়া নেয়), shl-long , shr-long , এবং ushr- 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
হতে: 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: সাব-ডাবল/2addr
cd: mul-double/2addr
ce: div-double/2addr
cf: rem-double/2addr
A: গন্তব্য এবং প্রথম উৎস নিবন্ধন বা জোড়া (4 বিট)
B: দ্বিতীয় উৎস নিবন্ধন বা জোড়া (4 বিট)
দুটি সোর্স রেজিস্টারে চিহ্নিত বাইনারি অপারেশন সম্পাদন করুন, ফলাফলটি প্রথম সোর্স রেজিস্টারে সংরক্ষণ করুন।

দ্রষ্টব্য: অন্যান্য -long/2addr গাণিতিক ক্রিয়াকলাপগুলির বিপরীতে (যা তাদের গন্তব্য/প্রথম উত্স এবং তাদের দ্বিতীয় উত্স উভয়ের জন্য রেজিস্টার জোড়া নেয়), shl-long/2addr , shr-long/2addr , এবং ushr 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 ধ্রুবক (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 ধ্রুবক (8 বিট)
নির্দেশিত রেজিস্টারে (প্রথম যুক্তি) এবং আক্ষরিক মান (দ্বিতীয় যুক্তি) নির্দেশিত বাইনারি অপটি সম্পাদন করুন, ফলাফলটি গন্তব্য রেজিস্টারে সংরক্ষণ করুন।

দ্রষ্টব্য: rsub-int এর শব্দার্থবিদ্যার বিশদ বিবরণের জন্য নীচে দেখুন।

e3..f9 10x (অব্যবহৃত) (অব্যবহৃত)
fa 45cc ইনভোক-পলিমরফিক {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 ডকুমেন্টেশনে ব্যতিক্রমগুলি বর্ণনা করা হয়েছে।

সংস্করণ 038 থেকে ডেক্স ফাইলগুলিতে উপস্থাপন করুন।
fb 4rcc invoke-polymorphic/range {vCCCC .. vNNNN}, meth@BBBB, proto@HHHH A: আর্গুমেন্ট শব্দ গণনা (8 বিট)
B: পদ্ধতির রেফারেন্স সূচক (16 বিট)
C: রিসিভার (16 বিট)
H: প্রোটোটাইপ রেফারেন্স সূচক (16 বিট)
N = A + C - 1
নির্দেশিত পদ্ধতি হ্যান্ডেল আহ্বান করুন. বিস্তারিত জানার জন্য উপরে invoke-polymorphic বিবরণ দেখুন।

সংস্করণ 038 থেকে ডেক্স ফাইলগুলিতে উপস্থাপন করুন।
fc 35c ইনভোক-কাস্টম {vC, vD, vE, vF, vG}, call_site@BBBB A: আর্গুমেন্ট শব্দ গণনা (4 বিট)
B: কল সাইট রেফারেন্স সূচক (16 বিট)
C..G: আর্গুমেন্ট রেজিস্টার (প্রতিটি 4 বিট)
নির্দেশিত কল সাইটটি সমাধান করে এবং আহ্বান করে। আহ্বানের ফলাফল (যদি থাকে) অবিলম্বে পরবর্তী নির্দেশ হিসাবে একটি উপযুক্ত move-result* বৈকল্পিক সহ সংরক্ষণ করা যেতে পারে।

এই নির্দেশটি দুটি পর্যায়ে কার্যকর হয়: কল সাইট রেজোলিউশন এবং কল সাইট ইনভোকেশন।

কল সাইটের রেজোলিউশন চেক করে যে নির্দেশিত কল সাইটের কোনো সংশ্লিষ্ট java.lang.invoke.CallSite উদাহরণ আছে কিনা। যদি না হয়, নির্দেশিত কল সাইটের জন্য বুটস্ট্র্যাপ লিঙ্কার পদ্ধতিটি DEX ফাইলে উপস্থিত আর্গুমেন্ট ব্যবহার করে আহ্বান করা হয় ( কল_সাইট_আইটেম দেখুন)। বুটস্ট্র্যাপ লিঙ্কার পদ্ধতি একটি java.lang.invoke.CallSite ইন্সট্যান্স প্রদান করে যেটি তখন নির্দেশিত কল সাইটের সাথে যুক্ত হবে যদি কোনো অ্যাসোসিয়েশন না থাকে। অন্য একটি থ্রেড ইতিমধ্যেই প্রথম অ্যাসোসিয়েশন তৈরি করে থাকতে পারে, এবং যদি তাই হয় তাহলে নির্দেশের বাস্তবায়ন প্রথম যুক্ত java.lang.invoke.CallSite উদাহরণের সাথে চলতে থাকে।

সমাধান করা java.lang.invoke.CallSite উদাহরণের java.lang.invoke.MethodHandle টার্গেটে কল সাইট ইনভোকেশন করা হয়। একটি সঠিক পদ্ধতি হ্যান্ডেল ইনভোকেশনের আর্গুমেন্ট হিসাবে invoke-custom নির্দেশের আর্গুমেন্ট এবং মেথড হ্যান্ডেল ব্যবহার করে invoke-polymorphic (উপরে বর্ণিত) চালানোর মতো টার্গেটকে আহ্বান করা হয়।

বুটস্ট্র্যাপ লিঙ্কার পদ্ধতি দ্বারা উত্থাপিত ব্যতিক্রমগুলি একটি java.lang.BootstrapMethodError এ মোড়ানো হয়। একটি BootstrapMethodError ও উত্থাপিত হয় যদি:
  • বুটস্ট্র্যাপ লিঙ্কার পদ্ধতি একটি java.lang.invoke.CallSite উদাহরণ ফেরত দিতে ব্যর্থ হয়।
  • ফিরে আসা java.lang.invoke.CallSite এর একটি null মেথড হ্যান্ডেল টার্গেট আছে।
  • পদ্ধতি হ্যান্ডেল লক্ষ্য অনুরোধ করা ধরনের নয়।
সংস্করণ 038 থেকে ডেক্স ফাইলগুলিতে উপস্থাপন করুন।
fd 3rc invoke-custom/range {vCCCC .. vNNNN}, call_site@BBBB A: আর্গুমেন্ট শব্দ গণনা (8 বিট)
B: কল সাইট রেফারেন্স সূচক (16 বিট)
C: প্রথম আর্গুমেন্ট রেজিস্টার (16-বিট)
N = A + C - 1
সমাধান করুন এবং একটি কল সাইট আহ্বান করুন। বিস্তারিত জানার জন্য উপরে invoke-custom বিবরণ দেখুন।

সংস্করণ 038 থেকে ডেক্স ফাইলগুলিতে উপস্থাপন করুন।
fe 21c const-method-handle vAA, method_handle@BBBB A: গন্তব্য রেজিস্টার (8 বিট)
B: পদ্ধতি হ্যান্ডেল সূচক (16 বিট)
নির্দিষ্ট রেজিস্টারে প্রদত্ত সূচক দ্বারা নির্দিষ্ট পদ্ধতি হ্যান্ডেলের একটি রেফারেন্স সরান।

সংস্করণ 039 এর পর থেকে ডেক্স ফাইলগুলিতে উপস্থিত।
ff 21c const-method-type vAA, proto@BBBB A: গন্তব্য রেজিস্টার (8 বিট)
B: পদ্ধতি প্রোটোটাইপ রেফারেন্স (16 বিট)
নির্দিষ্ট রেজিস্টারে প্রদত্ত সূচক দ্বারা নির্দিষ্ট পদ্ধতির প্রোটোটাইপের একটি রেফারেন্স সরান।

সংস্করণ 039 এর পর থেকে ডেক্স ফাইলগুলিতে উপস্থিত।

প্যাকড-সুইচ-পেলোড বিন্যাস

নাম বিন্যাস বর্ণনা
পরিচয় ushort = 0x0100 ছদ্ম-অপকোড সনাক্তকরণ
আকার ছোট টেবিলে এন্ট্রির সংখ্যা
প্রথম_কী int প্রথম (এবং সর্বনিম্ন) স্যুইচ কেস মান
লক্ষ্য int[] size আপেক্ষিক শাখা লক্ষ্যের তালিকা। লক্ষ্যগুলি সুইচ অপকোডের ঠিকানার সাথে সম্পর্কিত, এই টেবিলের নয়।

দ্রষ্টব্য: এই টেবিলের একটি উদাহরণের জন্য কোড ইউনিটের মোট সংখ্যা হল (size * 2) + 4

sparse-switch-payload বিন্যাস

নাম বিন্যাস বর্ণনা
পরিচয় ushort = 0x0200 ছদ্ম-অপকোড সনাক্তকরণ
আকার ছোট টেবিলে এন্ট্রির সংখ্যা
কী int[] size কী মানগুলির তালিকা, নিম্ন-থেকে-উচ্চ বাছাই করা
লক্ষ্য int[] size আপেক্ষিক শাখা লক্ষ্যগুলির তালিকা, প্রতিটি একই সূচকে মূল মানের সাথে সম্পর্কিত। লক্ষ্যগুলি সুইচ অপকোডের ঠিকানার সাথে সম্পর্কিত, এই টেবিলের নয়।

দ্রষ্টব্য: এই টেবিলের একটি উদাহরণের জন্য কোড ইউনিটের মোট সংখ্যা হল (size * 4) + 2

পূরণ-অ্যারে-ডেটা-পেলোড বিন্যাস

নাম বিন্যাস বর্ণনা
পরিচয় ushort = 0x0300 ছদ্ম-অপকোড সনাক্তকরণ
উপাদান_প্রস্থ ছোট প্রতিটি উপাদানে বাইটের সংখ্যা
আকার uint টেবিলে উপাদানের সংখ্যা
তথ্য ubyte[] ডেটা মান

দ্রষ্টব্য: এই টেবিলের একটি উদাহরণের জন্য কোড ইউনিটের মোট সংখ্যা হল (size * element_width + 1) / 2 + 4

গাণিতিক অপারেশন বিবরণ

দ্রষ্টব্য: ফ্লোটিং পয়েন্ট অপারেশনগুলিকে অবশ্যই IEEE 754 নিয়মগুলি অনুসরণ করতে হবে, রাউন্ড-টু-নেয়ারস্ট এবং ক্রমান্বয়ে আন্ডারফ্লো ব্যবহার করে, অন্যথায় বলা ছাড়া।

অপকোড C শব্দার্থবিদ্যা মন্তব্য
neg-int int32 a;
int32 ফলাফল = -a;
Unary twos- পরিপূরক.
not-int int32 a;
int32 ফলাফল = ~a;
Unary বেশী - পরিপূরক.
neg-দীর্ঘ int64 a;
int64 ফলাফল = -a;
Unary twos- পরিপূরক.
দীর্ঘ নয় int64 a;
int64 ফলাফল = ~a;
Unary বেশী - পরিপূরক.
neg-float float a;
float result = -a;
ফ্লোটিং পয়েন্ট নেগেশান।
নেগ-ডবল ডবল a;
দ্বিগুণ ফলাফল = -a;
ফ্লোটিং পয়েন্ট নেগেশান।
int-to-long int32 a;
int64 result = (int64) a;
Sign extension of int32 into int64 .
int-to-float int32 a;
float result = (float) a;
Conversion of int32 to float , using round-to-nearest. This loses precision for some values.
int-to-double int32 a;
double result = (double) a;
Conversion of int32 to double .
long-to-int int64 a;
int32 result = (int32) a;
Truncation of int64 into int32 .
long-to-float int64 a;
float result = (float) a;
Conversion of int64 to float , using round-to-nearest. This loses precision for some values.
long-to-double int64 a;
double result = (double) a;
Conversion of int64 to double , using round-to-nearest. This loses precision for some values.
float-to-int float a;
int32 result = (int32) a;
Conversion of float to int32 , using round-toward-zero. NaN and -0.0 (negative zero) convert to the integer 0 . Infinities and values with too large a magnitude to be represented get converted to either 0x7fffffff or -0x80000000 depending on sign.
float-to-long float a;
int64 result = (int64) a;
Conversion of float to int64 , using round-toward-zero. The same special case rules as for float-to-int apply here, except that out-of-range values get converted to either 0x7fffffffffffffff or -0x8000000000000000 depending on sign.
float-to-double float a;
double result = (double) a;
Conversion of float to double , preserving the value exactly.
double-to-int double a;
int32 result = (int32) a;
Conversion of double to int32 , using round-toward-zero. The same special case rules as for float-to-int apply here.
double-to-long double a;
int64 result = (int64) a;
Conversion of double to int64 , using round-toward-zero. The same special case rules as for float-to-long apply here.
double-to-float double a;
float result = (float) a;
Conversion of double to float , using round-to-nearest. This loses precision for some values.
int-to-byte int32 a;
int32 result = (a << 24) >> 24;
Truncation of int32 to int8 , sign extending the result.
int-to-char int32 a;
int32 result = a & 0xffff;
Truncation of int32 to uint16 , without sign extension.
int-to-short int32 a;
int32 result = (a << 16) >> 16;
Truncation of int32 to int16 , sign extending the result.
add-int int32 a, b;
int32 result = a + b;
Twos-complement addition.
sub-int int32 a, b;
int32 result = a - b;
Twos-complement subtraction.
rsub-int int32 a, b;
int32 result = b - a;
Twos-complement reverse subtraction.
mul-int int32 a, b;
int32 result = a * b;
Twos-complement multiplication.
div-int int32 a, b;
int32 result = a / b;
Twos-complement division, rounded towards zero (that is, truncated to integer). This throws ArithmeticException if b == 0 .
rem-int int32 a, b;
int32 result = a % b;
Twos-complement remainder after division. The sign of the result is the same as that of a , and it is more precisely defined as result == a - (a / b) * b . This throws ArithmeticException if b == 0 .
and-int int32 a, b;
int32 result = a & b;
Bitwise AND.
or-int int32 a, b;
int32 result = a | b;
Bitwise OR.
xor-int int32 a, b;
int32 result = a ^ b;
Bitwise XOR.
shl-int int32 a, b;
int32 result = a << (b & 0x1f);
Bitwise shift left (with masked argument).
shr-int int32 a, b;
int32 result = a >> (b & 0x1f);
Bitwise signed shift right (with masked argument).
ushr-int uint32 a, b;
int32 result = a >> (b & 0x1f);
Bitwise unsigned shift right (with masked argument).
add-long int64 a, b;
int64 result = a + b;
Twos-complement addition.
sub-long int64 a, b;
int64 result = a - b;
Twos-complement subtraction.
mul-long int64 a, b;
int64 result = a * b;
Twos-complement multiplication.
div-long int64 a, b;
int64 result = a / b;
Twos-complement division, rounded towards zero (that is, truncated to integer). This throws ArithmeticException if b == 0 .
rem-long int64 a, b;
int64 result = a % b;
Twos-complement remainder after division. The sign of the result is the same as that of a , and it is more precisely defined as result == a - (a / b) * b . This throws ArithmeticException if b == 0 .
and-long int64 a, b;
int64 result = a & b;
Bitwise AND.
or-long int64 a, b;
int64 result = a | b;
Bitwise OR.
xor-long int64 a, b;
int64 result = a ^ b;
Bitwise XOR.
shl-long int64 a;
int32 b;
int64 result = a << (b & 0x3f);
Bitwise shift left (with masked argument).
shr-long int64 a;
int32 b;
int64 result = a >> (b & 0x3f);
Bitwise signed shift right (with masked argument).
ushr-long uint64 a;
int32 b;
int64 result = a >> (b & 0x3f);
Bitwise unsigned shift right (with masked argument).
add-float float a, b;
float result = a + b;
Floating point addition.
sub-float float a, b;
float result = a - b;
Floating point subtraction.
mul-float float a, b;
float result = a * b;
Floating point multiplication.
div-float float a, b;
float result = a / b;
Floating point division.
rem-float float a, b;
float result = a % b;
Floating point remainder after division. This function is different than IEEE 754 remainder and is defined as result == a - roundTowardZero(a / b) * b .
add-double double a, b;
double result = a + b;
Floating point addition.
sub-double double a, b;
double result = a - b;
Floating point subtraction.
mul-double double a, b;
double result = a * b;
Floating point multiplication.
div-double double a, b;
double result = a / b;
Floating point division.
rem-double double a, b;
double result = a % b;
Floating point remainder after division. This function is different than IEEE 754 remainder and is defined as result == a - roundTowardZero(a / b) * b .