در این قسمت طرز استفاده از ماکرواسمبلر را یاد میگیریم و برنامه هایمان را بدون استفاده از 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 را اجرا کرده و نتیجه را مشاهده کنید . امروز برنامه ای با اسمبلر نوشیتم . از این پس نیز تمام برنامه های را با اسمبلر مینویسیم و از توانائیهای آن استفاده میکنیم .