1. مهمان گرامی، جهت ارسال پست، دانلود و سایر امکانات ویژه کاربران عضو، ثبت نام کنید.
    بستن اطلاعیه

آموزش اسمبلی(6)

شروع موضوع توسط hector2141 ‏15/10/12 در انجمن Assembly

  1. کاربر ارشد

    تاریخ عضویت:
    ‏6/9/12
    ارسال ها:
    14,323
    تشکر شده:
    2,698
    امتیاز دستاورد:
    0
    حرفه:
    daneshjo
    [​IMG]
    در این قسمت طرز استفاده از ماکرواسمبلر را یاد میگیریم و برنامه هایمان را بدون استفاده از Debug مینویسیم .


    برای استفاده از اسمبلر باید یک ادیتور اسکی مثل EDITیا PE2ا داشته باشید تا بتوانید برنامه هایتان را توسط آن تایپ کنید . هر برنامه اسمبلی دارای یک فایل منبع (Source) حاوی دستورالعملهای اسمبلی است . ما این فایل را با یک ویرایشگر تایپ کرده و به ماکرواسمبلر MASM.EXE میدهیم تا فایل مفعولی (OBJ.) آن را بسازد.
    این فایل هم باید با برنامه Link.exe به فرم EXE. تبدیل شود . چون ما میخواهیم برنامه های COM. بتویسیم باید فایل exe. تولید شده را با EXE2BIN.COMیا EXE2COMا به فرم com. تبدیل کنیم .
    فرض کنید در محیط ویرایشگر(مثلا EDIT ) هستیم و میخواهیم یک برنامه اسمبلی بنویسیم .

    هر برنامه از ۳ قطعه (سگمنت ) تشکیل میشود :

    ۱-قطعه داده ها یا DATA SEGMENT . متغیرهای برنامه و سایر داده های مورد نیاز در این سگمنت قرار میگیرند .
    ۲- قطعه کد یا Code Segment . کدها و دستورات اسمبلی در این قسمت هستند .
    ۳- بخش انباره یا Stack Segment . این قطعه زیر برنامه ها و مقادیر موقتی را نگهداری میکند .
    ما حتی میتوانیم محتوای ثباتها را به پشته (Stack) منتقل کرده و بعد دوباره از آن خارج کنیم .
    در یک برنامه COM. قطعه داده ها و قطعه مد در یک سگمنت قرار دارند بنا براین ما قطعه داده ها را تعریف نمیکنیم . بعلاوه قطعه سگمنت هم برای یک فایل COM. وجود ندارد بلکه خود DOS این محیط را فراهم میکند . به همین دلایل است که نوشتن برنامه های COM. آسانتر است . با این حال ما با محدودیتی مواجه هستیم و آن اینست که سایز یک برنامه COM. نمیتواند بیش از ۶۴ کیلو بایت باشد .
    فرض کنید میخواهیم همان برنامه ای که صدای Beepتولید میکرد را با اسمبلر بنویسیم پس یک فایل (مثلا bell.asm) میسازیم : EDIT BELL.ASM حالا ما در محیط ویرایشگر هستیم . برنامه ما به این شکل خواهد بود :

    . MODEL SMALL
    . CODE
    MOV AH/0EH
    MOV AL/7
    INT 10H
    INT 20H
    END

    در سطر اول ، جمله model small. یک رهنمود مترجم است . رهنمودهای مترجم کداجرائی نیستند ولی اسمبلر را در ترجمه برنامه راهنمائی میکنند . MODEL SMALL. به اسمبلر میگوید که ما میخواهیم برنامه com. بنویسیم و قطعه داده ها و کدها مشترک است . این جمله باید همیشه وجود داشته باشد. CODE . میگوید که قسمت کدهای اجرائی شروع میشود . ما باید همیشه دستوراتمان را بعد از یک CODE. شروع کنیم و در انتها نیز جمله END را به معنی اتمام برنامه بنویسیم .
    بعد از اتمام این مراحل از ویرایشگر خارج شده و با MASM.EXE فایل برنامه را ترجمه میکنیم : MASM BELL.ASM
    در پرسشهای masm کلید enter را بزنید . اگر برنامه را صحیح تایپ کرده باشید باید این پیغامها را دریافت کنید :

    Microsoft( R )Macro Assembler Version 5.10
    Copyright( C )Microsoft Corp 1981/ 1988 .All rights reserved.
    50084 + 396073 Bytes symbol space free
    0 Warning Errors
    0 Severe Errors

    حالا فایل BELL.OBJ ساخته شده و باید آن را لینک کنیم : LINK BELL.OBJ و نتیجه این خواهد بود:
    Microsoft( R )Overlay Linker Version 3.69
    Copyright( C )Microsoft Corp 1983-1988 .All rights reserved.

    :Run File [ASM6.EXE]
    فقط Enter بزنید | :List File [NUL.MAP]
    :Libraries [.LIB] LINK : warning L4021 :no stack segment

    سطر آخر یک پیغام خطا است ولی دقیقا همان چیزی است که انتظار داریم . یعنی وجود نداشتن قطعه پشته (Stack) . به همین دلیل برنامه EXE. تولید شده توسط Link قابل اجرا نیست . پس با EXE2COM آن را به یک فایل COM. تبدیل میکنیم . EXE2COM BELL.EXE و داریم :
    EXE2COM Version 1.0( - c )Computer Magazine
    ASM6.EXE converted to ASM6.COM( 8 Bytes )
    Warning :Program begins at Offset 0( Entry point .)
    ASM6.COM cannot be called directly!

    الان فایل COM. هم تولید شد ولی EXE2COM میگوید که ما نمیتوانیم برنامه را فراخوانی و اجرا کنیم . چرا!?
    اگر بیاد داشته باشید وقتی میخواستیم در DEBUG اسمبلی بنویسیم ، دستوراتمان همیشه از آدرس xxxx:0100h شروع میشد. دلیل آن اینست که DOS همیشه یک فضای ۲۵۶ بایتی بنام PSP در ابتدای برنامه ایجاد کرده و اطلاعات فوق العاده مهمی را در آن
    نگهداری میکند . بنا براین برنامه ما باید حتما از آدرس ۱۰۰h شروع شود . این قانون اسمبلر برای نوشتن برنامه های COM. است . پس کد برنامه را به شکل زیر اصلاح کنید :

    . MODEL SMALL
    . CODE

    دستورالعمل جدید ORG 100H MOV AH/0EH
    MOV AL/7
    INT 10H
    INT 20H
    END

    راهنمای Org 100hبه DOS میگوید که برنامه باید از آدرس ۱۰۰h شروع شود . ما این کد را اجبارا در همه برنامه ها قرار خواهیم داد . حالا برنامه را با تغییرات اعمل شده ذخیره کرده و با انجام مراحل قبلی دوباره ترجمه کنید . پس از ترجمه فایل BELL.COM را اجرا کرده و نتیجه را مشاهده کنید .
    امروز برنامه ای با اسمبلر نوشیتم . از این پس نیز تمام برنامه های را با اسمبلر مینویسیم و از توانائیهای آن استفاده میکنیم .