زبان اسمبلی یک زبان برنامه‌نویسی سطح پایین (Low-level Programming Language) است که دستوراتش معادل کدهای ماشین (Machine Code) هستند. به عبارت دیگر، مجموعه‌ای از دستورات باینری (Binary) که مقادیری را به داخل رجیسترهای CPU (یا ریزپردازنده‌های دیگر) می‌ریزند یا از آن برمی‌دارند.

 

مقدمه

یک ریزپردازنده، یک ماشین حساب مکانیکی است. یک ریزپردازنده تعدادی رجیستر (Register) مشخص دارد که می‌توانیم آنها را مکانی برای نگهداری اعداد در نظر بگیریم. دستورات به صورت کدهای ماشین به یک ریزپردازنده داده می‌شوند. هر دستور به صورت مجموعه‌ای از بیت‌های باینری نمایش داده می‌شود (مجموعه‌ای از ۰ و ۱ها). برای مثال، در زیر یک خط کد ماشین می‌بینید:

چند بیت اول (۱۰۱۱۰) دستور کپی کردن یک مقدار در یک رجیستر است.  سه رقم دیگر (۰۰۰) رجیستری را مشخص می‌کنند که می‌خواهیم مقدار را در آن کپی کنیم. بقیه‌ی ارقام (۰۱۱۰۰۰۰۱)، مقداری را نشان می‌دهند که می‌خواهیم کپی کنیم.

البته ۱۰۱۱۰ بی‌معناست و کامپیوتر “نمی‌داند” که این ارقام در واقع می‌گویند “این مقدار را کپی کن”. پردازنده به گونه‌ای طراحی می‌شود که مجموعه‌ای از پالس‌های الکتریکی، که ۱۰۱۱۰ تعیین می‌کند (وصل، قطع، وصل، وصل، قطع)، نتیجه‌ی موردنظر را به ما بدهد. به همین دلیل از کلمه‌ی “مکانیکی” استفاده می‌شود.

حالا تصور کنید که می‌خواهید دستوری برای پردازنده بنویسید. خیلی راحت می‌توانید ببینید که نوشتن هزاران خط ۰ و ۱ می‌تواند چقدر خسته‌کننده و پر از خطا باشد. راه‌حل این مشکل، زبان برنامه نویسی اسمبلی است. زبان اسمبلی جایگزین‌هایی را برای کدهای طولانی باینری در نظر می‌گیرد که برای انسان قابل فهمند.

پیشنهاد فرانش به شما
بهترین زبان‌‌ های برنامه نویسی در ۲۰۱۹: ۱۰ زبان برتر برای یادگیری

مثال

برای مثال، اگر ۱۰۱۱۰ به معنای “مقدار را جابه‌جا کن (Move the Value)” باشد، می‌توانیم آن را کوتاه‌تر کنیم و از دستور MOV استفاده کنیم.

هم‌چنین می‌توانیم به رجیستر ۰۰۰ نامی بدهیم که یادآوری آن راحت‌تر باشد (در این مورد، نام این رجیستر را AL گذاشتیم).

در نهایت، می‌توانیم مقدار را به دستگاه اعداد (Numbering System) دیگری ببریم، مثل دسیمال (۹۱) یا هگزادسیمال (۶۱). آن وقت کد بالا به این صورت تغییر می‌کند:

MOV AL, 61

وقتی کل برنامه را به این روش نوشتیم، آن وقت assembler می‌تواند هر خط کد را به مشابه باینری مناسب آن تبدیل کند.

کامپیوترها با اجرای میلیون‌ها دستور کوچک این‌ چنینی در ثانیه کار می‌کنند (محاسبات را انجام می‌دهند، داده‌ها را جابه‌جا یا منتقل می‌کنند).

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

 

منابع یادگیری زبان اسمبلی

منابع آنلاین

مراجع

  • لیست دستورات X86: لیستی کامل از دستورات معماری X86، به همراه نکاتی درباره‌ی زمان اضافه شدن هر کدام
  • مرجع دستورات و Opcode برای معماری X86
  • چیت‌شیت (Cheat Sheet) زبان اسمبلی برای معماری X86

ابزارها

اسمبلرها- اسمبلرهای زیادی موجودند. در زیر لیستی از معروف‌ترین اسمبلرهای متن باز و رایگان را مشاهده می‌کنید:

  • NASM
  • FASM
  • YASM
  • GASM

IDEها (محیط یکپارچه‌ی توسعه‌ی نرم افزار)

  • SASM: یک IDE ساده و کراس‌پلتفرم (Cross-platform) برای زیان‌های اسمبلی NASM، MASM، GAS، FASM
  • Fresh IDE: IDE ویژوالِ زبان اسمبلی که دارای اسمبلر FASM است
  • WinAsm Studio: یک IDE رایگان که با استفاده از آن می‌توانید به کمک Assembler برای ویندوز ۳۲-بیت و DOS 16-بیت برنامه بنویسید
  • Visual MASM

انجمن و یادگیری مداوم

  • انجمن Assembly در In.Code
  • انجمن MASM
  • انجمن‌های Assembly Language and Machine Code در Hack Forums 

کتاب‌ها

پیشنهاد فرانش به شما
آموزش گام به گام سی شارپ C#

 

آیا یادگیری زبان اسمبلی (Assembly) برایتان ضروری است؟

یادگیری زبان اسمبلی به اهداف شما بستگی دارد. پاسخ این سؤال برای بیشتر برنامه نویسان “خیر” است.

دو دلیل اصلی برای یادگیری زبان اسمبلی داریم: یا اینکه می‌خواهید مسقیماً از آن استفاده کنید یا اینکه می‌خواهید درکی بسیار پایه از سیستم‌های کامپیوتری به‌دست آورید.

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

درصد بالایی از توسعه‌های نرم‌افزاری، در صورتی که تمامی انواع توسعه‌های نرم‌افزاری موجود را در نظر بگیریم، با استفاده از زبان‌های برنامه‌نویسی سطح بالا انجام می‌شوند. در زیر لیست مواردی را می‌بینید که در آنها از زبان اسمبلی استفاده می‌شود:

  • سیستم‌های عامل
  • سفت‌افزار (Firmware)
  • درایورهای دستگاه (Device Driver)
  • طراحی زبان
  • طراحی کامپایلر (Compiler)
  • سیستم‌های تعبیه‌شده (embedded Systems)
  • طراحی سخت‌افزار
  • رمزنگاری پیشرفته
  • علوم کامپیوتر نظری

دلیل دیگر یادگیری زبان اسمبلی می‌تواند به دست آوردن درکی بهتر از اتفاقاتی باشد که در دل یک سیستم کامپیوتری می‌افتد (این همان دلیلی است که تمامی رشته‌های علوم کامپیوتر باید زبان اسمبلی را یاد بگیرند).

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

زبان‌های دیگری که می‌توانید یاد بگیرید

زبان‌های دیگری به جز اسمبلی هستند که با یادگیری کمی از آنها می‌توانید توانایی انجام کارهای بسیار زیادی را به‌دست آورید. مثل پایتون (Python) یا روبی (Ruby) که با یادگیری یک هفته‌ای این زبان‌ها می‌توانید برنامه‌ای ارزشمند بنویسد. زبان اسمبلی اینگونه نیست.

پیشنهاد فرانش به شما
۱۰ دلیل برای یاد گرفتن پایتون

هرگز از زبان اسمبلی به تنهایی استفاده نمی‌شود. مهندسی که باید زبان اسمبلی بلد باشد، احتمالاً در محیطی کار می‌کند که به مهارت‌های دیگری نیز نیاز دارد. مثل:

  • زبان‌های سخت افزاری مثل VHDL و Verilog. به همراه دانشی مناسب از ریزپردازنده‌ها و مهندسی الکترونیک
  • زبان‌های سطح پایین سیستم عامل مثل C و زبان‌های فرزندش مثل C++، C# و D
  • زبان‌های قدیمی مثل Fortran و Cobol
  • زبان‌های پلتفرمی مثل جاوا و Objective-C
  • الگوریتم‌ها
  • طراحی کامپایلر، مفسر و زبان

 

 

شما چه زبان‌هایی بلد هستید؟

یادگیری چه زبانی را پیشنهاد می‌کنید؟