چگونه یک برنامه را اسمبل ، لینک و اجرا کنیم
کد منبع برنامه می تواند با هر متن نگاری مثل Notepad یا Edit وارد شود. کد منبع زبان اسمبلی معمولا در فایلی با پسوند .ASM ذخیره می گردد . برای این بخش ، من فرض کردم که برنامه ای که در بخش نوشتم به صورت فایلی بنام EXAMPLE.ASM ذخیره گردیده است.
من از اسمبلر ML از MASM 6.1 استفاده می کنم تا برنامه ها را اسمبل کنم. برای اسمبل کردن EXAMPLE.ASM باید دستور زیر را در پنجره اعلان DOS وارد نمائید بدین صورت :
Start -> Run -> Cmd
C:\> ml /c /coff example.asm
با فرض اینکه هیچ اشتباهی در برنامه وجود ندارد ، پیغامی شبیه به پیغام زیر را مشاهده خواهید کرد :
Microsoft (R) Macro Assembler Version 6.11
Copyright © Microsoft Crop 1981 – 1993 . All right reserved.
Assembling : example .asm
. به دنبال این پیغامها ، اعلان DOS دوباره ظاهر خواهد شد . اینکار باعث اضافه شدن فایل EXAMPLE .OBJ به دایرکتوری ( فولدر) شما خواهد شد.
در دستور فوق همراه با صدا کردن اسمبلر دو سوئیچ /C و /Coff را به کار بردم . محصول ML هم قادر به اسمبل کردن و هم قادر به لینک کردن است . سوئیچ /C مشخص کننده این است که فقط کار اسمبل کردن را انجام می دهد و سوئیچ /Coff از اسمبلر می خواهد که فایل با فرمت common object file ایجاد نماید. سوئیچهای ML نسبت به بزرگ بودن با کوچک بودن حروف حساس هستند. بنابراین باید آنها را همانطور که نشان داده شده اند ، وارد نمائید ، یعنی با حروف کوچک.
لینکر از نام LINK استفاده می نماید. برای مثال ، لینکر را در اعلان DOD به شکل زیر وارد نمائید
Link / subsustem : console / entry : start / out : example . exe
Example.obj io .obj kernel32.lib
باید توجه کنید که این فقط یک دستور است ، هر چند که در زمان تایپ کردن ممکن است ادامه به خط بعدی برود. دوباره با فرض اینکه هیچ اشتباهی وجود ندارد با پیغامهای زیر مواجه خواهید شد
Microsoft (R) 32-Bit Incremental Linker Version 5.10.7303
Copyright © Microsoft Crop 1992-1997 . All rights reserved.
و به دنبال این پیغامها ، اعلان DOS دوباره ظاهر خواهد شد . دستور LINK فایلهای EXAMPLE.OBJ ، IO.OBJ و KERNEL32.LIB را با یکدیگر پیوند خواهد داد تا فایل EXAMPLE.EXE را بوجود آورد . سوئیچ /subsystem: console به برنامه LINK می گوید برنامه را طوری تهیه کند که در پنجره اعلان DOS قابل اجرا باشد . سوئیچ /entry :start برچسبی را که نقطه شروع اجرای برنامه است ، مشخص می نماید. توجه داشته باشید که در اینجا کاراکتر خط زیرین ( underscore) وجود ندارد ، هر چند که برچسب اصلی _start بود.
برای اجرای یک برنامه کافی است نام آنرا در مقابل اعلان DOS تایپ کنید و کلید Enter را فشار دهید در قسمت زیر می توانید نمونه ای از اجرای برنامه EXAMPLE.EXE را مشاهده می کنید در حالیکه زیر مواردی که توسط کاربر وارد شده ، خط کشیده شده است . وقتی یکبار برنامه اجرایی تهیه شده ، می توانند آنرا بارها و بارها اجرا کنید بدون اینکه نیاز به اسمبل یا لینک کردن مجدد آن داشته باشید.
در ضمن شما می توانید از نرم افزار دیباگر مایکروسافت Windbg استفاده کنید این دیباگر نمادین می تواند برای قدم به قدم اجرا نمودن برنامه های اسمبلی به کار گرفته شود. این یک ابزار خوب برای یافتن خطاها و اینکه کامپیوتر در سطح زبان ماشین چگونه کار می کند ، مفید است.
C:\Asmfiles>example
Enter first number : 10
Enter second number : 20
The sum is : 30
C:AsmFiles>
برای اینکه بتوانید از Windbg استفاده کنید باید سوئیچ /Zi ( z بزرگ و i کوچک) را در زمان اسمبل کردن با ML استفاده نمائید. اینکار باعث خواهد شد که اسمبلر اطلاعات مربوط به خطایابی را به خروجی خود اضافه کند. دستور اسمبلی در این حالت به شکل زیر خواهد بود :
ML /c /coff /Zi example.asm
لینک کردن برنامه نیز تغییر خواهد کرد تا سوئیچ جدید /debug به آن اضافه شود.
Link /debug /subsystem : console /entry : start /out :example.exe
Example.obj io.obj kernel32.lib
برای کار با دیباگر ، نام آن یعنی Windbg را در مقابل اعلان DOS وارد نمائید آنگاه پنجره ای مشاهد خواهید نمود . از نوار منو File را انتخاب کنید و Executables…… را برگزینید. آنگاه example.exe و یا نام فایل اجرایی خودتان را انتخاب کنید و روی OK کلیک کنید تا به پنجره ی اول باز گردید ، البته نقاوتی که وجود خواهد داشت اینست که نام example.exe در قسمت نوار عنوان و چندین خط در پنجره دستور ظاهر خواهد گردید.
اینک برای قدم به قدم اجرا شدن ، دکمه { { را بفشارید.
روی OK در پنجره اطلاعات کلیک کنید و سپس دوباره کلید قدم به قدم اجرا شدن را دوباره فشار دهید. در این زمان کد منبع شما در پنجره دیگری از Windbg پشت پنجره دستور ظاهر خواهد گشت. پنجره دستور را کمینه کنید. در مرحله بعدی از منوی View انتخاب Registers را برگزینید تا پنجره ای باز شود که محتویات ثباتهای 80X86 را نشان می دهد.
سپس از منوی View انتخاب Memory … را برگزینید تا پنجره ای باز شود که محتویات حافظه را نمایش می دهد. برای این پنجره شما باید آدرس شروع حافظه را وارد کنید ، در برنامه مثال از &number 1 به عنوان آدرس شروع استفاده کنید عملگر آدرس در C/C++ یعنی & ( امپرسن) برای مشخص کردن آدرس number 1 مورد استفاده قرا رگرفته است . دقت کنید که number1 اولین مورد در قسمت داده ها است . سرانجام پنجره را به گونه ای تغییر اندازه دهید و مرتب نمائید .
اولین دستورالعمل برنامه مثال به صورت زیر است . کلیک کردن بر روی قدم به قدم باعث خواهد شد که این دستورالعمل اجرا شود . هر چند که این دستورالعمل یک ماکرو است ولی با یک مرحله اجرا می شود و پیغام Enter first number : روی صفحه خروجی نشان داده خواهد شد . ( شما می توانید بر روی گوشه صفحه خروجی کلیک کنید تا این صفحه روی همه صفحات نشان داده شود.) کلیک کردن مجدد کلید اجرای قدم به قدم باعث خواهد شد که ماکرو input اجرا شود. وقتی شما عددی را وارد نمائید و کلید return را فشار دهید آنگاه Windbg به صفحه دیباگر بر می گردد . با دوبار کلیک کردن مجدد بر روی کلید اجرای قدم به قدم ماکرو تبدیل اسکی به عدد اجرا شود و اولین دستورالعمل mov اجرا شود . در این مرحله ، پنجره ثباتها نشاندهنده آن است که ثبات EAX حاوی مقدار 00000062 است ، یعنی مکمل دو در اندازه کلمه مضاعف عدد .98 عدد 98 در پاسخ به درخواست وارد شده است. می توانید مد های اسکی ذخیره شده عدد فوق در چهار مین خط پنجره حافظه ببینید. هر خط پنجره حافظه شامل سه قسمت است : آدرس شروع ، مقادیر شانزده شانزدهی بایتهای ذخیره شده در آن آدرسها و کاراکتر های قابل چاپ ( در صورت وجود) مربوط به آنها ، پنج کاراکتر اول خط چهارم مربوط به انتهای prompt 2 هستند ، بعنی کد های اسکی برای r و : و دو فاصله و کاراکتر نول . چهل بایتی که برای رشته ذخیره شده اند به دنبال این قسمت در حافظه آمده است و چهار بایت اول این فضا بوسیله 39و 38 و00 و 0A پر شده اند. این کاراکتر ها ، کد های اسکی عدد 98 ، یک بایت نول و کاراکتر خط خور است . وقتی عدد 98 وارد شد و کلید Enter فشرده گردید ، سیستم عامل کد های 39,38 به علاوه کد کاراکتر برگشت به سرحط و کاراکتر خط خور را ، ذخیره نموده است . ماکرو input کاراکتر برگشت به سرخط را با یک بایت نول جا به جا نموده است ، اما کراکتر خط خور هنوز در حافظه قرار دارد. ماکرو atod این کاراکتر اسکی را بررسی می کند تا مقدار موجود در EAX را ایجاد نماید. پنجره حافظه مقدار 62 00 00 00 را برای number 1 نشان می دهد ، بایتهای عددی که بوسیله دستور mov به حافظه کپی شدند.
بقیه برنامه نیز بهمین روش اجرا می گردد.
ادامه دارد ....................

پیوند ها