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