زبان اسمبلی

زبان اَسمبلی (به انگلیسی: Assembly language) یا همگذاری یک زبان برنامه‌نویسی سطح پایین برای رایانه‌ها و دیگر دستگاه‌های برنامه‌پذیر است که رابطهٔ یک-به-یک با دستورالعمل‌های زبان ماشین معماری رایانه دارد. هر زبان اسمبلی مختص به یک معماری رایانه خاص است، برخلاف بیشتر زبان‌های برنامه‌نویسی سطح بالا که با معماری‌های مختلف سازگار هستند ولی برای اجرا شدن به مفسر و مترجم نیاز دارند.
زبان اسمبلی با استفاده از یک برنامه جانبی به نام اسمبلر یا همگذار، به کد ماشین قابل اجرا تبدیل می‌شود؛ به این فرایند تبدیل، اسمبل کردن (به انگلیسی: Assembling) گفته می‌شود.
زبان اسمبلی از یادیارها برای نشان دادن هر دستور ماشین سطح-پایین یا آپ‌کد استفاده می‌کند. بعضی آپ‌کدها به یک یا چند عملوند به عنوان بخشی از دستورالعمل نیاز دارند، و بیشتر اسمبلرها می‌توانند لیبل‌ها و نمادهایی را به عنوان عملوند، برای نشان دادن آدرس‌های حافظه و ثابت‌های عددی بپذیرند. ماکرو اسمبلرها نیز قابلیت درشت‌دستوری (به انگلیسی: Macroinstruction) را شامل می‌شوند که این امکان را به وجود می‌آورد که متن یک کد زبان اسمبلی با یک نام از پیش تعیین شده در خلال متن یک کد دیگر استفاده شود. بیشتر اسمبلرها مکانیزم‌های اضافی برای تسهیل فرایند توسعه برنامه، کنترل فرایند اسمبل کردن و پشتیبانی از اشکال‌زدایی ارائه کرده‌اند.

زبان اسمبلی

برنامه‌ای که به زبان اسمبلی نوشته می‌شود شامل مجموعه‌ای از دستورالعمل‌های پردازنده (یادیارها)، شبه-دستورها (به انگلیسی: Pseudo-instructions)، کامنت‌ها و داده‌ها است. دستورهای زبان اسمبلی معمولاً از یک آپ‌کد و سپس فهرستی از داده‌ها، آرگومان‌ها یا پارامترها تشکیل شده‌اند و توسط اسمبلر به دستورهای زبان ماشین ترجمه و به حافظه منتقل می‌شوند تا اجرا شوند.
برای مثال، دستور زیر به پردازندهٔ معماری ایکس۸۶/آی‌ای-۳۲ می‌گوید که یک مقدار ثابت ۸ بیتی را به یک ثبات منتقل کند. کد باینری این دستور 10110 است که پس از آن یک شناسهٔ ۳ بیتی می‌آید تا مشخص کند کدام ثبات باید استفاده شود. 000 شناسهٔ ثبات AL است، بنابراین کد ماشین زیر دادهٔ 01100001 را در ثبات AL بار می‌کند:
10110000 01100001
این کد باینری را می‌توان با تبدیل به مبنای ۱۶ کمی خواناتر کرد:
B0 61
در اینجا B0 به معنی انتقال مقدار بعدی به ثبات AL است و 61 نمایش مبنای ۱۶ مقدار باینری 01100001 است که باید منتقل شود و در مبنای ده برابر ۹۷ است. زبان اسمبلی اینتل یادیار MOV را (مخفف Move) برای دستورهای این چنینی فراهم کرده، به‌طوری‌که کد ماشین بالا در زبان اسمبلی به شکل زیر نوشته می‌شود که خواندن و به خاطر سپردن آن راحت‌تر است (آنچه بعد از نقطه-ویرگول (;) آمده توضیح (به انگلیسی: comment) است):
MOV AL, 61h       ; Load AL with 97 decimal (61 hex)
برخی زبان‌های اسمبلی ممکن است از دستورهای مشابه MOV برای انتقال، کپی و بارگذاری داده‌ها، چه ثبات‌ها، چه مقادیر عددی و چه متغیرهای حافظه استفاده کنند و برخی دیگر از اسمبلرها ممکن از دستورهای متفاوتی استفاده کنند؛ مثلاً L برای انتقال حافظه به ثبات، ST برای انتقال از ثبات به حافظه، LR برای انتقال از ثبات به ثبات و MVI برای انتقال ثابت‌های عددی به ثبات و غیره.
آپ‌کد اینتل 10110000 (B0) یک مقدار ۸ بیتی را به ثبات AL کپی می‌کند، در حالیکه 10110001 (B1) آن را به CL منتقل می‌کند و 10110010 (B2) همین کار را با DL انجام می‌دهد. مثال‌های اسمبلی آن به صورت زیر است:
MOV AL, 1h        ; Load AL with immediate value 1MOV CL, 2h        ; Load CL with immediate value 2MOV DL, 3h        ; Load DL with immediate value 3
دستور MOV می‌تواند مانند مثال زیر به اشکال پیچیده‌تری نیز استفاده شود:
MOV EAX, [EBX]   ; Move the 4 bytes in memory at the address contained in EBX into EAXMOV [ESI+EAX], CL ; Move the contents of CL into the byte at address ESI+EAX
در هر حالت، دستور MOV مستقیماً توسط اسمبلر به یک آپ‌کد در بازهٔ 88-8E یا A0-A3 یا B0-B8 یا C6 یا C7 ترجمه می‌شود و برنامه‌نویس مجبور به دانستن یا حفظ کردن آن‌ها نیست.
تبدیل زبان اسمبلی به زبان ماشین وظیفهٔ اسمبلر است و عکس این عمل تا حدی توسط دی‌اسمبلر امکان‌پذیر است. برخلاف زبان‌های برنامه‌نویسی سطح بالا، ارتباط یک به یکی بین دستورهای زبان اسمبلی و دستورالعمل‌های زبان ماشین وجود دارد. با این حال، در برخی موارد، یک اسمبلر ممکن است شبه‌دستورهایی (به انگلیسی: Pseudoinstructions) را به کار بگیرد (اساساً ماکروها) که به چند دستورالعمل زبان ماشین تبدیل می‌شود تا پاسخگوی نیازهای رایج باشد.
هر معماری کامپیوتر زبان ماشین مختص به خود را داراست. کامپیوترها در تعداد و نوع دستورهای قابل استفاده، تعداد و اندازهٔ ثبات‌ها و نحوهٔ انبارش داده‌ها با یکدیگر تفاوت دارند. با اینکه کامپیوترهای همه منظوره اساساً قادر به انجام کارکردهای مشابه هستند ولی این کار را با روش‌های گوناگونی انجام می‌دهند؛ بنابراین زبان اسمبلی مربوط به آن‌ها نیز این تفاوت‌ها را منعکس می‌کند.
مجموعه‌های متعددی از یادیارها یا دستورهای زبان اسمبلی ممکن است برای یک مجموعه دستورالعمل واحد وجود داشته باشد، که به‌طور معمول در برنامه‌های اسمبلی مختلفی نمونه‌سازی می‌شوند. در این موارد، رایج‌ترین آن‌ها معمولاً نمونه‌ای است که توسط کارخانهٔ سازنده عرضه می‌شود یا در مستندات آن‌ها استفاده شده‌است.