Assembler
অ্যাসেম্বলার
Assembly mnemonic টেক্সট (.s)-কে machine code বিটে রূপান্তরকারী প্রোগ্রাম — প্রায় এক-থেকে-এক, কিন্তু আউটপুট (.o) এখনও অসম্পূর্ণ: external symbol-এর ঠিকানা placeholder থাকে।
Compiler না — কোনো optimization বা high-level সিদ্ধান্ত নেয় না। কাজ যান্ত্রিক: প্রতিটা mnemonic লাইন পড়ে ISA-র official encoding rule অনুযায়ী bit-প্যাটার্ন বসানো।
gcc -S -O0 square.c -o square.s # compiler: .c → .s (mnemonic টেক্সট)
as square.s -o square.o # assembler: .s → .o (machine code)
প্রায় এক-থেকে-এক, পুরোপুরি না — কিছু pseudo-instruction/macro নিজেই
সম্প্রসারণ করে (RISC-V-তে li a0, 0x123456 আসলে lui+addi-তে ভাঙে,
কারণ ফিক্সড ৩২-বিট instruction-এ এত বড় immediate ধরে না)।
Output object file (.o) অসম্পূর্ণ — নিজের ভেতর সংজ্ঞায়িত সবকিছুর
ঠিকানা ঠিক, কিন্তু external reference (printf, অন্য ফাইলের function)-এর
জন্য শুধু একটা placeholder আর একটা relocation entry (“এখানে পরে ঠিকানা
বসাও”)। nm file.o দিয়ে U (undefined) symbol হিসেবে এগুলো দেখা যায়।
এই “পরে ঠিক করা”-র দায়িত্ব [[linker]]-এর।
GNU টুলচেইনে as; LLVM-এ llvm-mc। দুটোই একই ধারণা বাস্তবায়ন করে, ভিন্ন
বাইনারি।