- অ্যাসেম্বলি ভাষা তার নির্দেশাবলী উদ্দেশ্য অনুসারে সংগঠিত করে: স্থানান্তর, গণনা, প্রবাহ নিয়ন্ত্রণ এবং আরও অনেক কিছু।
- প্রতিটি নির্দেশে একটি অপকোড এবং অপারেন্ড থাকে, স্থাপত্যের উপর নির্ভর করে বিভিন্ন ফর্ম্যাট থাকে।
- ডেটা অ্যাক্সেস করার জন্য বেশ কয়েকটি ঠিকানা পদ্ধতি রয়েছে, যেমন তাৎক্ষণিক, প্রত্যক্ষ এবং পরোক্ষ।
কম্পিউটিং-এর শুরু থেকেই অ্যাসেম্বলি ভাষা সফটওয়্যার ডেভেলপমেন্টের অন্যতম মৌলিক স্তম্ভ। যদিও আজ উচ্চ-স্তরের ভাষাগুলি দৃশ্যপটে প্রাধান্য পায়, অ্যাসেম্বলার এখনও ব্যাপকভাবে ব্যবহৃত এবং প্রাসঙ্গিক যেখানে হার্ডওয়্যার নিয়ন্ত্রণ, অপ্টিমাইজেশন, বা সম্পদের সীমাবদ্ধতা অগ্রাধিকার পায়।
এই প্রবন্ধে আমরা অ্যাসেম্বলি ল্যাঙ্গুয়েজ নির্দেশাবলীর প্রকারভেদ নিয়ে বিস্তারিত আলোচনা করব এবং এদের গঠন, উদ্দেশ্য, অ্যাড্রেসিং মোড ও বিভিন্ন আর্কিটেকচারে এদের বিন্যাস বিশ্লেষণ করব। এছাড়াও আপনি উদাহরণ, ফরম্যাট এবং একটি বিশদ পর্যালোচনা পাবেন, যা আপনাকে এই নির্দেশাবলীর পেছনের যুক্তি সম্পূর্ণরূপে বুঝতে সাহায্য করবে, যেগুলো হার্ডওয়্যারের সাথে অত্যন্ত ঘনিষ্ঠভাবে কাজ করে।
অ্যাসেম্বলি ভাষার নির্দেশ কী?
অ্যাসেম্বলি ইনস্ট্রাকশন হলো এমন একটি কমান্ড যা সিপিইউ সরাসরি বুঝতে পারে (একটি অ্যাসেম্বলার প্রোগ্রাম দ্বারা মেশিন কোডে অনূদিত হওয়ার পর)। প্রতিটি ইনস্ট্রাকশনের একটি নির্দিষ্ট উদ্দেশ্য থাকে এবং এটি সাধারণত একটি নেমোনিক (mnemonic) দ্বারা গঠিত হয় , যা অপারেশনটিকে নির্দেশ করে, এবং এক বা একাধিক অপারেন্ড (operend) থাকে যা নির্দেশ করে ডেটা কোথা থেকে নেওয়া হবে এবং/অথবা ফলাফল কোথায় সংরক্ষণ করা হবে।
এই নির্দেশাবলী প্রসেসরের আর্কিটেকচারের উপর অত্যন্ত নির্ভরশীল, তাই প্রতিটি ধরণের CPU (x86, ARM, MIPS, অন্যদের মধ্যে হোক না কেন) এর নিজস্ব নির্দেশাবলীর সেট রয়েছে যার নির্দিষ্ট সিনট্যাক্স এবং ক্ষমতা রয়েছে।
একটি নির্দেশের গঠন
নির্দেশাবলী সাধারণত দুটি অংশ নিয়ে গঠিত:
- অপারেশন কোড (অপকোড): সম্পাদিত কর্ম নির্দেশ করে, যেমন তথ্য যোগ করা, স্থানান্তর করা, তুলনা করা ইত্যাদি।
অপারেন্ডগুলো কোনো অপারেশন সম্পাদনের জন্য প্রয়োজনীয় তথ্য সরবরাহ করে এবং এগুলো রেজিস্টার, মেমরি বা ধ্রুবক হিসেবে সংরক্ষিত থাকতে পারে। সব নির্দেশনার জন্য অপারেন্ডের প্রয়োজন হয় না এবং কিছু ক্ষেত্রে, এগুলো নির্দেশনার মধ্যেই অন্তর্নিহিত থাকতে পারে বা পূর্বনির্ধারিত রেজিস্টারে সংরক্ষিত থাকতে পারে।
অ্যাসেম্বলি ভাষায় নির্দেশাবলীর প্রকারভেদ
একটি প্রোগ্রামের মধ্যে তারা যে কার্যকারিতা সম্পাদন করে তার উপর নির্ভর করে, অ্যাসেম্বলি ভাষার নির্দেশাবলীকে কয়েকটি গ্রুপে ভাগ করা যেতে পারে। সবচেয়ে প্রাসঙ্গিকগুলি নীচে বিস্তারিতভাবে বর্ণনা করা হল:
১. ডেটা স্থানান্তর নির্দেশাবলী
এই নির্দেশাবলীর মাধ্যমে উৎসস্থলে ডেটার বিষয়বস্তু পরিবর্তন না করেই এক স্থান থেকে অন্য স্থানে ডেটা অনুলিপি করা যায় । রেজিস্টার, মেমরি এবং পেরিফেরালগুলোর মধ্যে তথ্য স্থানান্তরের জন্য এগুলো অপরিহার্য।
এই গোষ্ঠীর কিছু সাধারণ নির্দেশাবলী হল:
- MOV: একটি অপারেন্ডের বিষয়বস্তু অন্যটিতে অনুলিপি করে। উদাহরণস্বরূপ,
MOV AX, BXBX এর বিষয়বস্তু AX তে কপি করুন। - MOVS / MOVSB / MOVSW: একটি উৎস ঠিকানা (SI) থেকে একটি গন্তব্য ঠিকানায় (DI) স্ট্রিং স্থানান্তর করে, স্থানান্তর প্রক্রিয়া স্বয়ংক্রিয় করে।
- LODS / LODSB / LODSW: SI রেজিস্টার দ্বারা নির্দেশিত ঠিকানা থেকে একটি মান অ্যাকিউমুলেটরে (AL বা AX) লোড করে।
- পড়ুন: মানের পরিবর্তে একটি কার্যকর ঠিকানা লোড করে। একটি চলক বা কাঠামোর ঠিকানা পাওয়ার জন্য কার্যকর।
2. ব্যাটারি নির্দেশাবলী
স্ট্যাক হলো একটি LIFO (লাস্ট ইন, ফার্স্ট আউট) কাঠামো, যা সাময়িকভাবে ডেটা সংরক্ষণ করতে, প্যারামিটার পাস করতে বা এক্সিকিউশন কনটেক্সট সেভ করতে ব্যবহৃত হয়।
- ধাক্কা: SP পয়েন্টার কমিয়ে স্ট্যাকে একটি মান সংরক্ষণ করে।
- পপ: স্ট্যাকে সংরক্ষিত সাম্প্রতিকতম মান পুনরুদ্ধার করে, SP বৃদ্ধি করে।
- PUSHF / POPF: তারা স্ট্যাকের উপর CPU ফ্ল্যাগের অবস্থা সংরক্ষণ এবং পুনরুদ্ধার করে।
৩. পাটিগণিত এবং যৌক্তিক নির্দেশাবলী
এগুলোর মাধ্যমে বিটের উপর গণনা ও বিভিন্ন কার্যক্রম সম্পাদন করা যায়। প্রোগ্রামের কার্যপ্রবাহে সাংখ্যিক তথ্য পরিচালনা এবং সিদ্ধান্ত গ্রহণের জন্য এই নির্দেশাবলী অপরিহার্য।
সবচেয়ে বেশি ব্যবহৃতগুলির মধ্যে আমরা পাই:
- যোগ / সাব: যোগ এবং বিয়োগ।
- মুল / ইমুল: বাইনারি গুণ।
- ডিভিআইভি / আইডিআইভি: বিভাগ (পূর্ণসংখ্যা বা স্বাক্ষরিত)।
- এবং / অথবা / XOR / না: বিটওয়াইজ লজিক্যাল অপারেশন।
- SHL / SHR / ROL / ROR: বিট শিফট এবং ঘূর্ণন।
৪. প্রবাহ নিয়ন্ত্রণ নির্দেশাবলী
এগুলোর মাধ্যমে আপনি প্রোগ্রামের নির্বাহের ক্রম পরিবর্তন করতে পারেন , যেমন—জাম্প যুক্ত করা অথবা অন্যান্য নির্দেশাবলীতে শর্তসাপেক্ষ ও শর্তহীন কল করা।
- JMP: নিঃশর্তভাবে প্রোগ্রামের অন্য ঠিকানায় লাফ দেয়।
- কল / রিট: একটি সাবরুটিনে ফোন করুন এবং ফিরে আসুন।
- জেই/জেএনই/জেজি/জেএল/জেজেড/জেএনজেড: শর্তসাপেক্ষ জাম্প, নির্দিষ্ট শর্ত পূরণ হলে (তুলনার পরে) এগুলি কার্যকর করা হয়।
৫. ইনপুট/আউটপুট (I/O) নির্দেশাবলী
এগুলো প্রসেসর এবং বাহ্যিক ডিভাইসগুলোর মধ্যে যোগাযোগ স্থাপন করে। এই নির্দেশাবলী পোর্ট (হার্ডওয়্যার) থেকে ডেটা পড়া এবং লেখা সম্ভব করে তোলে।
- ইন: একটি ইনপুট পোর্ট থেকে ডেটা পড়ে।
- আউট: একটি আউটপুট পোর্টে ডেটা পাঠায়।
6. ভাসমান বিন্দু নির্দেশাবলী
অনেক সিপিইউতে দশমিক (ফ্লোটিং-পয়েন্ট) সংখ্যা নিয়ে কাজ করার জন্য বিশেষ ম্যাথ কোপ্রসেসর (বা বিশেষ নির্দেশাবলী) থাকে। এই নির্দেশাবলী নিম্নলিখিত অপারেশনগুলো করতে দেয়:
- বাস্তব সংখ্যার যোগ, বিয়োগ, গুণ এবং ভাগ।
- ত্রিকোণমিতিক ক্রিয়াকলাপ (সাইন, কোসাইন, ট্যানজেন্ট)।
- লগারিদমিক, সূচকীয় এবং মূল ক্রিয়াকলাপ।
এই নির্দেশাবলী সাধারণত সাংখ্যিক নির্ভুলতার জন্য IEEE 754 মান মেনে চলে ।
অ্যাড্রেসিং মোড
নির্দেশনা নকশার একটি মৌলিক অংশ হলো অপারেন্ডের অবস্থান কীভাবে শনাক্ত করা হয়। অ্যাড্রেসিং মোড নির্ধারণ করে যে সিপিইউ কীভাবে ডেটা অ্যাক্সেস করে।
১. তাৎক্ষণিক ঠিকানা
ডেটা সরাসরি নির্দেশনার মধ্যেই অন্তর্ভুক্ত থাকে। এটি দ্রুত, কিন্তু নির্দেশনা পরিবর্তন না করে এর মাধ্যমে মান পরিবর্তন করা যায় না।
MOV AX, 5
2. সরাসরি সম্বোধন
ডেটা ধারণকারী মেমরি ঠিকানা স্পষ্টভাবে নির্দিষ্ট করা আছে।
MOV AX,
৩. পরোক্ষ সম্বোধন
একটি রেকর্ডের বিষয়বস্তু থেকে কার্যকরী ঠিকানা পাওয়া যায়। এটি খুব নমনীয় এবং স্ট্রাকচার ও লিঙ্কড লিস্টের জন্য ব্যবহৃত হয়।
MOV AX,
৪. সূচীবদ্ধ ঠিকানা
একটি বেস এবং একটি ইনডেক্স যোগ করে অ্যাড্রেস গণনা করা হয় (উদাহরণস্বরূপ, অ্যারে ট্র্যাভার্স করার জন্য)। এতে SI, DI, বা বেস + অফসেট রেজিস্টারের মতো বিশেষ রেজিস্টার ব্যবহৃত হয়।
MOV AX,
নির্দেশের বিন্যাস: স্থাপত্যের উপর নির্ভর করে বিভিন্ন ধরণের
একটি নির্দেশের কাঠামো স্থাপত্যের উপর নির্ভর করে পরিবর্তিত হতে পারে। সাধারণ ফর্ম্যাটগুলির মধ্যে রয়েছে:
৪-উপায় বিন্যাস
এতে দুটি অপারেন্ড, ফলাফলের স্থান এবং পরবর্তী নির্দেশনার ঠিকানা অন্তর্ভুক্ত থাকে। এর জটিলতার কারণে এটি এখন অপ্রচলিত ।
৪-উপায় বিন্যাস
এটি দুটি অপারেন্ড এবং একটি গন্তব্য ঠিকানা নির্দিষ্ট করে। এটি আধুনিক RISC আর্কিটেকচারে প্রচলিত।
৪-উপায় বিন্যাস
একটি উৎস অপারেন্ড এবং একটি গন্তব্য অপারেন্ড ব্যবহার করুন (গন্তব্যটিও মান প্রদান করতে পারে)। x86 এবং অন্যান্য CISC আর্কিটেকচারে এটি জনপ্রিয়।
ওয়ান-ওয়ে ফর্ম্যাট
কেবলমাত্র একটি অপারেন্ড নির্দিষ্ট করা থাকে; অন্যটিকে অ্যাকুমুলেটর হিসেবে ধরে নেওয়া হয়। এটি পুরোনো প্রসেসর এবং সরল সিস্টেমগুলোতে প্রচলিত।
০-ঠিকানা বিন্যাস (স্ট্যাক-ভিত্তিক)
অপারেশনগুলো অপারেন্ড এবং ফলাফল আনতে ও সংরক্ষণ করতে স্ট্যাক ব্যবহার করে। কিছু প্রোগ্রামেবল ক্যালকুলেটরের মতো স্ট্যাক-ভিত্তিক মেশিনের জন্য এটি খুবই কার্যকর।
ম্যাক্রো নির্দেশাবলী এবং ছদ্ম-অপকোড
উৎপাদনশীলতা বাড়ানোর জন্য, অনেক অ্যাসেম্বলার ম্যাক্রো নির্দেশাবলী প্রদান করে , যা একটিমাত্র লাইনকে কয়েকটি প্রকৃত নির্দেশাবলীতে প্রসারিত করে। জটিল প্যাটার্নের পুনরাবৃত্তি এড়াতে অথবা লুপ বা শর্তসাপেক্ষ বিবৃতির মতো উচ্চ-স্তরের কাঠামো তৈরি করার জন্য এগুলো উপযোগী।
The ছদ্ম-অপকোড এগুলি হল নির্দেশাবলী যা অ্যাসেম্বলার অভ্যন্তরীণভাবে নির্দেশাবলীর একটি বাস্তব ক্রমানুসারে অনুবাদ করে। উদাহরণস্বরূপ, NOP (কোনও অপারেশন নেই) অনুবাদ করা যেতে পারে XCHG AX, AX x86 CPU-তে।
অ্যাসেম্বলার নির্দেশিকা
ডিরেক্টিভ ( যাকে সিউডো-অপারেশনও বলা হয় ) কঠোর অর্থে নির্দেশাবলী নয়। এগুলি অ্যাসেম্বলি প্রক্রিয়া নিয়ন্ত্রণ করতে এবং ডেটা, কোড সেকশন, ম্যাক্রো, কম্পাইলেশন শর্ত ইত্যাদি সংজ্ঞায়িত করতে ব্যবহৃত হয়।
সাধারণ উদাহরণগুলির মধ্যে রয়েছে:
- .ডেটা / .কোড: তারা ডেটা বা কোড বিভাগটি নির্দেশ করে।
- .org: যে ঠিকানা থেকে সমাবেশ শুরু হবে তা সেট করে।
- .equal: প্রতীকী ধ্রুবক সংজ্ঞায়িত করে।
সমাবেশ ভাষা ব্যবহারের ক্ষেত্রে
উচ্চ-স্তরের ভাষার উত্থান সত্ত্বেও, অ্যাসেম্বলি ল্যাঙ্গুয়েজ বেশ কয়েকটি ক্ষেত্রে গুরুত্বপূর্ণ ভূমিকা পালন করে:
- এমবেডেড সিস্টেম এবং মাইক্রোকন্ট্রোলারের উন্নয়ন।
- প্রোগ্রামিং ড্রাইভার, বুটলোডার এবং BIOS।
- ভিডিও গেম বা ক্রিপ্টোগ্রাফির মতো অ্যাপ্লিকেশনগুলিতে চরম অপ্টিমাইজেশন।
- রিভার্স ইঞ্জিনিয়ারিং, ডিবাগিং এবং নিম্ন-স্তরের হ্যাকিং।
তাছাড়া, কম্পিউটার বিজ্ঞান এবং ইলেকট্রনিক্স ডিগ্রিতে অ্যাসেম্বলি ল্যাঙ্গুয়েজের প্রশিক্ষণ এখনও একটি গুরুত্বপূর্ণ স্থান অধিকার করে আছে , কারণ এটি একটি প্রসেসর কীভাবে কাজ করে, ডেটা কীভাবে সংরক্ষণ ও পরিচালনা করা হয় এবং বাইনারি স্তরে নির্দেশাবলী কীভাবে কার্যকর করা হয়, সে সম্পর্কে গভীর ধারণা প্রদান করে।
সকল ধরণের অ্যাসেম্বলি নির্দেশাবলী, তাদের গঠন, কার্যকারিতা এবং অ্যাড্রেসিং মোডগুলি বোঝা যে কোনও প্রোগ্রামারের জন্য একটি শক্ত ভিত্তি প্রদান করে যারা নিম্ন-স্তরের প্রোগ্রামিংয়ে গভীরভাবে প্রবেশ করতে চান বা বুঝতে চান যে উচ্চ-স্তরের ভাষাগুলি কীভাবে শেষ পর্যন্ত মেশিন কোডে অনুবাদ করা হয়। যদিও এর ব্যবহার আরও সুনির্দিষ্ট হয়ে উঠেছে, তবুও এটি সফ্টওয়্যার এবং সিস্টেম উন্নয়নের একাধিক গুরুত্বপূর্ণ ক্ষেত্রে একটি অপরিহার্য হাতিয়ার হিসেবে রয়ে গেছে।