زبان اَسمبلی ( Assembly language) یا همگذاری یک زبان برنامهنویسی سطح پایین برای رایانهها و دیگر دستگاههای برنامهپذیر است که رابطهٔ یک-به-یک با دستورالعملهای زبان ماشین معماری رایانه دارد. هر زبان اسمبلی مختص به یک معماری رایانه خاص است، برخلاف بیشتر زبانهای برنامهنویسی سطح بالا که با معماریهای مختلف سازگار هستند ولی برای اجرا شدن به مفسر و مترجم نیاز دارند.
زبان اسمبلی با استفاده از یک برنامهٔ جانبی به نام اسمبلر یا همگذار، به کد ماشین قابل اجرا تبدیل میشود؛ به این فرایند تبدیل، اسمبل کردن ( Assembling) گفته میشود.
زبان اسمبلی برای نشان دادن هر دستور ماشین سطح-پایین از آپکد استفاده میکند. بعضی آپکدها به یک یا چند عملوند به عنوان بخشی از دستورالعمل نیاز دارند و بیشتر اسمبلرها میتوانند لیبلها و نمادهایی را به عنوان عملوند، برای نشان دادن آدرسهای حافظه و ثابتهای عددی بپذیرند. ماکرو اسمبلرها نیز قابلیتMacroinstruction را شامل میشوند که این امکان را به وجود میآورد که متن یک کد زبان اسمبلی با یک نام از پیش تعیین شده در خلال متن یک کد دیگر استفاده شود. بیشتر اسمبلرها مکانیزمهای اضافی برای تسهیل فرایند توسعهٔ برنامه، کنترل فرایند اسمبل کردن و پشتیبانی از اشکالزدایی ارائه کردهاند.
اسمبلر
اسمبلر برنامهای است که با تبدیل یادیارهای دستوری اسمبلی ( Assembly instruction mnemonics) به آپکدها و جایگزینی شناسهها با آدرسهای حافظه، کد هدف ( Object code) را به وجود میآورد. استفاده از ارجاعات نمادی از ویژگیهای کلیدی اسمبلرها است که از محاسبات خستهکننده و بهروزرسانیهای دستی آدرسها بعد از تغییر کد برنامه توسط برنامهنویس جلوگیری میکند. بیشتر اسمبلرها از قابلیت ماکرو نیز بهره میبرند که این امکان را به وجود میآورد تا یک نام خاص برای یک تکه کد مشخص شود و سپس از آن نام در قسمتهای مختلف برنامه استفاده شود و در هنگام اسمبل کردن برنامه تکه کد مربوطه جایگزین نام آن شود؛ به عنوان مثال از این روش برای تولید توالیهای دستوری کوتاه رایج در خلال متن برنامه به جای فراخوانی رویهها استفاده میشود.
برخی از رایجترین اسمبلرهای معماری ایکس۸۶ عبارتند از:
- مایکروسافت ماکرو اسمبلر (Microsoft Macro Assembler یا MASM).
- نتواید اسمبلر ( Netwide Assembler یا NASM).
- گنو اسمبلر ( Gnu Assembler یا GAS).
- توربو اسمبلر ( Turbo Assembler یا TASM).
برنامهای که به زبان اسمبلی نوشته میشود شامل مجموعهای از دستورالعملهای پردازنده (یادیارها)، شبه-دستورها ( Pseudo-instructions)، کامنتها و دادهها است. دستورهای زبان اسمبلی معمولاً از یک آپکد و سپس فهرستی از دادهها، آرگومانها یا پارامترها تشکیل شدهاند و توسط اسمبلر به دستورهای زبان ماشین ترجمه و به حافظه منتقل میشوند تا اجرا شوند.
کاربرد زبان اسمبلی
در زمانی که کامپیوتر با قابلیت ذخیره کردن برنامه معرفی شد، زبانهای اسمبلی در دسترس نبودند. کثلین بوث مسئول اختراع زبان اسمبلی میباشد؛ که بر پایهٔ کار نظری اش که در سال ۱۹۷۴ آغاز کرد، میباشد. همزمان که با همفکری اندرو بوث (که در آینده همسر او شد) و با ریاضیدانی به نام جان فون نویمان و فیزیکدانی به نام هرمن گلداستاین در مؤسسه مطالعههای پیشرفته، بر روی ARC2 در دانشگاه لندن، بیرکبک کار میکرد. در اواخر ۱۹۴۸، محاسبه کننده ی خودکار مخزن تأخیر الکترونیکی (EDSAC) یک اسمبلر (به نام دستورهای اولیه) داشت که با برنامهٔ خودراه انداز آن دستگاه یکپارچه شده بود. از حافظه ای تک حرفی استفاده میکرد که به وسیلهٔ دیوید ویلر توسعه یافت. کسی که به عنوان سازندهٔ اولین اسمبلر، مسئول جامعهٔ کامپیوتر IEEE میباشد. گزارشهای دربارهٔ EDSAC، اسمبلی را برای فرایند ترکیب زمینهها برای رسیدن به یک کلمهٔ راهنما معرفی کردند. SOAP (برنامهٔ اسمبلی بهینهٔ نمادین) یک زبان اسمبلی برای کامپیوتر IBM 650 بود که به وسیلهٔ استن پلی در ۱۹۵۵ نوشته شد. زبان اسمبلی تعداد زیادی از نیازهای مستعد خطا، خسته کننده و وقت گیر برنامهنویسی نسل اول با اولین کامپیوترها را ازبین برد؛ و برنامه نویسان را از موارد خسته کننده ای از جمله به خاطر سپردن کدهای عددی و محاسبه کردن آدرسها آزاد کرد. آنها یک بار بهطور گسترده برای همهٔ انواع برنامهنویسی استفاده شدند. با این حال در دههٔ ۱۹۸۰ (در دههٔ ۱۹۹۰ برای ریزرایانهها) در جستجو برای بهرهوری برنامهنویسی که اثبات شدهاست، استفاده از آنها به مقدار زیادی با زبانهای سطح بالا جایگزین شد. امروزه زبان اسمبلی هنوز برای دست کاری دستی سختافزار، دسترسی به دستورالعملهای مخصوص پردازنده، یا برای آدرس دهی موضوعهای ساختاری بحرانی استفاده میشود. نمونههای استفاده عبارت اند از گردانندههای دستگاه، سیستمهای نهفتهٔ سطح پایین، و سیستمهای بی درنگ. از دید تاریخی، برنامههای متعددی وجود دارند که کاملاً به زبان اسمبلی نوشته شدهاند. باروز امسیپی(۱۹۶۱)(Burroughs MCP) اولین کامپیوتری بود که سیستم عملیاتی بهطور کامل به زبان اسمبلی توسعه نیافته بود؛ بلکه در زبان مشکل محور سیستمهای اجرایی (ESPOL) ـ که یک گویش از الگول (زبان الگوریتمی) میباشد ـ نوشته شده بود. همچنین بسیاری از کاربردهای تجاری به زبان اسمبلی نوشته شدند. به انضمام مقدار زیادی نرمافزارهای رایانههای بزرگ آیبیام که نوشته شده به وسیلهٔ شرکتهای بزرگ بود. بیشتر ریزرایانههای اولیه بر زبان اسمبلی از نوع کدگذاری دستی تکیه کردند. به انضمام بیشتر سیستمهای عملیاتی و برنامههای بزرگ. این بخاطر این بود که این سیستمها محدودیتهای شدید منابع، ساختارهای حافظه و نمایش ویژهٔ تحمیلی و سرویسهای سیستمی مشکل دار و محدود شده آماده شده داشتند. احتمالاً فقدان کامپایلرهای با زبان سطح بالای درجه یک مناسب برای استفاده ریزرایانه چیز مهمتری بود. زبان اسمبلی برای یک مدت طولانی زبان اصلی توسعه برای بسیاری از بازیهای کامپیوتری در دهههای ۱۹۸۰ و ۱۹۹۰ بود (از جمله اماسایکس، سینکلر زد ایکس اسپکتروم، کمودور ۶۴، کومودور آمیگا و آتاری استی). این در بخش بزرگی بود زیرا گویش پایهٔ تفسیری در این سیستمها با عث سرعت اجرایی ناکافی میشد همچنان که باعث قابلیتهای ناکافی برای بدست آوردن همهٔ مزیتهای سختافزار موجود در این سیستمها میشد. بعضی از سیستمها حتی یک محیط یکپارچه توسعه نرمافزار (IDE) دارند که دارای قابلیت فوق پیشرفته اشکال زدایی و قابلیتهای ماکروها هستند.
کاربرد کنونی اسمبلی
همواره بحثهایی دربارهٔ کاربردی بودن و نمایش زبان اسمبلی در مقابل زبانهای سطح بالا بودهاست. اگرچه در جایگاههای مخصوصی که اهمیت دارند، زبان اسمبلی استفاده میشود ، اما ابزارهای دیگری برای بهینهسازی وجود دارند. در ژوئیه ۲۰۱۷ شاخص تیوبی رتبهٔ محبوبیت زبان برنامهنویسی، زبان اسمبلی در رتبهٔ ۱۱ بالاتر از مثلاً ویژوال بیسیک بود. اسمبلر میتواند برای بهینهسازی سرعت یا بهینهسازی اندازه استفاده شود. در حالت بهینهسازی سرعت، کامپایلرهای بهینهساز مدرن مدعی میشوند که زبانهای سطح بالا را به کدهایی تبدیل میکنند که میتوانند به سرعت اسمبل با دست نوشته شده اجرا شوند، گرچه مثالهای خلاف هم میتوانند پیدا شوند. پیچیدگی پردازندههای مدرن و سیستمهای فرعی حافظهها، بهینهسازی مؤثر را بهطور افزاینده ای برای کامپایلر و همچنین برای برنامه نویسان اسمبلی سخت میکنند. علاوه بر این افزایش نمایش پردازندهها به این معنی است که بیشتر سی پی یوها بیشتر مواقع بی فایده ماندهاند، با تأخیرهایی که به خاطر تنگههای قابل پیشبینی مانند از دست دادن حافظهٔ پنهان، عملیاتها و صفحه بندی I/O رخ دادهاست. همین، سرعت اجرای کد خام را برای بسیاری از برنامه نویسان بیاهمیت کردهاست. در اینجا تعدادی موقعیت وجود دارد که احتمالاً توسعه دهندگان انتخاب بکنند تا از زبان اسمبلی استفاده بکنند.
- نوشتن کد برای سیستمهایی با پردازندههای قدیمی تر که گزینههای محدودی برای زبانهای سطح بالا دارند. از جمله آتاری ۲۶۰۰، کومودور ۶۴ و ماشین حسابهای با قابلیت رسم نمودار.
- کدی که باید تعامل مستقیم با سختافزار داشته باشد برای مثال در گردانندههای دستگاه
- در یک پردازندهٔ توکار یا DSP، قطعی مکرر نیازمند کوتاهترین تعداد حلقهها در هر قطعی میباشد، مانند یک قطعی که ۱۰۰۰ یا ۱۰۰۰۰ بار در ثانیه اتفاق میافتد.
- برنامههایی که نیازمند استفاده از پردازنده ـ دستور العملهای مخصوصی که در یک کامپایلر اجرا نشدند ـ میباشند. در هستهٔ بسیاری از الگوریتمهای رمز گذاری
- یک چیز قابل اجرا با سایز متراکم و مستقل مورد نیاز است مثالها شامل سیستم عامل تلفنها، سیستم سوخت و احتراق ماشینها، سیستمهای کنترل دستگاههای تهویهٔ مطبوع، سیستمهای امنیتی و سنسورها.
- برنامههای با حلقههای درونی حساس به نمایش.
- برنامههایی که تابعهای برداری شده را برای برنامهها در زبانهای سطح بالاتر از جمله C میسازند.
- برنامههای بی درنگ از جمله شبیهسازیها، سیستمهای جهتیاب پروازی و وسایل پزشکی. برای مثال در یک سیستم هدایت پرواز برقی . این سیستمها باید منابع تأخیرهای غیرقابل پیشبینی را حذف کنند، که ممکن است که با بعضی از زبانهای ترجمه شده، بازیافت خودکار حافظه، صفحه بندی عملیاتها ایجاد شوند.
- الگوریتمهای رمز نگاری که همیشه باید دقیقاً زمانی مشابه برای اجرا داشته باشند تا از حملههای زمانبندی جلوگیری کنند.
- در محیطهایی که کنترل کامل بر محیط مورد نیاز است، در موقعیتهای فوق امنیتی که همه چیز به شدت بررسی میشود.
- ویروسهای کامپیوتر، بارگذارهای بوت (راه اندازی)، گردانندههای معین دستگاه یا دیگر آیتمهای بسیار نزدیک به سختافزار یا سیستم عملیاتی سطح پایین.
زبان اسمبلی هنوز در بسیاری از برنامههای مهندسی برق و علوم کامپیوتر آموزش داده میشود. اگرچه تعداد کمی از برنامه نویسان امروزه معمولاً با زبان اسمبلی به عنوان ابزار کار میکنند، اما مفاهیم اصولی بااهمیت باقی میمانند. از زمانی که رفتار کامپیوتر، به شکل ابتدایی به وسیلهٔ مجموعهٔ دستور العملهایش تعریف میشود، راه منطقی برای یادگرفتن چینن مفهومهایی، مطالعهٔ که یک زبان اسمبلی است. بیشتر کامپیوترهای مدرن مجموعهٔ دستور العملهای مشابه دارند؛ بنابراین مطالعهٔ تنها یک زبان اسمبلی کافی است برای یادگیری: I) مفاهیم پایه؛ II) تشخیص موقعیتهایی که استفاده از زبان اسمبلی میتواند مناسب باشد؛ III) دیدن اینکه چه مقدار کد قابل اجرای کارآمد از یک زبان سطح بالا میتواند ساخته شود.