توضیحات
مقیم کردن برنامه در حافظه به گونه ای است که در زمان اجرای برنامه های دیگر در حافظه وجود دارد تا کاربر با فشار دادن کلیدهای خاص از امکانات این برنامه استفاده نماید این برنامه ها پس از اجرای اولیه تا زمان راه اندازی مجدد کامپیوتر در حافظه می مانند.
برنامه مقیم در حافظه از ۳ بخش تشکیل شده است :
ا-بخش اول مقدار دهی اولیه : ( در این بخش می بایست با انتخاب یکی از وقفه های سیستم آدرس آنرا از جدول بردار وقفه – که بخشی از رم را اشغال کرده – به آدرس برنامه خودمان تغییر دهیم)
۲-مشخص
کردن اندازه بخشی از برنامه که باید در حافظه مقیم شود.
۳-مقیم سازی برنامه در حافظه
برنامه ها در حافظه ، ابتدا باید از INT 21h سرویس
31h آن استفاده کنید . به این صورت…
MOV AH,31h
اندازه برنامه بر حسب پاراگراف (هر پاراگراف ۱۶ بایت است) -> MOV DX,Prog_Size
INT 21h
سپس باید آدرس برنامه مقیم در حافظه را جایگزین آدرس یا بردار روتین وقفه سخت افزاری نمود ، تا هر موقع که وقفه مذكور فعال می شود به جای روتین وقفه ، برنامه مقیم در حافظه اجرا گردد!!
برای آنکه وقفه سخت افزاری نیز دچار مشکل نشود ، باید آدرس وقفه را در محلی ذخیره کرد و پس از پایان دادن به برنامه به آن مراجعه کرد)
برای این کار از سرویسهای 35h یا 25h وقفه INT 21h استفاده می شود …
MOV AH,25h
روتین وقفه
CS:IP
شماره وقفه جایگزین برای بدست آوردن -> MOV AL,08h
INT 21h
( آدرس CS در ES قرار می گیرد و آدرس IP در BX قرار می گیرد!). انجام پروژه سی شارپ
MOV AH,25h MOVAL,08h
MOV DX,OFFS ET > آدرس روتین جدید وقفه (آدرس برنامه را در این ریجستر قرار می دهیم
INT 21h
برنامه ای بنویسید که در حافظه مقیم شود و نسبت به کلید Print Screen واکنش انجام دهد . کلید Print
Screen معمولا کلید کم استفاده ای می باشد و تغییر عمل آن لطمه ای به کار سیستم عامل نمی زند ، در ضمن تنها کلیدی است که وقفه شماره ۵ را صدا می زند . وظیفه این وقفه در DOS چاپ محتویات صفحه نمایش بوسیله چاپگر می باشد. حال اگر ما برنامه ای بنویسیم و آنرا نسبت به وقفه شماره ۵ مقیم کنیم دیگر عملا این وقفه تا راه اندازی مجدد سیستم از کار می افتد و برنامه ما جایگزین آن می گردد . پس از آنکه دستورات اولیه برنامه را | نوشتید و برنامه خود را با تابع ۲۵ از وقفه ۲۱ روی وقفه ۵ تنظیم کنید . یعنی با این عمل برنامه شما به جای وقفه ۵ قرار می گیرد. این تابع باید به صورت زیر مقدار دهی شود:
AH=25H
شماره وقفه =AL
آدرس وقفه جدید=DX
INT 21H
با فرض اینکه ما بخواهیم زیر برنامه Resident در برنامه خودمان را به جای وقفه ۵ قرار دهیم به شکل زیر عمل می کنیم:
کد:
MOV AH,25H
MOV AL,05H
MOV DX,Offset resident
INT 21H
تا به اینجا ما فقط وقفه ۵ را با زیر برنامه ای در داخل برنامه خودمان مقدار دهی کرده ایم . حال باید آنرا در حافظه مقیم کنیم . در ابتدا می بایست اندازه زیر برنامه را بدست آوریم. چرا که در تابع ۳۱ از وقفه ۲۱ که وظیفه آن مقیم کردن برنامه است و اندازه برنامه جدید (وقفه جدید باید در DX قرار گیرد
کد:
AH=31H
برای انجام این عمل یک راه حل ساده را پیشنهاد می شود . یک برچسب در نقطه انتهایی برنامه قبل از اتمام سگمنت کد قرار دهید و به جای اندازه برنامه آدرس آنرا در DX قرار دهید . با این کار فاصله ابتدا تا انتهای زیر برنامه مقیم را در واقع حساب کرده اید. نام این برچسب را Bottom میگذاریم:
DX=Program Size
INT 21H
کد:
MOV AH,31H
MOV DX,offset bottom
INT 21H
حالا تمامی دستورات بالا را در یک زیر برنامه از نوع قرار داده و زیر برنامه مقیم شونده را از نوع near تعریف کنید. حتما در انتهای زیر برنامه مقیم شونده, دستور iret را برای بازگشت از اینتراپت بنویسید.
برای فهم بیشتر مثال زیر را کامپایل و اجرا کنید . این برنامه در حافظه مقیم شده و با فشار دادن کلید Print Screen کلمه ALIREZA را در وسط صفحه چاپ می کند:
stacksg segment stack
db 16 dup(“”)
stacksg ends
datasg segment
string db “this is a resident program !!”,”$”
datasg ends
codesg segment
assume es:codesg,ds:datasg,ss:stacksg
mainproc proc far
mov ax,datasg
- فایلهای پروژه به صورت کامل پس از خرید فایل بلافاصله در اختیار شما قرار خواهد گرفت.
سفارش پروژه سی شارپ
درصورتیکه این پروژه دقیقا مطابق خواسته شما نمی باشد، با کلیک بر روی کلید زیر پروژه دلخواه خود را سفارش دهید.
دیدگاهها
هیچ دیدگاهی برای این محصول نوشته نشده است.