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

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

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

  1. کاربر ارشد

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


    به طور کلی وقفه ها به دودسته تقسیم میشوند:
    ۱- وقفه های سخت افزاری (Hardware Interrupts) . وقفه هائی هستند که از سوی ادوات سخت افزاری کامپیوتر مانند کیبورد و … اجرا میشوند. مثلا با فشرده یا رها شدن هر کلید ، یکبار وقفه شماره ۹ فراخوانی میشود.
    ۲- وقفه های سخت افزاری (SoftWare Interrupts). این وقفه ها در بایوس (BIOS) کامپیوتر قرار دارند. بایوس کامپیوتر یک تراشه (IC) قابل برنامه ریزی است که بنا بر نوع پردازنده بر روی برد اصلی کامپیوتر قرار میگیرد .
    بعلاوه خود DOS نیز وقفه ای (وقفه ۲۱h) را اداره میکند که به وقفه DOS معروف است . این توابع توسط MSDOS.SYS تعریف میشوند ولی در نهایت به بایوس مراجعه میکنند.
    هر وقفه دارای یک شماره خاص خود است و از صفر شروع میشود . وقفه ۲۱h (سرویس DOS ) نیز دارای ۲۵۵ سرویس دیگر است .
    برای اینکه بتوانیم یک برنامه خوب و مفید بنویسیم باید بتوانیم از اینتراپتها به نحو صحیح استفاده کنیم . پس هر برنامه نویس اسمبلی باید یک مرجع کامل اینتراپت در اختیار داشته باشد.
    وقتی میخواهیم یک وقفه را فراخوانی کنیم ، ابتدا (درصورت لزوم ) ثباتهای خاصی را مقدار دهی میکنیم . معمولا نیم ثبات AH ، از این جهت که اکثر اینتراپتها دارای چند سرویس مختلف هستند ، شماره تابع را مشخص میکند . بهمین صورت ، و اگر لازم باشد ، ثباتهای دیگر را هم مقدار دهی میکنیم .
    مثلا فرض کنید میخواهیم کلیدی را از صفحه کلید بخوانیم . تابع شماره ۰ از وقفه ۱۶h میتواند این کار را انجام دهد . وقتی میگوئیم تابع شماره ۰ ، یعنی باید به AH مقدار ۰ بدهیم و بعد اینتراپت ۱۶h را فراخوانی کنیم .
    فراخوانی اینتراپت به سادگی و با دستورالعمل INT انجام میشود. به صورت : INT int_no

    که int_no شماره اینتراپت میباشد .
    در مورد این مثال باید دستورات زیر را انجام دهیم : mov ah/0 int 16h

    وقتی یک وقفه فراخوانی میشود ، ممکن است روی ثباتها تاثیر گذاشته و مقدار آنهارا عوض کند. به این وسیله ما میتوانیم وضعیت اجرای وقفه را بدست بیاوریم . در مورد این مثال ، پس از خوانده شدن کلید ، کد اسکی (ASCII) کلید در ثبات AL قرار میگیرد . مثلا اگر حرف A تایپ شود ، مقدار AL برابر ۶۵ خواهد بود. حالا اگر عدد AH را قبل از فراخوانی وقفه بجای ۱ برابر Eh قرار دهیم و وقفه ۱۰hرا اجرا کنیم ، بجای خواندن کلید، یک کاراکتر را چاپ میکند . به این صورت که کد اسکی کاراکتر در ثبات AL و عدد Eh در ثبات AH قرار گرفته و وقفه ۱۰h فراخوانی میشود . mov AX/0E07h in 10h
    به سطر اول توجه کنید !. وقتی ما یک عدد دوبایتی (Hex) را به AX ارسال میکنیم ، دوبایت بالا در AH و دوبایت پائین در AL قرار میگیرد . پس در این مثال کاراکتر شماره ۷ باید چاپ شود و چون این کد مربوط به کاراکتر Bell است ، صدای بیپ شنیده خواهد شد.
    خاتمه دادن به برنامه :
    وقتی که یک برنامه به انتها رسید یا اگر خواستیم اجرای برنامه را متوقف کنیم ، میتوانیم از اینتراپت ۲۰h استفاده کنیم . DOS همیشه و بمحض اجرای این وقفه ، اجرای برنامه را متوقف میکند.
    اینراپت ۲۰h فقط با برنامه های COM. درست کار میکند و در مورد برنامه های EXE. درست جواب نمیدهد . در عوض سرویس ۴Ch از اینتراپت ۲۱h در هر دونوع برنامه بخوبی کار میکند .
    خوب ، حالا با مطالبی که یاد گرفتیم یک برنامه اسمبلی نوشته و فایل COM. آن را میسازیم .
    بنابر این در محیط DOS، DEBUG، را اجرا کنید .


    D:MASM>DEBUG
    سپس دستورد A را به معنی شروع دستورات اسمبلی وارد کنید :
    - Axxxx:0100

    به عدد آدرسی که دیده میشود توجه نکرده و دستورات زیر را تایپ کنید .
    mov ah/2
    mov al/7
    int 16
    int 20

    بعد از تایپ آخرین سطر، یکبار دیگر هم کلید Enter را بزنید تا اعلان debug مجددا ظاهر شود. حالا دستور N را برای نامگذاری برنامه بکار ببرید:
    - N BELL.COM

    بعد از آن باید طول برنامه را ، برحسب بایت ، مشخص کنیم . طول برنامه در ثبات CX نگهداری میشود پس از فرمان RCX برای مقدار دهی استفاده میکنیم . (طول برنامه ۸ بایت است ) .
    - RCX8

    و در نهایت فرمان w برای نوشتن روی دیسک و Q برای خروج . حالا ما یک فایل COM. داریم که به محض اجرا یک صدای Beep تولید میکند .
    ما امروز اولین برنامه اسمبلی خودمان را نوشتیم ، در قسمت بعد یاد میگیریم که چطور از اسمبلر استفاده کنیم و امکانات آن را بکار ببریم .