ورود

View Full Version : آموزش بازنویسی وقفه به همراه نمونه برنامه (سورس)



esibarnamenevis
جمعه 29 دی 1391, 15:10 عصر
با سلام
با توجه به در خواست دوستان و راهنمایی در مورد بازنویسی وقفه و نبود تایپیک کاملی، نیاز دیدم یه سری اطلاعات ردوبدل بشه بد نباشه (با اجازه پیشکسوتان)

بازنویسی وقفه از اسمش مشخصه !!!

در ابتدای حافظه جدولی وجود دارد به نام بردار وقفه از آدرس 0 تا 1024 که هر وقفه شامل 4 بایت است 2بایت اول مربوط به آفست و 2 بایت دوم مربوط به سگمنت وقفه است. هر وقفه شامل زیرروالی است که بسته به نام وقفه کاربرد و وظیفه مربوط به خود را دارد با توضیحات داده شده پس کلا 256 وقفه داریم(1024/4=256)که از 0-255 شماره گذاری شده اند پس اگر بخواهیم زیرروال یک وقفه را تغییر دهیم تا کاری که ما میخواهیم انجام دهد به آن بازنویسی وقفه می گوییم (به همین سادگی)

برای بازنویسی دو راه داریم به طور مستقیم(به صورت آدرس دهی مستقیم که در زیر نمونه برنامه ای هستش ) یا غیر مستقیم(با وقفه 21 سرویس 25)


نمونه برنامه بازنویسی وقفه با روش اول خدمت دوستان سوالی بود درخدمتیم:




; interrupt vector (memory from 00000h to 00400h)
; keeps addresses of all interrupts (from 00h to 0ffh).
; you can add new interrupt or modify existing interrupts.
; address of interrupt M is stored in vector at offset M * 4,
; for example: interrupt 10h is stored at offset 10h * 4.
; first goes the offset, then segment (total of 2 bytes).

; for more information refer to "global memory table" in c:\emu8086\documentation.

; note: this is simplified example, it is not recommended to make changes to it
; and run it on the real computer, especially it is not recommended to replace disk
; processing interrupts because this may cause data loss and other instability problems.


name "custint"


org 100h

start:

; set video mode to 3 - 16 color 80x25
mov ah, 0
mov al, 3
int 10h


; set es to "0000":
mov ax, 0
mov es, ax
; calculate vector address for interrupt 90h:
mov al, 90h
; multiply 90h by 4, store result in ax:
mov bl, 4h
mul bl
mov bx, ax
; copy offset into interrupt vector:
mov si, offset [test1]
mov es:[bx], si
add bx, 2
; copy segment into interrupt vector:
mov ax, cs
mov es:[bx], ax


int 90h ; test newly created interrupt.

; wait for any key press:
mov ah, 0
int 16h


int 20h ; halt execution.





; interrupt 90h starts here:
test1: pusha ; store all registers.

; make sure data segment is code segment:
push cs
pop ds

; set segment register to video memory:
mov ax, 0b800h
mov es, ax

; print message, each character is written as
; a word, high byte is color and low byte is
; ascii code:
lea si, msg ; load offset of msg to si.
mov di, 0 ; point to start of the screen.
print:
cmp [si], 0 ; if "0" then stop.
je stop
mov bl, [si] ; read ascii code from msg.
mov bh, 0f1h ; set colors: white background, blue text.
mov es:[di], bx ; write to video memory.
add di, 2 ; go to next position on screen.
inc si ; next char.
jmp print
stop:
popa ; re-store all registers.
iret ; return from interrupt.

msg db "test of custom interrupt!", 0


اگه دوستان سوالی بود یا دوست داشتید ادامه بدیم...





98816

mohamad1370
جمعه 29 دی 1391, 17:45 عصر
فرض کنید مثلاً به جای وقفه 90 ما یه زیر برنامه رو بازنویسی کردیم (بر فرض کارش این باشه که برنامه رو میبره تووی حالت مد گرافیکی ) حالا سوالم اینه که چکار کنیم وقتی یه کلید از صفحه کلید رو فشار دادیم این برنامه اجرا بشه البته به شرط اینکه داخل یه برنامه دیگه باشیم:لبخند:( میشه همون مقیم سازی)

esibarnamenevis
شنبه 30 دی 1391, 18:11 عصر
فرض کنید مثلاً به جای وقفه 90 ما یه زیر برنامه رو بازنویسی کردیم (بر فرض کارش این باشه که برنامه رو میبره تووی حالت مد گرافیکی ) حالا سوالم اینه که چکار کنیم وقتی یه کلید از صفحه کلید رو فشار دادیم این برنامه اجرا بشه البته به شرط اینکه داخل یه برنامه دیگه باشیم( میشه همون مقیم سازی)
شما میتونید زیر برنامه تون رو مقیم حافظه کنید بعد وقفه ای که میخواهید رو بازنویسی کنید(به همین راحتی)

بعد در هر برنامه دیگه ای که خواستید کافیه وقفه بازنویسی شده رو صدا بزنید

mohamad1370
شنبه 30 دی 1391, 19:27 عصر
:تشویق::لبخند: مشکل منم تا حدودی به همون مقیم سازی و لی اصل مطلب درست کارکردن اون کلیده که فشار داده میشه
http://barnamenevis.org/showthread.php?378649-%D9%85%D9%82%DB%8C%D9%85-%D8%B3%D8%A7%D8%B2%DB%8C-%D8%AF%D8%B1-%D8%AD%D8%A7%D9%81%D8%B8%D9%87

جواب ایمیلمونو که نمیدی:گریه:

esibarnamenevis
دوشنبه 02 بهمن 1391, 10:48 صبح
کاربر محترم omolbanin
شما اصلا با قوانین سایت آشنایی ندارید
تمرین یا پروژه دانشجویی جاش اینجا نیست تا مدیر محترم پستتون رو حذف نکرده خودتون حذف کنید
در ضمن درخواست شما چه ربطی به این تایپیک ( بازنویسی وقفه ) داره دوست عزیز اول به عنوان دقت کنید بعد پست بزنید
با تشکر

esibarnamenevis
دوشنبه 02 بهمن 1391, 10:51 صبح
مشکل منم تا حدودی به همون مقیم سازی و لی اصل مطلب درست کارکردن اون کلیده که فشار داده میشه

ما داریم در مورد بازنویسی وقفه بحث می کنیم ، در این مورد اگه مشکلی هست بفرمایید:متفکر:..

mohamad1370
دوشنبه 02 بهمن 1391, 14:30 عصر
خب اینم یه بخشی ازش بر می گرده به بازنویسی وقفه

esibarnamenevis
شنبه 14 بهمن 1391, 08:38 صبح
:تشویق: مشکل منم تا حدودی به همون مقیم سازی و لی اصل مطلب درست کارکردن اون کلیده که فشار داده میشه
http://barnamenevis.org/showthread.php?378649-%D9%85%D9%82%DB%8C%D9%85-%D8%B3%D8%A7%D8%B2%DB%8C-%D8%AF%D8%B1-%D8%AD%D8%A7%D9%81%D8%B8%D9%87

شما میتونید برنامه ای که میخواهید مقیم کنید رو داخل یه فایل جدا بزاید و مقیم کنید بعد برای اجرای برنامه مقیم شده درون فایل دیگه ای اون وقفه ای که بازنویسی کرده اید (مثلا 9)برای برنامه مقیم رو صدا بزنید به همین راحتی برنامه مقیم شده اجرا خواهد شد

واسه کلید که گفتید


mov ah,00
int 16
cmp al,کد اسکی کلید موردنظر

jne end
int 9