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-এই যথাযথ।