اما داشتن درکی درست از سختافزار و ساختمان رایانه و منطق عملکرد آن میتواند افراد را به سوی تولید نرمافزارهای بهینه، پرسرعت و کارا هدایت کند. تجربه نشان داده است افرادی که با زبانهای سطح پایین برنامه نوشتهاند بهدلیل آنکه در آن زبانها داشتن درک جزیی از ساختمان رایانه و منابع سیستم لازم و ضروری بوده است به هنگام کار با زبانهای سطح بالا و تولید نرمافزار با آنها، اغلب موفقتر از کسانی بودهاند که بدون اطلاعات کافی از روش کار رایانه به برنامهنویسی روی آوردهاند.
انتخاب برپایه علاقه و نیاز
گفتههای پیشین اصلا بدان معنا نیست که هرکس میخواهد برنامهنویسی سطح بالا را آغاز کند، نخست باید مدتها با زبانهای سطح پایین برنامه بنویسد تا بتواند موفقتر عمل کند. چه بسا کار با محیطهای خشک و بیآب و رنگ زبانهای سطح پایین ذوق و علاقه را برای ادامه برنامهنویسی در شخص کم کند. اما خوب است بدانیم که یک برنامه چه مسیری را میپیماید تا تبدیل به زبان قابل فهم برای رایانه میشود و پس از تبدیل چه رخ میدهد که برنامه را در حال اجرا میبینیم.
اسمبلی برای کیست؟
با توجه به طراحی زبانهای توانمند سطح بالا، با امکانات گسترده، لزومی ندارد که هر برنامهنویس به یک زبان سطح پایین مثل اسمبلی آشنا باشد. یک برنامه نوشته شده به اسمبلی، بسیار طولانی، پیچیده و غیرقابل درک است. ضمن اینکه تغییر و اشکالزدایی آن بسیار پیچیده است.
به کسی که میخواهد یک برنامه پایگاه داده، برنامه تحت وب، نرمافزار پخش، ویرایش تصویر و ... طراحی کند، بههیچوجه توصیه نمیشود که از زبان اسمبلی استفاده کند. اما با توجه به روی کار آمدن زبانهای قدرتمند سطح بالا، این سوال مطرح میشود که چرا همچنان زبان اسمبلی بهعنوان یک زبان توانمند مطرح است و کاربرد آن کمرنگ نمیشود؟ اصولا چه کسانی سراغ این زبان میروند و چه کسانی ناچار به استفاده از آن زبانند؟
همانطور که میدانیم برای هر دستور قابل فهم توسطCPU یک دستور اسمبلی وجود دارد. بنابراین میتوان فایلهای اجرایی و برنامههایی را که آماده اجرا هستند به کد زبان اسمبلی تبدیل کرد. پس اگر برنامهای وجود داشته باشد که کد برنامه آن وجود نداشته باشد و برنامهنویس آن در دسترس نباشد، میتوان با تبدیل فایل اجرایی به کدهای اسمبلی، آن را تغییر داد و یا اشکالزدایی کرد. عمل تبدیل فایل اجرایی به کد زبان اسمبلی کهعمل عکس Assemble است، Disassemble و ابزاری که این عمل را انجام میدهد Disassembler گویند.
کسی که میخواهد در برنامههای اجرایی، بدون دسترسی به کد اصلی آنها تغییراتی ایجاد کند و یا در صورت وجود اشکال، آنها را کالزدایی (Debug) کند باید تسلط و آشنایی کامل به زبان اسمبلی داشته باشد و این کار از شخص دیگری برنخواهد آمد.
مهندسی معکوس
همانطور که میدانید مهندسان با استفاده از اجزای مختلف، دست به طراحی یک واحد مجتمع میزنند که بتوانند یک عمل خاص را انجام دهند. یک مهندس ساختمان، با استفاده از مصالح، طرحها، نقشهها و محاسبات، بنایی خلق میکند که در نهایت خصوصیات خاص خود را دارد. بنایی که ممکن است نمونه آن قبلا موجود نباشد. بهطور مشابه برای مهندس نرمافزار نیز میتوان یک نرمافزار را مثال زد. اما کار مهندسی معکوس آن است که از بنای موجود و یا نرمافزار نهایی موجود که هیچگونه اطلاعاتی در مورد اجزا، طراحی و محاسبات آن در دسترس نیست، به اطلاعات ارزشمندی دست یافت که بتوان اقدام به ساخت نمونه دیگری از محصول موجود کرده و یا از اطلاعات به دست آمده از آن در جای دیگر و یا محصول دیگر استفاده کرد.
در مهندسی معکوس نرمافزار، زبان اسمبلی مهمترین چیزی است که باید فرا گرفته شود. به عنوان مثال، ساختار سیستم فایل NTFS که در ویندوز XP به کار رفته است در انحصار شرکت مایکروسافت است و هیچکس به کدهای نوشته شده توسط مهندسان این شرکت دسترسی ندارد. اما با استفاده از تکنیکهای مهندسی معکوس به ساختار آن پی برده شده است.
همچنین نرمافزارهایی که با محدودیتهای زمانی و امکانات به بازار عرضه میشوند تا بعد از آزمایش خریداری شوند، با استفاده از تکنیکهای مهندسی معکوس، محدودیتهای آنها از میان برداشته میشود و به اصطلاح کرک(Crack) میشوند. اشخاصی که قصد دارند با تکنیکهای کرک کردن نرمافزارها آشنا شوند، باید به زبان اسمبلی تسلط بیابند و این کار با زبانهای دیگر امکانپذیر نیست.
حجم، کارایی، سرعت
نرمافزارهایی که با زبان اسمبلی نوشته میشوند به دلیل نداشتن هیچگونه کد اضافه، بسیار پرسرعت و کم حجم خواهند بود. همچنین با توجه به اینکه حافظه کمتری اشغال میکنند، کارایی بالاتری نسبت به برنامه معادل که با زبان دیگر نوشته شده است، دارد. اینها میتواند دلایلی برای انتخاب این زبان برای یک برنامهنویس باشند.
اما برای رسیدن به چنین هدفهایی، راهها و زبانهای دیگری نیز وجود دارند و تا حدی میتوانند جایگزین اسمبلی شوند.
اما گاهی برای نوشتن برخی برنامهها، چارهای جز اسمبلی نداریم. به عنوان مثال بسیاری از زبانهای برنامهنویسی، اجازه دسترسی به همه قسمتهای حافظه و دستیابی مستقیم به آن را نمیدهند. یا گاهی که میخواهیم برنامهای را با استفاده از ثباتهایCPU بنویسیم ممکن است این امکان از جانب زبانهای دیگر فراهم نباشد. دسترسی و بکارگیری مستقیم سختافزارها و وقفهها گاهی تنها با استفاده از این زبان فراهم است. همچنین در برخی از موارد، نوشتن نرمافزارهای راهانداز سختافزارها (Driver)تنها با اسمبلی امکانپذیر است.
گرچه زبانهای دیگر نظیر C و C++ نیز تواناییهایی زیادی در این زمینه دارند.
کسانی که با اصول برنامهنویسی با اسمبلی آشنا هستند، اغلب با کمی مطالعه میتوانند براحتی برای پردازندههای دیگری غیر از رایانه نیز برنامه بنویسند. انواع میکروکنترلرها و ریز پردازندهها باید با استفاده از این زبان برنامهریزی شوند. هر چند ممکن است برای هر نوع ریز پردازنده یا میکروکنترلر، زبانها و کامپایلرهای دیگری مانند بیسیک یاC طراحی شده باشد، اما کسی که اسمبلی را بلد باشد، معمولا با مطالعه شکل دستورات و استانداردهای مربوط به آن تراشه یا IC ، میتواند از تجربیات خود در نوشتن برنامه برای آن ریزپردازنده بهره بگیرد.
برنامهنویسهای سطح بالا نیز گاهی برای نوشتن برخی روتینها و قطعه برنامهها، ناچار به استفاده از اسمبلی میشوند و یا گاهی ترجیح میدهند که بخشی را با این زبان بنویسند.
زبانها و کامپایلرهای سطح بالا معمولا این امکان را به برنامهنویس میدهند که درون کدهای آن زبان، بخشی از کد را نیز به زبان اسمبلی بنویسند. ضمنا بخش عمدهای از ویروسهای رایانهای نیز با این زبان نوشته میشوند. زیرا معمولا ویروسها کارهایی انجام میدهند که غیرعادی بوده و توسط اسمبلی این کارها برمیآیند. در مجموع میتوان گفت اسمبلی زبانی مشکل و نسبتا پیچیده و در عین حال توانمند است. شخصی که به برنامهنویسی با این زبان رو میآورد باید اولا هدف خود را تعیین کرده و نیازهای خود را بشناسد. ضمن اینکه باید درک و شناخت درستی از سختافزار رایانه و منطق و ساختار آن داشته باشد. علاقه و حوصله نیز فاکتورهای اساسی دیگری هستند که در این راستا باید در نظر گرفته شود.
پارسا ستودهنیا
در تپش این هفته، ماجرای فریب و تعرض در پوشش عرفانهای دروغین و رمالی را بررسی کردیم