تبليغاتX
UNiComp.iR | Download Direct Tutorials Video , Film | دانلودمستقیم فیلم آموزشی،کتاب،جزوه،مقاله

زبان ماشین و اسمبلی - جلسه هشتم


چگونه یک برنامه را اسمبل ، لینک و اجرا کنیم

 

کد منبع برنامه می تواند  با هر متن نگاری مثل 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 به حافظه کپی شدند.

بقیه برنامه نیز بهمین روش  اجرا می گردد.  

 

                                                                 ادامه دارد ....................


Search Engine Submission - AddMe