بعد از این درس چه کاری میتوانی انجام بدهی؟
- NASM متن دستور را به object و ld آن را به executable Linux x86-64 تبدیل میکند؛ _start نقطه ورود است.
- کد را اجرا و نتیجه را پیشبینی کنی
- یک تغییر کوچک بدهی و اثرش را توضیح بدهی
- خطای واقعی درس را بخوانی و برطرف کنی
Assembly را ساده بفهم
Assembly تقریباً هر حرکت داده و هر پرش CPU را آشکار میکند؛ قرارداد ABI و مرز حافظه باید دقیق رعایت شوند.
اگر برنامه اجرا نشد، از آخرین خط پیام خطا شروع کن؛ نام فایل و شماره خط معمولاً نزدیکترین سرنخاند.
چرا مهم است؟ NASM متن دستور را به object و ld آن را به executable Linux x86-64 تبدیل میکند؛ _start نقطه ورود است.
اولین تمرین تو: rdi را 7 کن و با echo $? کد خروج را ببین. قبل از اجرا، خروجی تازه را در یک جمله بنویس.
این درس را از چهار زاویه بفهم
قرار نیست چیزی را حفظ کنی. یک مفهوم را با چند تعبیر میبینی تا بالاخره تصویر ذهنی روشن خودت را بسازی.
خیلی ساده
Assembly زبانی برای تبدیل فکر به دستورهای دقیق است. برنامه یک ورودی میگیرد، کاری روی آن انجام میدهد و نتیجهای قابل مشاهده میسازد.
تشبیه اول: دستور کار
کد مثل دستور کار یک همکار دقیق است: ترتیب مهم است، نامها باید روشن باشند و هر مرحله باید نتیجه مشخصی داشته باشد.
تشبیه دوم: خط تولید
داده وارد خط میشود، چند ایستگاه آن را تغییر میدهند و خروجی بیرون میآید. با بررسی هر ایستگاه میتوانیم خطا را پیدا کنیم.
مدل فنی
در مدل فنی، کد منبع پیش از اجرا ترجمه یا کامپایل میشود. خطای نحوی یعنی مترجم نتوانسته ساختار نوشته را بفهمد.
ورودی
چه دادهای وارد میشود؟ نام، عدد، کلیک یا درخواست؟
پردازش
برنامه چه قانون یا محاسبهای را اجرا میکند؟
خروجی
چه نتیجهای باید ببینی و چطور درستی آن را میسنجی؟
هر خط دقیقاً چه کاری انجام میدهد؟
از بالا به پایین بخوان. ابتدا توضیح را ببین، سپس همان خط را در کارگاه پایین صفحه تغییر بده.
global _startبخشی از دستور برنامه است؛ علامتها و ترتیب آن برای محیط اجرا معنی مشخص دارند.
section .textبخشی از دستور برنامه است؛ علامتها و ترتیب آن برای محیط اجرا معنی مشخص دارند.
_start:بخشی از دستور برنامه است؛ علامتها و ترتیب آن برای محیط اجرا معنی مشخص دارند.
mov rax, 60بخشی از دستور برنامه است؛ علامتها و ترتیب آن برای محیط اجرا معنی مشخص دارند.
mov rdi, 0بخشی از دستور برنامه است؛ علامتها و ترتیب آن برای محیط اجرا معنی مشخص دارند.
syscallبخشی از دستور برنامه است؛ علامتها و ترتیب آن برای محیط اجرا معنی مشخص دارند.
کلمههایی که نباید گنگ بمانند
کد
متنی با قواعد مشخص که کار مورد انتظار را برای کامپیوتر توضیح میدهد.
نحو یا Syntax
دستور زبان کد؛ مثل جای درست کلمات و نشانهها در یک جمله.
متغیر
یک نام خوانا برای نگهداشتن مقداری که بعداً لازم داریم.
خروجی
نتیجه قابل مشاهدهای که برای بررسی برنامه بیرون میآید.
سه «چرا»ی مهم درس اول
چرا کامپیوتر خودش منظور من را حدس نمیزند؟
چون برنامه بر اساس دستورهای دقیق و قابل تکرار کار میکند. این دقت باعث میشود همان ورودی، نتیجهای پیشبینیپذیر بسازد. ابهام برای گفتوگوی انسانی طبیعی است، اما در کد باید تصمیمها را روشن بنویسیم.
چرا از برنامهای به این کوچکی شروع میکنیم؟
در نمونه کوچک، رابطهٔ علت و نتیجه واضح است. اگر فقط یک مقدار را تغییر بدهی، دقیقاً میفهمی چرا خروجی عوض شده؛ بعد همین فهم را به پروژههای بزرگ منتقل میکنی.
اگر خطا دیدم یعنی برای برنامهنویسی مناسب نیستم؟
نه. خطا گزارش محیط اجرا دربارهٔ چیزی است که نفهمیده یا نتوانسته انجام دهد. خط اول پیام، شماره خط و آخرین تغییری که دادهای سه سرنخ اصلی تو هستند.
از مشاهده تا نوشتن مستقل
هر مرحله فقط کمی سختتر از مرحله قبل است؛ لازم نیست یکباره همهچیز را بلد باشی.
خروجی را حدس بزن
بدون اجرا، نتیجه نمونه را روی کاغذ بنویس. سپس آن را با نتیجه کارگاه مقایسه کن.
یک داده را تغییر بده
فقط نام یا عدد را عوض کن. توضیح بده کدام بخش خروجی باید تغییر کند و کدام بخش ثابت میماند.
یک خروجی تازه بساز
یک داده جدید مثل شهر یا هدف یادگیری بساز و با همان الگوی ساده آن را نمایش بده.
معیار موفقیت: برنامه بدون متن با exit code صفر تمام میشود.
از یک مثال کوچک شروع کن
NASM متن دستور را به object و ld آن را به executable Linux x86-64 تبدیل میکند؛ _start نقطه ورود است. کد زیر را در فایل «main.asm» خودت تایپ و اجرا کن. بعد خروجی را با انتظار درس مقایسه کن.
۱. نمونه را اجرا کن
پیش از اجرا خروجی را حدس بزن و سپس تفاوت را یادداشت کن.
۲. کد را تغییر بده
rdi را 7 کن و با echo $? کد خروج را ببین.
۳. خطا را عمداً بساز
نام معماری یا فرمت object اشتباه هنگام link خطای ناسازگاری میدهد. متن خطا و شماره خط را بخوان، علت را پیدا کن و فقط همان بخش را اصلاح کن.
اگر برنامه اجرا نشد، از آخرین خط پیام خطا شروع کن؛ نام فایل و شماره خط معمولاً نزدیکترین سرنخاند.
سه قطعهای که باید بفهمی
NASM، لینک و اولین exit
NASM متن دستور را به object و ld آن را به executable Linux x86-64 تبدیل میکند؛ _start نقطه ورود است.
نتیجه قابل مشاهده
برنامه بدون متن با exit code صفر تمام میشود.
خطایی که باید بشناسی
نام معماری یا فرمت object اشتباه هنگام link خطای ناسازگاری میدهد.
میخواهی مطمئن شوی assembler و linker درست نصب شدهاند.
فرض کن میخواهی مطمئن شوی assembler و linker درست نصب شدهاند. فعلاً قرار نیست کل برنامه را بسازیم؛ فقط همین نیاز را با چند خط کد حل میکنیم تا معلوم باشد هر خط چه کاری انجام میدهد.
قطعهها را به ترتیب درست بچین
روی هر قطعه بزن تا وارد پاسخ شود؛ برای برگرداندن دوباره روی آن بزن. با دکمههای جابهجایی هم میتوانی بدون کشیدن و رهاکردن ترتیب را اصلاح کنی.
بررسی ساختار تمرین
این صفحه کامپایلر کامل Assembly نیست؛ ساختار تمرین را صادقانه بررسی میکند و خروجی مورد انتظار را نشان میدهد. برای اجرای کامل به محیط رسمی همان زبان نیاز است.
یک بخش را تغییر بده و دکمه بررسی را بزن.
راهنماییها مرحلهای هستند؛ اول خودت پیام خطا را بخوان.
rdi را 7 کن و با echo $? کد خروج را ببین. قبل از اجرا، خروجی تازه را در یک جمله بنویس.
این سه اشتباه را انجام نده
نام معماری یا فرمت object اشتباه هنگام link خطای ناسازگاری میدهد.
کپیکردن کد بدون اجرای مرحلهبهمرحله
تغییر چند قسمت همزمان و گمشدن علت نتیجه
با 5 سؤال مطمئن شو که مفهوم را گرفتهای
خروجی درست این نمونه چیست؟
چرا پیش از اجرا نتیجه را حدس میزنیم؟
سرنخ خطای این درس چیست؟
بعد از تغییر کد چه کنیم؟
چه وقت آماده درس بعدی هستی؟
فهمیدی، تغییر دادی، نتیجه را توضیح دادی؟
فقط در این صورت درس را کامل کن و سراغ مرحله بعد برو.