</>مدرسه زیب‌موجیاد بگیر، تمرین کن، بساز
مدرسهAssemblyدرس 1
درس 1 از 20 · ۴۰ دقیقه

NASM، لینک و اولین exit

یک مسئله واقعی را با «NASM، لینک و اولین exit» حل می‌کنیم و نتیجه را همان لحظه می‌بینیم.

۰امتیاز شما
نقشه این درس

بعد از این درس چه کاری می‌توانی انجام بدهی؟

  • NASM متن دستور را به object و ld آن را به executable Linux x86-64 تبدیل می‌کند؛ _start نقطه ورود است.
  • کد را اجرا و نتیجه را پیش‌بینی کنی
  • یک تغییر کوچک بدهی و اثرش را توضیح بدهی
  • خطای واقعی درس را بخوانی و برطرف کنی
به زبان زندگی واقعی

Assembly را ساده بفهم

Assembly تقریباً هر حرکت داده و هر پرش CPU را آشکار می‌کند؛ قرارداد ABI و مرز حافظه باید دقیق رعایت شوند.

نکته مهم برای شروع Assembly

اگر برنامه اجرا نشد، از آخرین خط پیام خطا شروع کن؛ نام فایل و شماره خط معمولاً نزدیک‌ترین سرنخ‌اند.

چرا مهم است؟ NASM متن دستور را به object و ld آن را به executable Linux x86-64 تبدیل می‌کند؛ _start نقطه ورود است.

اولین تمرین تو: rdi را 7 کن و با echo $? کد خروج را ببین. قبل از اجرا، خروجی تازه را در یک جمله بنویس.

کلاس پایه · بدون پیش‌نیاز

این درس را از چهار زاویه بفهم

قرار نیست چیزی را حفظ کنی. یک مفهوم را با چند تعبیر می‌بینی تا بالاخره تصویر ذهنی روشن خودت را بسازی.

1

خیلی ساده

Assembly زبانی برای تبدیل فکر به دستورهای دقیق است. برنامه یک ورودی می‌گیرد، کاری روی آن انجام می‌دهد و نتیجه‌ای قابل مشاهده می‌سازد.

2

تشبیه اول: دستور کار

کد مثل دستور کار یک همکار دقیق است: ترتیب مهم است، نام‌ها باید روشن باشند و هر مرحله باید نتیجه مشخصی داشته باشد.

3

تشبیه دوم: خط تولید

داده وارد خط می‌شود، چند ایستگاه آن را تغییر می‌دهند و خروجی بیرون می‌آید. با بررسی هر ایستگاه می‌توانیم خطا را پیدا کنیم.

4

مدل فنی

در مدل فنی، کد منبع پیش از اجرا ترجمه یا کامپایل می‌شود. خطای نحوی یعنی مترجم نتوانسته ساختار نوشته را بفهمد.

مدل ذهنی ثابت برای همه برنامه‌ها
۱

ورودی

چه داده‌ای وارد می‌شود؟ نام، عدد، کلیک یا درخواست؟

۲

پردازش

برنامه چه قانون یا محاسبه‌ای را اجرا می‌کند؟

۳

خروجی

چه نتیجه‌ای باید ببینی و چطور درستی آن را می‌سنجی؟

خواندن کد، خط‌به‌خط

هر خط دقیقاً چه کاری انجام می‌دهد؟

از بالا به پایین بخوان. ابتدا توضیح را ببین، سپس همان خط را در کارگاه پایین صفحه تغییر بده.

  1. global _start

    بخشی از دستور برنامه است؛ علامت‌ها و ترتیب آن برای محیط اجرا معنی مشخص دارند.

  2. section .text

    بخشی از دستور برنامه است؛ علامت‌ها و ترتیب آن برای محیط اجرا معنی مشخص دارند.

  3. _start:

    بخشی از دستور برنامه است؛ علامت‌ها و ترتیب آن برای محیط اجرا معنی مشخص دارند.

  4. mov rax, 60

    بخشی از دستور برنامه است؛ علامت‌ها و ترتیب آن برای محیط اجرا معنی مشخص دارند.

  5. mov rdi, 0

    بخشی از دستور برنامه است؛ علامت‌ها و ترتیب آن برای محیط اجرا معنی مشخص دارند.

  6. syscall

    بخشی از دستور برنامه است؛ علامت‌ها و ترتیب آن برای محیط اجرا معنی مشخص دارند.

واژه‌نامه خیلی ساده

کلمه‌هایی که نباید گنگ بمانند

کد

متنی با قواعد مشخص که کار مورد انتظار را برای کامپیوتر توضیح می‌دهد.

نحو یا Syntax

دستور زبان کد؛ مثل جای درست کلمات و نشانه‌ها در یک جمله.

متغیر

یک نام خوانا برای نگه‌داشتن مقداری که بعداً لازم داریم.

خروجی

نتیجه قابل مشاهده‌ای که برای بررسی برنامه بیرون می‌آید.

استاد جواب می‌دهد

سه «چرا»ی مهم درس اول

چرا کامپیوتر خودش منظور من را حدس نمی‌زند؟

چون برنامه بر اساس دستورهای دقیق و قابل تکرار کار می‌کند. این دقت باعث می‌شود همان ورودی، نتیجه‌ای پیش‌بینی‌پذیر بسازد. ابهام برای گفت‌وگوی انسانی طبیعی است، اما در کد باید تصمیم‌ها را روشن بنویسیم.

چرا از برنامه‌ای به این کوچکی شروع می‌کنیم؟

در نمونه کوچک، رابطهٔ علت و نتیجه واضح است. اگر فقط یک مقدار را تغییر بدهی، دقیقاً می‌فهمی چرا خروجی عوض شده؛ بعد همین فهم را به پروژه‌های بزرگ منتقل می‌کنی.

اگر خطا دیدم یعنی برای برنامه‌نویسی مناسب نیستم؟

نه. خطا گزارش محیط اجرا دربارهٔ چیزی است که نفهمیده یا نتوانسته انجام دهد. خط اول پیام، شماره خط و آخرین تغییری که داده‌ای سه سرنخ اصلی تو هستند.

تمرین پلکانی

از مشاهده تا نوشتن مستقل

هر مرحله فقط کمی سخت‌تر از مرحله قبل است؛ لازم نیست یک‌باره همه‌چیز را بلد باشی.

۱خیلی آسان

خروجی را حدس بزن

بدون اجرا، نتیجه نمونه را روی کاغذ بنویس. سپس آن را با نتیجه کارگاه مقایسه کن.

۲با راهنما

یک داده را تغییر بده

فقط نام یا عدد را عوض کن. توضیح بده کدام بخش خروجی باید تغییر کند و کدام بخش ثابت می‌ماند.

۳مستقل

یک خروجی تازه بساز

یک داده جدید مثل شهر یا هدف یادگیری بساز و با همان الگوی ساده آن را نمایش بده.

معیار موفقیت: برنامه بدون متن با exit code صفر تمام می‌شود.

روش مطالعه این درس
  1. یک‌بار کد را فقط بخوان.
  2. خروجی را قبل از اجرا حدس بزن.
  3. فقط یک مقدار را تغییر بده.
  4. نتیجه را با یک جمله برای خودت توضیح بده.
توضیح ساده و قدم‌به‌قدم

از یک مثال کوچک شروع کن

NASM متن دستور را به object و ld آن را به executable Linux x86-64 تبدیل می‌کند؛ _start نقطه ورود است. کد زیر را در فایل «main.asm» خودت تایپ و اجرا کن. بعد خروجی را با انتظار درس مقایسه کن.

1

۱. نمونه را اجرا کن

پیش از اجرا خروجی را حدس بزن و سپس تفاوت را یادداشت کن.

2

۲. کد را تغییر بده

rdi را 7 کن و با echo $? کد خروج را ببین.

3

۳. خطا را عمداً بساز

نام معماری یا فرمت object اشتباه هنگام link خطای ناسازگاری می‌دهد. متن خطا و شماره خط را بخوان، علت را پیدا کن و فقط همان بخش را اصلاح کن.

نکته مهم

اگر برنامه اجرا نشد، از آخرین خط پیام خطا شروع کن؛ نام فایل و شماره خط معمولاً نزدیک‌ترین سرنخ‌اند.

مفهوم‌های اصلی

سه قطعه‌ای که باید بفهمی

NASM، لینک و اولین exit

NASM متن دستور را به object و ld آن را به executable Linux x86-64 تبدیل می‌کند؛ _start نقطه ورود است.

نتیجه قابل مشاهده

برنامه بدون متن با exit code صفر تمام می‌شود.

خطایی که باید بشناسی

نام معماری یا فرمت object اشتباه هنگام link خطای ناسازگاری می‌دهد.

سناریوی واقعی

می‌خواهی مطمئن شوی assembler و linker درست نصب شده‌اند.

فرض کن می‌خواهی مطمئن شوی assembler و linker درست نصب شده‌اند. فعلاً قرار نیست کل برنامه را بسازیم؛ فقط همین نیاز را با چند خط کد حل می‌کنیم تا معلوم باشد هر خط چه کاری انجام می‌دهد.

بازی ساختن کد

قطعه‌ها را به ترتیب درست بچین

روی هر قطعه بزن تا وارد پاسخ شود؛ برای برگرداندن دوباره روی آن بزن. با دکمه‌های جابه‌جایی هم می‌توانی بدون کشیدن و رهاکردن ترتیب را اصلاح کنی.

مرحله ۲ از ۳ · مرتب‌کردن کد
بانک قطعه‌هاقطعه مناسب را انتخاب کن
ترتیب پاسخ تواز بالا به پایین اجرا می‌شود

    هنوز پاسخی بررسی نشده است.

    کارگاه تعاملی

    بررسی ساختار تمرین

    این صفحه کامپایلر کامل Assembly نیست؛ ساختار تمرین را صادقانه بررسی می‌کند و خروجی مورد انتظار را نشان می‌دهد. برای اجرای کامل به محیط رسمی همان زبان نیاز است.

    main.asm
    خروجیآماده
    یک بخش را تغییر بده و دکمه بررسی را بزن.
    بعد از هر تغییر، نتیجه را دوباره بررسی کن.
    تمرین هدایت‌شده

    rdi را 7 کن و با echo $? کد خروج را ببین. قبل از اجرا، خروجی تازه را در یک جمله بنویس.

    دام‌های رایج

    این سه اشتباه را انجام نده

    1

    نام معماری یا فرمت object اشتباه هنگام link خطای ناسازگاری می‌دهد.

    2

    کپی‌کردن کد بدون اجرای مرحله‌به‌مرحله

    3

    تغییر چند قسمت هم‌زمان و گم‌شدن علت نتیجه

    سنجش چندمرحله‌ای

    با 5 سؤال مطمئن شو که مفهوم را گرفته‌ای

    سؤال 1 از 5

    خروجی درست این نمونه چیست؟

    سؤال 2 از 5

    چرا پیش از اجرا نتیجه را حدس می‌زنیم؟

    سؤال 3 از 5

    سرنخ خطای این درس چیست؟

    سؤال 4 از 5

    بعد از تغییر کد چه کنیم؟

    سؤال 5 از 5

    چه وقت آماده درس بعدی هستی؟

    پایان درس 1

    فهمیدی، تغییر دادی، نتیجه را توضیح دادی؟

    فقط در این صورت درس را کامل کن و سراغ مرحله بعد برو.