Tag Archives: اسمبلی

زبان اسمبلی Assembly Language

زبان اسمبلی یا Assembly Language چیست؟

زبان اسمبلی (Assembly Language) یک زبان برنامه نویسی سطح پایین است که نزدیکی بالایی به دستورالعمل‌های ماشین دارد. این زبان به اختصار با نام ASM نیز شناخته می‌شود.

ویژگی‌های زبان اسمبلی

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

به ازای هر دستورالعمل ماشین، ثبات و … معادل‌هایی سمبولیک در زبان اسمبلی وجود دارد. هر عمل همراه با یک یا چند عملوند در این زبان یک دستور را تشکیل می‌دهند.

اسمبلر

دستورات Assembly به منظور آماده شدن برای اجرا، با کمک برنامه‌ای به نام اسمبلر (Assembler) به کد ماشین تبدیل می‌شوند. این برنامه برای تولید آبجکت کد، نمادهای قابل حفظ کردن و مدهای آدرس دهی و عملیات‌های مختلف را به معادل‌های عددی دودویی آن ترجمه می‌کند. اسمبلرهای سطح بالا (High-level Assembler) ویژگی‌های زبان های سطح بالا نظیر تعریف توابع، ساختارهای کنترلی پیشرفته‌تر (نظیر IF) و شئ گرایی را با ویژگی‌های مرسوم ترکیب می‌کنند.

فرایند تبدیل دستورات Assembly به کد ماشین را اسمبلینگ (Assembling) سورس کد می‌نامند. عکس این عمل (تبدیل از زبان ماشین به Assembly) نیز توسط برنامه‌ای موسوم به Disassembler انجام می‌شود.

مثالی از یک دستور اسمبلی

معمولا در هر دستور Assembly پس از دستورالعمل، لیستی از داده‌ها یا پارامترها قرار می‌گیرد. به عنوان مثال در معماری 8086 از نماد MOV برای لود کردن داده در ثبات‌های پردازنده استفاده می‌شود. دستور زیر مقدار هگزادسیمال 61 (معادل عدد دهدهی 97) را در ثبات AL لود می‌کند:

MOV AL, 61h

این دستور توسط اسمبلر به رشته باینری زیر تبدیل می‌شود. این رشته به یک پردازنده با معماری x86 اعلام می‌کند عدد 97 را در ثبات AL قرار دهد. پنج بیت 10110 کد باینری مربوط به این دستورالعمل است و سه بیت بعدی (یعنی 000) مشخصه ثبات AL است. در نهایت 01100001 نیز معادل باینری عدد 97 است.

10110000 01100001

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

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

اسمبلی Assembly
نمونه ای از برنامه سلام دنیا به زبان اسمبلی

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا

کامپایلر Compiler

کامپایلر یا Compiler چیست؟

کامپایلر (Compiler) یک برنامه‌ی رایانه‌ای است که سورس کد نوشته شده به یک زبان برنامه نویسی (زبان مبدأ) را به یک زبان دیگر (زبان مقصد) تبدیل می‌کند. البته معمولا این اصطلاح برای برنامه‌هایی به کار می‌رود که سورس کد یک زبان برنامه نویسی سطح بالا (نظیر C یا BASIC) را به سورس کد یک زبان سطح پایین‌تر (نظیر کد ماشین یا زبان اسمبلی) تبدیل می‌کنند.

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

زبان‌های کامپایلی یا کامپایل شده (Compiled Language) به نوعی از زبان‌های برنامه‌نویسی گفته می‌شود که سورس کد آن‌ها پیش از اجرا شدن باید کامپایل شود. در مقابل این زبان‌ها، سورس کدهای نوشته شده به زبان‌های تفسیری بدون نیاز به کامپایل شدن توسط برنامه‌هایی موسوم به مفسر (Interpreter) اجرا می‌شود. معمولا برنامه‌های نوشته شده به زبان‌های کامپایلی در هنگام اجرا سریعتر عمل می‌کنند چرا که لازم نیست سورس کد آن‌ها هنگام اجرا به زبان ماشین ترجمه شود.

انواع کامپایلرها

چه از نظر مفهوم و چه از نظر عملکرد، انواع مختلفی از کامپایلرها وجود دارد. برخی از کامپایلرها از برنامه‌های کوچکتری تشکیل شده‌اند که هرکدام مرحله‌ای از کامپایل را انجام می‌دهند. به این کامپایلرها چند گذره (Multi-pass Compiler) گفته می‌شود. ویژگی‌های برخی از زبان‌ها به گونه‌ای است که در مواردی هنگام کامپایل کردن، خواندن مجدد سورس کد در آن‌ها ضروری می‌باشد. در چنین موقعیت‌هایی نوع چندگذره با ایجاد خروجی‌های میانی نهایتا سورس کد نهایی را تولید می‌کند. برخی دیگر از کامپایلرها تنها در یک گذر و به طور کامل تمام سورس کد دریافتی از زبان مبدأ را به زبان مقصد تبدیل می‌کنند که به آن‌ها کامپایلر تک گذره (Single-pass Compiler) گفته می‌شود.

گونه‌ای از کامپایلرها که به محلی یا بومی (Native Compiler) مشهور هستند به شکلی طراحی می‌شوند که خروجی آن‌ها تنها روی همان پلتفرم (سیستم عامل و پردازنده‌ای) که کامپایلر در آن اجرا شده قابل اجرا هستند. در عوض، خروجی کامپایلرهای متقاطع (Cross Compiler) روی پلتفرم‌های مختلفی قابل اجراست.

کامپایلرهایی که زبان مبدأ و مقصد آن‌ها دو زبان تقریبا هم سطح (معمولا سطح بالا) هستند را کامپایلرهای Source to Source می‌نامند. برنامه‌ای که سورس کد یک زبان سطح پایین‌تر را به یک زبان سطح بالاتر ترجمه می‌کند نیز دیکامپایلر (Decompiler) نامیده می‌شود.