আপনার প্রথম জিনিসটির দরকার যা এই ফাইলটির মতো । এটি এনএএসএম এসেম্বেবলার দ্বারা ব্যবহৃত x86 প্রসেসরের নির্দেশাবলী ডাটাবেস (যা আমি লিখতে সাহায্য করেছি, যদিও অংশটি প্রকৃতপক্ষে নির্দেশাবলী অনুবাদ করে না)। ডাটাবেস থেকে একটি স্বেচ্ছাসেবী লাইন চয়ন করুন:
ADD rm32,imm8 [mi: hle o32 83 /0 ib,s] 386,LOCK
এর অর্থ কী এটি নির্দেশকে বর্ণনা করে ADD
। এই নির্দেশের একাধিক রূপ রয়েছে এবং নির্দিষ্ট যেটি এখানে বর্ণিত হয়েছে তা হ'ল বৈকল্পিক যা হয় 32-বিট নিবন্ধ বা মেমরি ঠিকানা গ্রহণ করে এবং তাত্ক্ষণিক 8-বিট মান যুক্ত করে (অর্থাত্ নির্দেশের সাথে সরাসরি অন্তর্ভুক্ত) constant এই সংস্করণটি ব্যবহার করবে এমন একটি উদাহরণ সমাবেশ নির্দেশ এটি:
add eax, 42
এখন, আপনাকে আপনার পাঠ্য ইনপুট নিতে হবে এবং পৃথক নির্দেশাবলী এবং অপারেশনগুলিতে এটি পার্স করতে হবে। উপরের নির্দেশের জন্য, এটি সম্ভবত কাঠামোতে নির্দেশিকা ADD
এবং অপারেশনগুলির একটি অ্যারে (রেজিস্ট্রার EAX
এবং মানটির একটি রেফারেন্স 42
) এর ফলস্বরূপ would আপনার এই কাঠামোটি একবার হয়ে গেলে, আপনি নির্দেশিকা ডাটাবেসটি চালিয়ে যান এবং সেই লাইনটি খুঁজে পাবেন যা নির্দেশের নাম এবং অপারেশনগুলির প্রকার উভয়ের সাথে মিলে। যদি আপনি কোনও মিল খুঁজে না পান, তবে এটি একটি ত্রুটি যা ব্যবহারকারীর সামনে উপস্থাপন করা দরকার ("অপকোড এবং অপারেশনগুলির অবৈধ সংমিশ্রণ" বা অনুরূপ সাধারণ পাঠ্য)।
ডাটাবেস থেকে লাইনটি পেয়ে গেলে আমরা তৃতীয় কলামটি দেখি, যা এই নির্দেশের জন্য:
[mi: hle o32 83 /0 ib,s]
এটি এমন একটি নির্দেশাবলীর একটি সেট যা বর্ণনা করে যে কীভাবে প্রয়োজনীয় মেশিন কোড নির্দেশ তৈরি করা যায়:
mi
একটি এক: operands একটি descriptiuon হয় modr/m
(অথবা রেজিস্টার মেমরি) প্রতীক (যার মানে আমরা যোগ করতে হবে modr/m
নির্দেশ, যা আমরা পরে আসবো শেষে বাইট) এবং একটি তাৎক্ষণিক নির্দেশ (যা হবে নির্দেশের বিবরণে ব্যবহার করা হবে)।
- পরেরটি
hle
। এটি সনাক্ত করে যে আমরা কীভাবে "লক" উপসর্গ পরিচালনা করি। আমরা "লক" ব্যবহার করি নি, তাই আমরা এটিকে এড়িয়ে চলেছি।
- পরেরটি
o32
। এটি আমাদের জানায় যে আমরা যদি 16-বিট আউটপুট ফর্ম্যাটের জন্য কোডটি একত্রিত করি তবে নির্দেশকে অপারেন্ড-আকারের ওভাররাইড উপসর্গের প্রয়োজন। যদি আমরা ১--বিট আউটপুট উত্পাদন করতাম তবে আমরা এখন ( 0x66
) উপসর্গটি তৈরি করব, তবে আমি ধরে নেব যে আমরা নেই এবং চালিয়ে যাচ্ছি।
- পরেরটি
83
। এটি হেক্সাডেসিমালের একটি আক্ষরিক বাইট। আমরা এটি আউটপুট।
পরেরটি /0
। এটি কিছু অতিরিক্ত বিট নির্দিষ্ট করে যা আমাদের মোডার / এম বাইটেমের প্রয়োজন হবে এবং আমাদের এটি তৈরির কারণ করে। modr/m
বাইট সঙ্কেতাক্ষরে লিখা রেজিস্টার প্রত্যক্ষ বা পরোক্ষ স্মৃতি রেফারেন্স ব্যবহার করা হয়। আমাদের যেমন একটি একক অপারেন্ড আছে, একটি রেজিস্টার। রেজিস্টারের একটি নম্বর রয়েছে, যা অন্য ডেটা ফাইলে নির্দিষ্ট করা আছে :
eax REG_EAX reg32 0
আমরা এটি পরীক্ষা reg32
করে দেখি যে মূল ডেটাবেস (এটি করে) থেকে প্রয়োজনীয় প্রয়োজনীয় নির্দেশের সাথে একমত হয়। 0
রেজিস্টার এর সংখ্যা। একটি modr/m
বাইট প্রসেসর দ্বারা নির্দিষ্ট একটি ডাটা স্ট্রাকচার, ভালো যে দেখায়:
(most significant bit)
2 bits mod - 00 => indirect, e.g. [eax]
01 => indirect plus byte offset
10 => indirect plus word offset
11 => register
3 bits reg - identifies register
3 bits rm - identifies second register or additional data
(least significant bit)
কারণ আমরা একটি রেজিস্টার নিয়ে কাজ করছি, mod
ক্ষেত্রটি 0b11
।
reg
ক্ষেত্র, রেজিস্টার আমরা ব্যবহার করছি সংখ্যা0b000
- কারণ এই নির্দেশে কেবল একটি রেজিস্টার আছে, আমাদের
rm
কিছু দিয়ে ক্ষেত্রটি পূরণ করতে হবে। এতে অতিরিক্ত ডেটা নির্দিষ্ট করা /0
ছিল, তাই আমরা এটিকে rm
ক্ষেত্রের মধ্যে রেখেছি 0b000
,।
modr/m
বাইট তাই হয় 0b11000000
বা 0xC0
। আমরা এই আউটপুট।
- পরেরটি
ib,s
। এটি স্বাক্ষরিত তাত্ক্ষণিক বাইট নির্দিষ্ট করে। আমরা অপারেশনগুলিকে লক্ষ্য করি এবং নোট করি যে আমাদের কাছে একটি তাত্ক্ষণিক মূল্য উপলব্ধ রয়েছে। আমরা এটিকে স্বাক্ষরিত বাইটে রূপান্তর করি এবং এটি ( 42
=> 0x2A
) আউটপুট করি ।
সম্পূর্ণ একত্র নির্দেশ তাই হয়: 0x83 0xC0 0x2A
। এটিকে আপনার আউটপুট মডিউলে প্রেরণ করুন, একটি নোট সহ যে বাইটগুলির মধ্যে কোনওটিই মেমরির উল্লেখ করে না (আউটপুট মডিউলটি তাদের জানা উচিত হতে পারে)।
প্রতিটি নির্দেশের জন্য পুনরাবৃত্তি। লেবেলগুলির উপর নজর রাখুন যাতে আপনি জানতে পারেন যে সেগুলি উল্লেখ করা হলে কী প্রবেশ করানো উচিত। আপনার বস্তুর আউটপুট মডিউলগুলিতে পাস হয়ে যাওয়া ম্যাক্রোগুলি ও নির্দেশাবলীর জন্য সুবিধা যুক্ত করুন। এবং এটি মূলত একজন এসেম্বলারের কাজ করে।