আমরা কীভাবে সমাবেশ থেকে মেশিন কোডে যেতে পারি (কোড উত্পন্ন)


16

কোডটি মেশিন কোডে এসেম্বলিংয়ের মধ্যে পদক্ষেপটি দেখার জন্য কি কোনও সহজ উপায় আছে?

উদাহরণস্বরূপ, আপনি নোটপ্যাডে বাইনারি ফাইলটি খুললে আপনি মেশিন কোডের একটি টেক্সট্যালি ফর্ম্যাট প্রতিনিধিত্ব দেখতে পাবেন। আমি ধরে নিলাম যে প্রতিটি বাইট (প্রতীক) আপনি দেখতে পাচ্ছেন এটি বাইনারি মানের জন্য কি একই এসসিআই চরিত্র?

তবে আমরা কীভাবে সমাবেশ থেকে বাইনারি যাব, পর্দার আড়ালে কী চলছে ??

উত্তর:


28

ইন্সট্রাকশন সেট ডকুমেন্টেশনটি দেখুন এবং প্রতিটি নির্দেশের জন্য আপনি পিক মাইক্রোকন্ট্রোলারের কাছ থেকে এটির মতো এন্ট্রিগুলি খুঁজে পাবেন :

উদাহরণ addlw নির্দেশনা

"এনকোডিং" লাইনটি জানায় যে নির্দেশটি বাইনারিতে কেমন দেখাচ্ছে। এই ক্ষেত্রে, এটি সর্বদা 5 টি দিয়ে শুরু হয়, তারপরে একটি যত্নশীল বিট (যা এক বা শূন্য এক হতে পারে), তারপরে আপনি যে আক্ষরিক যুক্ত করছেন তার জন্য "কে" এর অবস্থান।

প্রথম কয়েকটি বিটকে "ওপকোড" বলা হয়, প্রতিটি নির্দেশের জন্য স্বতন্ত্র। সিপিইউ মূলত ওপকোডের দিকে নজর দেয় এটি কী নির্দেশনা তা দেখতে, তারপরে এটি সংখ্যার হিসাবে "কে" গুলি ডিকোড করতে জানে।

এটি ক্লান্তিকর, তবে এনকোড এবং ডিকোড করা এত কঠিন নয়। আমার একটি আন্ডারগ্র্যাড ক্লাস ছিল যেখানে পরীক্ষাগুলিতে আমাদের হাতের কাজটি করতে হয়েছিল।

প্রকৃতপক্ষে একটি সম্পূর্ণ এক্সিকিউটেবল ফাইল তৈরি করতে আপনার অপারেটিং সিস্টেমের উপর নির্ভর করে মেমরি বরাদ্দকরণ, শাখা অফসেটগুলি গণনা করতে এবং এটি ELF এর মতো ফর্ম্যাটে রেখে দিতে হবে things


10

অ্যাসেম্বলি ওপোডগুলি বেশিরভাগ অংশের জন্য অন্তর্নিহিত মেশিনের নির্দেশাবলীর সাথে এক থেকে একের সাথে যোগাযোগ করে। সুতরাং আপনাকে যা যা করতে হবে তা হ'ল সমাবেশ ভাষার প্রতিটি অপকোড সনাক্ত করতে, এটি সংশ্লিষ্ট মেশিনের নির্দেশে ম্যাপ করুন এবং মেশিনের নির্দেশাবলী একটি ফাইলের সাথে সম্পর্কিত প্যারামিটারগুলি সহ (যদি থাকে) লিখুন। তারপরে উত্স ফাইলে প্রতিটি অতিরিক্ত অপকোডের প্রক্রিয়াটি পুনরাবৃত্তি করুন।

অবশ্যই, এটি একটি এক্সিকিউটেবল ফাইল তৈরি করতে আরও বেশি সময় নেয় যা অপারেটিং সিস্টেমে যথাযথভাবে লোড হবে এবং চালিত হবে এবং বেশিরভাগ শালীন সমাবেশকারীদের মেশিনের নির্দেশাবলীর (যেমন ম্যাক্রো হিসাবে উদাহরণস্বরূপ) অপকডগুলির সহজ ম্যাপিংয়ের বাইরে কিছু অতিরিক্ত ক্ষমতা রয়েছে।


7

আপনার প্রথম জিনিসটির দরকার যা এই ফাইলটির মতো । এটি এনএএসএম এসেম্বেবলার দ্বারা ব্যবহৃত 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। এটিকে আপনার আউটপুট মডিউলে প্রেরণ করুন, একটি নোট সহ যে বাইটগুলির মধ্যে কোনওটিই মেমরির উল্লেখ করে না (আউটপুট মডিউলটি তাদের জানা উচিত হতে পারে)।

প্রতিটি নির্দেশের জন্য পুনরাবৃত্তি। লেবেলগুলির উপর নজর রাখুন যাতে আপনি জানতে পারেন যে সেগুলি উল্লেখ করা হলে কী প্রবেশ করানো উচিত। আপনার বস্তুর আউটপুট মডিউলগুলিতে পাস হয়ে যাওয়া ম্যাক্রোগুলি ও নির্দেশাবলীর জন্য সুবিধা যুক্ত করুন। এবং এটি মূলত একজন এসেম্বলারের কাজ করে।


1
ধন্যবাদ. দুর্দান্ত ব্যাখ্যা কিন্তু এটি "0x83 0xC0 0x2A" না হয়ে "0x83 0xB0 0x2A" হওয়া উচিত কারণ 0b11000000 = 0xC0
কামরান

@ কামরান - $ cat > test.asm bits 32 add eax,42 $ nasm -f bin test.asm -o test.bin $ od -t x1 test.bin 0000000 83 c0 2a 0000003... হ্যাঁ, আপনি ঠিক বলেছেন। :)
জুলাই

2

অনুশীলনে, একটি এসেমব্লার সাধারণত কিছু বাইনারি এক্সিকিউটেবল সরাসরি উত্পাদন করে না , তবে কিছু অবজেক্ট ফাইল (পরে লিঙ্কারে খাওয়ানো হয় )। তবে কিছু ব্যতিক্রম রয়েছে (আপনি কিছু অ্যাসেমব্লার ব্যবহার করে সরাসরি কিছু বাইনারি এক্সিকিউটেবল উত্পাদন করতে পারেন; এগুলি অস্বাভাবিক)।

প্রথম, লক্ষ্য করুন যে অনেক এসেমব্লাররা আজ ফ্রি সফটওয়্যার প্রোগ্রাম। আপনার কম্পিউটারের তে ডাউনলোড এবং কম্পাইল সোর্স কোড সুতরাং হিসাবে গনুহ (একটি অংশ binutils ) এবং এর nasm । তারপরে তাদের উত্স কোডটি অধ্যয়ন করুন। বিটিডাব্লু, আমি সেই উদ্দেশ্যে লিনাক্স ব্যবহার করার পরামর্শ দিচ্ছি (এটি একটি খুব বিকাশকারী-বান্ধব এবং ফ্রি-সফটওয়্যার বান্ধব ওএস)।

একটি এসেম্বলারের দ্বারা উত্পাদিত অবজেক্ট ফাইলটিতে উল্লেখযোগ্যভাবে একটি কোড বিভাগ এবং স্থানান্তরের নির্দেশাবলী রয়েছে। এটি একটি ভাল ডকুমেন্টেড ফাইল ফর্ম্যাটে সংগঠিত, যা অপারেটিং সিস্টেমের উপর নির্ভর করে। লিনাক্সে, সেই ফর্ম্যাটটি (অবজেক্ট ফাইল, শেয়ার্ড লাইব্রেরি, কোর ডাম্পস এবং এক্সিকিউটেবলের জন্য ব্যবহৃত হয়) হল ইএলএফ । সেই অবজেক্ট ফাইলটি পরে লিংকারে ইনপুট হয় (যা শেষ পর্যন্ত একটি নির্বাহযোগ্য উত্পাদন করে)। স্থানান্তরগুলি এবিআই দ্বারা নির্দিষ্ট করা হয় (যেমন x86-64 এবিআই )। আরও জন্য লেভিনের বই লিঙ্কারস এবং লোডার পড়ুন ।

এই জাতীয় অবজেক্ট ফাইলে কোড বিভাগে গর্ত সহ মেশিনের কোড রয়েছে (লিঙ্কারের মাধ্যমে স্থানান্তরের তথ্যের সাহায্যে পূরণ করতে হবে) machine একটি উপস্থাপক দ্বারা উত্পাদিত (পুনঃস্থাপনযোগ্য) মেশিন কোড অবশ্যই একটি নির্দেশ সেট আর্কিটেকচারের জন্য নির্দিষ্ট । এক্স 86 বা x86-64 ' (সবচেয়ে ল্যাপটপ বা ডেস্কটপ প্রোসেসর-এ ব্যবহৃত) ISAs তাদের বিস্তারিত ভয়ঙ্কর জটিল। তবে y86 বা y86-64 নামক একটি সরলিকৃত উপসেটটি শিক্ষার প্রয়োজনে উদ্ভাবিত হয়েছে। তাদের উপর স্লাইড পড়ুন । এই প্রশ্নের অন্যান্য উত্তরগুলিও এর কিছুটা ব্যাখ্যা করে। আপনি কম্পিউটার আর্কিটেকচারের একটি ভাল বই পড়তে চাইতে পারেন ।

বেশিরভাগ এসেম্বলার দুটি পাসে কাজ করছেন , দ্বিতীয়টি নির্গমন স্থানান্তর বা প্রথম পাসের আউটপুটটির কিছু সংশোধন করছে। তারা এখন সাধারণ পার্সিং কৌশল ব্যবহার করে (সুতরাং সম্ভবত ড্রাগন বুকটি পড়ুন )।

ওএস কার্নেল দ্বারা নির্বাহযোগ্য কীভাবে শুরু করা হয় (যেমন execveলিনাক্সে সিস্টেম কল কীভাবে কাজ করে) এটি একটি ভিন্ন (এবং জটিল) প্রশ্ন is এটি সাধারণত কিছু ভার্চুয়াল ঠিকানার স্থান নির্ধারণ করে ( প্রক্রিয়াতে যেটি কার্যকর করে (2) ...) তারপরে প্রক্রিয়াটিকে অভ্যন্তরীণ অবস্থায় পুনরায় নতুন করে দিন ( ব্যবহারকারী-মোড রেজিস্টারগুলি সহ )। লিনাক্সে ld-linux.so (8) -র মতো একটি গতিশীল লিঙ্কার রানটাইমটিতে জড়িত থাকতে পারে। অপারেটিং সিস্টেম: থ্রি ইজি পিসের মতো একটি ভাল বই পড়ুন । OSDEV উইকি এছাড়াও দরকারী তথ্য প্রদান করা হয়।

পুনশ্চ. আপনার প্রশ্নটি এত বিস্তৃত যে আপনাকে এটি সম্পর্কে বেশ কয়েকটি বই পড়তে হবে। আমি কিছু (খুব অসম্পূর্ণ) রেফারেন্স দিয়েছি। আপনি তাদের আরও খুঁজে পাওয়া উচিত।


1
অবজেক্ট ফাইল ফর্ম্যাট সম্পর্কিত, একটি শিক্ষানবিস জন্য আমি NASM দ্বারা উত্পাদিত আরডিএফএফ ফর্ম্যাটটি দেখার পরামর্শ দেব। এটি ইচ্ছাকৃতভাবে বাস্তবসম্মতভাবে যতটা সম্ভব সহজ করার জন্য ডিজাইন করা হয়েছিল এবং এখনও বিভিন্ন পরিস্থিতিতে কাজ করে। NASM উত্সটিতে ফর্ম্যাটটির জন্য একটি লিঙ্কার এবং একটি লোডার রয়েছে। (সম্পূর্ণ প্রকাশ - আমি এগুলির সবগুলি ডিজাইন করেছি এবং লিখেছি)
জুলাই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.