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

Inline Assembly

ইনলাইন অ্যাসেম্বলি

GCC/Clang-এর extended asm volatile("..." : outputs : inputs : clobbers) সিনট্যাক্স — C কোডের ভেতর থেকে সরাসরি raw machine instruction বসানো। শেষ অস্ত্র — যেখানে কোনো C বা intrinsic equivalent নেই সেখানেই কেবল।

also: asm volatile, extended asm, __asm__

চার কোলন-বিভক্ত অংশ:

asm volatile("rdtsc" : "=a"(lo), "=d"(hi));

Template — আক্ষরিক instruction, %0,%1… দিয়ে operand reference। Output ("=r" লেখে, "+r" পড়ে-লেখে দুটোই)। Input ("r" যেকোনো register, "a"/"d" নির্দিষ্ট register, ISA বাধ্য করলে)। Clobber"cc" (flags বদলেছে), "memory" (পুরো memory barrier, compiler কোনো memory access reorder/cache করবে না)।

volatile কেন আবশ্যক — output ব্যবহৃত না হলে, volatile ছাড়া কম্পাইলার পুরো asm block dead-code হিসেবে মুছে দিতে পারে (compiler জানে না hardware timestamp counter পড়া-র মতো side effect আছে)।

Early-clobber (&) — output যদি সব input পড়ার আগেই লেখা হয়, & ছাড়া compiler input-এর সাথে একই register বরাদ্দ করতে পারে, input পড়ার আগেই overwrite হয়ে যায় — silent বাগ।

আজ প্রায় সবসময় এড়ানো উচিত — <immintrin.h> intrinsics (SIMD), <stdatomic.h> (atomic ops) কম্পাইলার-বোধগম্য, নিরাপদ বিকল্প। Inline asm একটা black box — এর ভেতর কী হচ্ছে কম্পাইলার বুঝতে পারে না, আশেপাশের optimization সীমিত করে দেয়। শুধু rdtsc/cpuid-জাতীয় সত্যিকারের no-C-equivalent instruction-এই যথাযথ।