Foundationপ্রথম নীতি থেকে
LEVEL 3

অ্যাসেম্বলি ল্যাঙ্গুয়েজ

Assembly Language

এই মডিউল যে প্রশ্নের উত্তর দেয়আমার C function compile হয়ে ঠিক কোন instruction-গুলো হলো, আর কেন?

Assembly শেখার উদ্দেশ্য assembly-তে software লেখা না। উদ্দেশ্য হলো compiler কী বানায় সেটা পড়তে পারা, debugger-এ কী দেখছি বুঝতে পারা, আর performance/security-র প্রশ্নে নিচে নামতে পারা।

১২ লেসন৩ প্রজেক্ট~৭০ ঘণ্টাপড়ার সময় ১১ ঘণ্টা ১০ মিনিট0%

লেসন

  1. 01অ্যাসেম্বলার, লিংকার, লোডার — সোর্স কোড থেকে চলমান প্রোগ্রাম পর্যন্তAssembly module শেখার লক্ষ্য assembly লেখা না — লক্ষ্য compiler কী বানাচ্ছে তা পড়তে পারা। এই লেসন সেই পুরো যাত্রাটা ম্যাপ করে: .c থেকে .s (compiler), .s থেকে .o (assembler), একাধিক .o আর library থেকে একটা executable (linker), আর সেই executable-কে চলমান process বানানো (loader) — প্রতিটা ধাপ বাস্তব gcc/as/ld কমান্ড দিয়ে হাতে-কলমে ট্রেস করা।মাঝারি৫০ মিনিটEXPERIMENTBUILD
  2. 02x86-64 Syntax — AT&T বনাম Intel, একই instruction দুই ভাষায়একই instruction, দুই সম্পূর্ণ ভিন্ন দেখতে টেক্সট — AT&T syntax (GNU টুলচেইনের ডিফল্ট: gdb, objdump, gas) বনাম Intel syntax (Intel-এর নিজস্ব ডকুমেন্টেশন, NASM/MASM-এর ডিফল্ট)। Operand order উল্টো, register/immediate prefix ভিন্ন, কিন্তু নিচে ঠিক একই বাইট — এই লেসন দুই syntax পাশাপাশি শেখাবে, register set আর মূল instruction category বাস্তব উদাহরণসহ।কঠিন১ ঘণ্টাEXPERIMENTBUILD
  3. 03ARM64 (AArch64) Basics — এক syntax-এ, বিশুদ্ধ RISC-এARM64 (AArch64) — গত module-এর risc-vs-cisc আলোচনার একদম বিশুদ্ধ বাস্তবায়ন। একটাই syntax (কোনো AT&T/Intel ফোর্ক নেই), x0-x30/w0-w30-এর সরল রেজিস্টার-এলিয়াসিং, x30/lr link register দিয়ে return-address সামলানোর ভিন্ন কৌশল, আর load-store architecture-এর কঠোর নিয়ম -- arithmetic instruction কখনো memory ছোঁয় না। x86-64-র সাথে পাশাপাশি একই ফাংশন কম্পাইল করে এই সব পার্থক্য concrete করে দেখানো হবে।মাঝারি৫৫ মিনিটEXPERIMENTBUILD
  4. 04Register ও Calling Convention — System V AMD64 ABIযে register-এ argument আসে, সেটা hardware-এর নিয়ম না — System V AMD64 ABI নামের একটা software চুক্তি, যা মেনে চললেই ভিন্ন compiler বা ভাষায় লেখা কোড একে অপরকে সঠিকভাবে call করতে পারে।কঠিন১ ঘণ্টাEXPERIMENTBUILD
  5. 05Stack Frame ও Function Call — call/ret-এর ভেতরের যন্ত্রপাতিStack একটা memory-অঞ্চল যেটা নিচের দিকে বাড়ে — call return address push করে জাম্প করে, prologue/epilogue frame স্থাপন ও ভাঙে, আর ঠিক এই একই কাঠামো buffer overflow-এর মতো একটা ক্লাসিক দুর্বলতার জন্মস্থান।কঠিন১ ঘণ্টা ৫ মিনিটEXPERIMENTBUILD
  6. 06Control Flow ইন অ্যাসেম্বলি — cmp, test, আর conditional jump-এর পরিবারকোনো CPU-তে if instruction নেই — শুধু cmp/test দিয়ে flags সেট করা আর conditional jump দিয়ে সেই flags পড়ে সিদ্ধান্ত নেওয়া; if/while/for সবই এই একই দুইটা প্রাথমিক উপাদানের ভিন্ন বিন্যাস মাত্র।মাঝারি৫০ মিনিটEXPERIMENTBUILD
  7. 07Addressing ও Pointer Arithmetic — ঠিকানার গণিতx86-64-এর memory operand একটা ছোট্ট সমীকরণ — base + index×scale + displacement। এই একটামাত্র প্যাটার্ন দিয়েই array indexing, pointer arithmetic, struct field access, আর array-of-struct access — সবকিছু এনকোড হয়। এই লেসনে আমরা computer-architecture module-এর addressing-mode তত্ত্বকে সরাসরি real x86-64 syntax-এ নামিয়ে আনব, আর দেখব offsetof-এর সংখ্যাটা ঠিক কীভাবে একটা instruction-এর displacement field হয়ে ওঠে।মাঝারি৫০ মিনিটEXPERIMENTBUILD
  8. 08Compiler Output পড়া — -O0 বনাম -O2এই মডিউলের driving question-এর সরাসরি উত্তর — আমার C function compile হয়ে ঠিক কোন instruction হলো, আর কেন। একই function-এর -O0 (আক্ষরিক, ধীর, কিন্তু predictable) আর -O2 (register-ভিত্তিক, দ্রুত, কিন্তু debugger-এ বিভ্রান্তিকর) output পাশাপাশি রেখে প্রতিটা পার্থক্যের একটা নির্দিষ্ট কারণ খুঁজে বের করব — আর দেখব কেন দুটোই তাদের নিজস্ব প্রসঙ্গে সঠিক পছন্দ।কঠিন১ ঘণ্টাEXPERIMENTBUILD
  9. 09Inline Assembly — C-এর ভেতর থেকে সরাসরি Instructionগত লেসনে আমরা দেখেছি কম্পাইলার প্রায় সবসময় হাতে-লেখা assembly-র চেয়ে ভালো কোড বানায়। কিন্তু কিছু CPU instruction-এর কোনো C প্রতিশব্দই নেই — rdtsc, cpuid, লক-করা atomic operation। তখনই GCC/Clang-এর extended inline assembly দরকার — asm volatile("..." : outputs : inputs : clobbers)। এই লেসনে চারটা অংশ, volatile-এর আসল প্রয়োজন, আর সবচেয়ে গুরুত্বপূর্ণ — কেন এটা প্রায় সবসময় এড়ানো উচিত, শুধু genuine edge case-এই ব্যবহার করা উচিত।কঠিন৫৫ মিনিটEXPERIMENTBUILD
  10. 10Position-Independent Code — GOT আর PLT-এর ভেতরের গল্পশেয়ার্ড লাইব্রেরি যেকোনো ঠিকানায় লোড হতে পারে বলেই তার কোড RIP-relative addressing, GOT আর PLT ব্যবহার করে — আর এই একই কৌশল ASLR-কে বাস্তবায়নযোগ্য করে তোলে।কঠিন৫৫ মিনিটEXPERIMENTBUILD
  11. 11ELF Format — একটা বাইনারি ফাইলের ভেতরের নকশাELF একটাই container format — object file, executable, shared library সবই — magic bytes দিয়ে শুরু, headers দিয়ে linker/loader-কে গাইড করে; section গুলো build-time granularity, segment গুলো runtime mapping, আর অনেক section মিলে একটা segment হয়।মাঝারি৫০ মিনিটEXPERIMENTBUILD
  12. 12gdb দিয়ে Instruction-Level Debugginggdb দিয়ে আগের এগারোটা লেসনের প্রতিটা ধারণা — calling convention, stack frame, addressing mode, GOT/PLT — একটা সত্যিকারের চলমান প্রসেসে সরাসরি চোখে দেখা যায়, breakpoint-এ থামিয়ে instruction-বাই-instruction।কঠিন১ ঘণ্টাEXPERIMENTBUILD

যা যা থাকছে

  • Assembler, linker, loader-এর ভূমিকা
  • x86-64 syntax (AT&T ও Intel)
  • ARM64 (AArch64) basics
  • Registers ও calling conventions (System V ABI)
  • Stack frames, prologue, epilogue
  • Function calls ও return
  • Control flow — jumps, conditions, loops
  • Addressing ও pointer arithmetic
  • Compiler output পড়া (-O0 vs -O2)
  • Inline assembly
  • Position independent code
  • ELF format ও sections
  • gdb/lldb দিয়ে instruction-level debugging

প্রজেক্ট

Hand-written Assembly Programs

●●●○○

strlen, memcpy, fibonacci — libc ছাড়া।

Toy Assembler

●●●●○

নিজের mini-ISA-র text assembly → machine code।

Compiler Output Autopsy

●●○○○

একই C code-এর -O0/-O2/-O3 output তুলনা করে report লেখা।