زبان اسمبلی؛ صدایی که هنوز توی ذهنم داد میزنه
همهچیز از یک مقاله شروع شد. نوجوان بودم، نشسته بودم پای خوندن یه مقاله دربارهٔ هک و امنیت. نویسنده با آبوتاب توضیح داده بود که یک هکر چطور یک برنامه رو باز کرده و باگهاش رو پیدا کرده. به لطف اسمبلی — بله، همون زبان خشک و ترسناکی که خیلیها ازش میترسن — تونسته بود کار رو تموم کنه. اونجا بود که اولینبار با واژهٔ assembly روبهرو شدم. و واقعاً گفتم: بروووو این دیگه چیه؟!
اسمش یه حس مرموز داشت. انگار پشت پردهٔ نرمافزار، توی مغز خودِ کامپیوتره. و همین کافی بود که کنجکاو بشم.
نزدیکتر از همیشه به فلز
چیزی که برام جذاب بود فقط این نبود که هکرها برای مهندسی معکوس ازش استفاده میکنن. راستش دنبال چیز ترسناکتری بودم:
اینکه بفهمم سختافزار دقیقاً چطور فکر میکنه. بچه بودم و نادان! فکر میکردم کامپیوترها یه روزی به آگاهی میرسن. (و با این مدلهای زبانی جدید، انگار اونقدر هم اشتباه نکرده بودم...)
وقتی فهمیدم یک حلقهٔ ساده، یک شرط کوچک یا حتی یک return توی زبانهای سطح بالا، پایینتر که بری تبدیل میشن به کلی دستور mov، پرشهای شرطی و عملیات رجیستر… دیگه نمیتونستم مثل قبل به کدنویسی نگاه کنم.
اینکه بفهمی یک متغیر میتونه چند میکروثانیه یا نانوثانیه از CPU بگیره، اینکه stack واقعاً چطور کار میکنه و تعامل مستقیم با حافظه چه شکلیه… اینها نگاه من رو به همهٔ زبانهای برنامهنویسی عوض کرد.
تنها کد اسمبلیای که نوشتم — با افتخار 😎
اعتراف میکنم: من فقط یک بار اسمبلی نوشتم. یه Hello World ساده.
نه برای تمرین. نه برای ساخت ابزار. برای یک دلیل مهمتر:
تا جلوی دوستم پز بدم. 😂
ولی وقتی بعد از کلی تایپ و اجرا کردن، دیدم برنامه کار میکنه… انگار یک طلسم شکسته شد. حس کردم دارم مستقیم با ماشین حرف میزنم — با خودِ CPU. نه از پشت شیشهٔ زبانهای سطح بالا. بدون واسطه. انگار دنیا رو داده بودن دستم. و راستش حس میکردم شاخ غول رو شکستم.
داروغهای در ذهنم
نمیدونم دقیقاً کی بود، ولی از یک جایی به بعد فهمیدم یک چیز تو ذهنم مونده.
یک صدا. مثل اون لاشخور توی کارتون رابینهود که میگفت «نیمهشب شد!» یا شاید خود داروغه.
هر وقت یک کد سنگین، یک حلقهٔ بیخود یا یک تصمیم عجیب مینویسم، این داروغه تو سرم ظاهر میشه و میگه:
«مطمئنی این درسته؟ میدونی توی اسمبلی چی از آب در میاد؟ میدونی چطور کش CPU رو نابود میکنی؟»
اسمبلی برای من یک زبان نیست. یک یادآوری دائمیه. یک وجدان فنی که مجبورم میکنه در Go، در Java، در Rust — هرچند در حد توانم — دقیقتر بنویسم. بیشتر فکر کنم. حواسم بیشتر جمع بشه.
مهندسی معکوس — برای تفریح
یکبار برای فان رفتم توی یک CTF. تیم خیلی خاصی نبودیم، ولی توی یکی از مراحل یک فایل اجرایی داشتیم که فلگ داخلش پنهان شده بود. با Ghidra و خوندن یککم اسمبلی ساده، تونستیم الگوریتم رمزنگاریش رو مهندسی معکوس کنیم و فلگ رو دربیاریم (به لطف پادکست رادیوگیگ جادی).
همون لحظه فهمیدم—even if من هیچوقت اسمبلینویس حرفهای نشم—باز هم اسمبلی یک چیز واقعی، ملموس و بهدردبخوره.
چرا هنوز باید اسمبلی بلد بود؟
این روزها بیشتر دولوپرها با زبانهایی کار میکنن که حتی اشارهای به رجیستر نمیکنن. ولی هنوز توی کرنل لینوکس، توی پروژههایی مثل ffmpeg یا libav بخشهایی هست که دستی با اسمبلی نوشته شدن.
چون گاهی حتی GCC و Clang هم نمیتونن اونقدر بهینه کد بسازن. و اونجاست که یک آدم دقیق، یک گیک واقعی، میتونه وارد بشه و تغییر ایجاد کنه.
جمعبندی: اسمبلی — صدایی که خاموش نمیشه
اگر بخوام توی یک جمله بگم:
اسمبلی برای من یک داروغهٔ ذهنیه — یک وجدان فنی که از ته مغزم داد میزنه: «اینم آخرش میشه چند تا mov و jmp داغون!»
و البته منم کم نمیارم و کد داغونم رو مینویسم 😂
شاید هیچوقت توی پروژههام از اسمبلی استفاده نکنم، ولی اثرش همیشه باهامه — مثل یک معیار پنهانی توی ذهنم.
اسمبلی بهم یاد داد که پشت هر خط کد، یک دنیای مخفی وجود داره. و اگر بخوای، همیشه میتونی واردش بشی.
دیدگاهها
اولین نفری باشید که دیدگاه میگذارد.