مقاطعات البيوس و الدوس BIOS And DOS Interruptions
مقاطعات البيوس و الدوس BIOS And DOS Interruptions
مقاطعات البيوس و الدوس BIOS And DOS Interruptions

مقاطعات البيوس و الدوس

BIOS And DOS Interruptions






سيحتوي الدرس على:



* تعريف المقاطعات

* مقاطعات البيوس (BIOS Interruptions)

* مقاطعات الدوس (DOS Interruptions)





1/ تعريف المقاطعات





المقاطعات هي خدمات يقدمها لنا نظام التشغيل DOS و نظام الإدخال و الإخراج BIOS, هذه الخدمات هي عن عبارة برامج جاهزة يمكن استعمالها من خلال برامج أخرى للإتصال بمختلف عتاد الكمبيوتر (Computer Hardwares) مثل كارت الشاشة, الذاكرة الخ.



للوصول إلى العتاد يوجد طريقتين:



* الطريقة الأول: استعمال مقاطعات الدوس و البيوس

* الطريقة الثانية: البرمجة المباشرة للعتاد





استعمال هذه المقاطعات للوصول إلى العتاد هو أسهل من برمجة العتاد مباشرة لأن هذه المهمة خاصة بمبرمجي أنظمة التشغيل و مبرمجي العتاد وهي تعتبر من أسرارهم البرمجية, يعني إن كنت مبرمج عادي فمن المستحسن أن تترك هذه المهام إلى المقاطعات.





من ايجابيات استعمال المقاطعات هي أنها سهلة الإستعمال لتأدية عديد المهام في برامجنا تتطلب الوصول إلى العتاد مثل قراءة حرف من لوحة المفاتيح.

و من ايجابيات البرمجة المباشرة للعتاد هي التحكم الكامل بالعتاد و الحصول على أداء أفضل.



الفرق بين مقاطعات الدوس و البيوس هو أن مقاطعات البيوس يمكن تنفيذها منذ إيصال الحاسوب بالكهرباء و تشغيله بينما مقاطعات الدوس لا يمكن تنفيذها إلا بعد تحميل نظام التشغيل DOS إلى الذاكرة RAM.



كذلك بعض مقاطعات الدوس تستعمل مقاطعات البيوس لتأدية مهامها و أحسن مثال على ذلك هو أن البيوس يمتلك روتين يمكننا من الوصول إلى القرص المرن (Floppy Disk) هذا الروتين يستطيع القراءة و الكتابة على القرص لكن هناك مشكل وهو أن البيوس لا يعرف شيء اسمه ملفات و مجلدات فكل ما يعرفه البيوس هو كتل من الذاكرة (Memory Blocks) و هذا يعني أنه إذا أردنا الوصول إلى الملف و معالجته يجب علينا أولا معرفة مكانه, لهذا الغرض يقدم لنا DOS التوافقية مع أسماء الملفات عوضنا عن عناوينها و من خلال اسم الملف يبحث لنا ال DOS على مكان هذا الملف في القرص ثم يقوم باستدعاء مقاطعات البيوس لمعالجة الملف (الفتح/القراءة/الكتابة/الإغلاق...).



تمكننا المعالجات من التنفيذ المباشر للمقاطعات و ذلك باستعمال التعليمة INT و تأخذ الشكل التالي:


كود:
int int_number



يوجد 256 مقاطعة يمكن تنفيذها من خلال هذه التعليمة تبدأ من 0 و تنتهي عند 255 (0FFh), قيمة int_number يجب أن تكون داخل هذا المجال. مقابض هذه المقاطعات تخزن في جدول المقاطعات (Interrupts Vector Table) وهو يبدأ من العنوان 0000:0000, هذا العنوان يحتوي على المقاطعة رقم 00h بالإضافة إلى أن كل مقبض يخزن على 4 بايتات يعني أن مقبض المقطعة رقم 01h يخزن في العنوان:



01h * 04h = 00004h



بهذا نتحصل على العنوان 0004h و هو يمثل عنوان مقبض المقاطعة 01h.



يمكننا وضع قاعدة عامة عن حساب عنوان مقابض المقاطعات:

عنوان مقبض مقاطعة = رقم المقاطعة * 04h (حجم تخزين المقابض)



لنأخذ مثال أننا نريد حساب عنوان مقبض المقاطعة 21h (هي أكثر مقاطعات الدوس استعمالا) نقوم بالتالي:

21h * 04h = 84h



إذن عنوان مقبض المقاطعة رقم 21h هو 0000:0084





2/ مقاطعات البيوس (BIOS Interruptions)





رقم المقاطعة الوظيفة



05h Print Screen operation

10h Video display services

11h Equipment determination

12h Memory size determination

13h Diskette and hard disk services

14h Serial I/O services

15h Miscellaneous services

16h Keyboard services

17h Printer services

18h BASIC

19h Reboot

1Ah Real time clock services





معظم هذه المقاطعات تتطلب تجهيز بارمترات في مختلف المسجلات.



ملاحظة: لن أتطرق لشرح كل المقاطعات في هذا الدرس





1. المقاطعة رقم 10h: Video display services





تقدم هذه المقاطعة خدمات متعددة تتعلق بالفيديو, من هذه الخدمات نجد: تغيير حجم المؤشر (Cursor) و موقعه, قراءة مكان المؤشر, تحريك البيانات الموجود على الشاشة للأعلى و الأسفل, قراءة و كتابة الحروف, قراءة و كتابة نقاط الشاشة (Pixels), كتابة سلسلة حروف على الشاشة.



- الخدمة رقم 00h:



الوظيفة: وضع نمط عرض الفيديو (Set video display mode)

البرامترات:

* ah = 00h (رقم الخدمة)

* al = نمط العرض



أنماط العرض:



00h : شاشة 40x25 ابيض/اسود

01h : شاشة 40x25 ملونة

02h : شاشة 80x25 ابيض/اسود

03h : شاشة 80x25 ملونة

04h : شاشة 320x200 ملونة للرسم (4 ألوان)

0Dh : شاشة 320x200 للرسم (16 لون)

0Eh : شاشة 640x200 للرسم (16 لون)

10h : شاشة 640x350 ملونة (16 لون)





ملاحظة: لم أذكر كل الأنماط العرض



- الخدمة رقم 02h:



الوظيفة: تغيير موقع المؤشر (Cursor)

البرامترات:

* ah = 02h (رقم الخدمة)

* bh = رقم الصفحة (00 = رقم الصفحة الحالية)

* dl = الإحداثيات X

* dh = الإحداثيات Y

المواصفات: تغيير موقع المؤشر حسب الإحداثيات (x,y)



- الخدمة رقم 03h:



الوظيفة: جلب موقع المؤشر و حجمه

البرامترات:

* ah = 03h (رقم الخدمة)

* bh = رقم الصفحة ( 00 = رقم الصفحة الحالية)

المخرجات:

* ch, cl = حجم المؤشر

* dl = الإحداثيات X

* dh = الإحداثيات Y



- الخدمة رقم 06h:



الوظيفة: تحريك الشاشة إلى الأعلى/مسح الشاشة

البرامترات:

* ah = 06h (رقم الخدمة)

* al = عدد الأسطر المراد تحريكها

* cx = إحداثيات مكان بداية المسح (cl=x/ch=y)

* dx = إحداثيات مكان نهاية المسح (dl=x/dh=y)

المواصفات:

إذا احتوى المسجل al على صفر, ستقوم هذه الخدمة بعملية مسح الشاشة من الإحداثيات المحددة في المسجلات cx و dx حيث تتراوح قيمة الإحداثيات x بين 0 و 24 و تتراوح قيمة الإحداثيات y بين 0 و 79 (4Fh..00h,18h..00h), هذه القيم خاصة بالشاشة العادية 80x25. إذا احتوى المسجل al على قيمة مخالفة للصفر ستقوم الخدمة بتحريك الشاشة إلى الأعلى حسب قيمة al



- الخدمة رقم 07h:

الوظيفة: تحريك الشاشة إلى الأسفل/مسح الشاشة

البرامترات:

* ah = 07h (رقم الخدمة)

* al = عدد الأسطر المراد تحريكها

* cx = إحداثيات مكان بداية المسح (cl=x/ch=y)

* dx = إحداثيات مكان نهاية المسح (dl=x/dh=y)

المواصفات:

مثل مواصفات الخدمة رقم 06h (تحريك الشاشة إلى الأعلى/مسح الشاشة) إلا أنها تقوم بتحريك الشاشة إلى الأسفل.



الخدمة رقم 09h:

الوظيفة: كتابة حرف على الشاشة

البرامترات:

* ah = 09h

* al = الحرف

* bh = رقم الصفحة (00 = الصفحة الحالية)

* bl = لون الحرف

* cx = عدد مرات كتابة الحرف

المواصفات:

هذه الخدمة لا تغير موقع المؤشر, يجب تحديد عدد مرات كتابة الحرف



الخدمة رقم 0Ah:

الوظيفة: كتابة حرف على الشاشة

البرامترات:

* ah = 0Ah

* al = الحرف

* bh = رقم الصفحة (00 = الصفحة الحالية)

* cx = عدد مرات كتابة الحرف

المواصفات:

هذه الخدمة لا تغير موقع المؤشر, يجب تحديد عدد مرات كتابة الحرف



- الخدمة رقم 0Eh:



الوظيفة: كتابة حرف على الشاشة

البرامترات:

* ah = 0Eh (رقم الخدمة)

* al = كود ASCII الحرف



- الخدمة رقم 0Fh:



الوظيفة: جلب نمط الفيديو (Get Video Mode)

البرامترات:

* ah = 0Fh (رقم الخدمة)

المخرجات:

* ah = عدد الأعمدة

* al = نمط العرض

* bh = رقم الصفحة الحالية



ملاحظة: أنماط العرض ذكرتها مع الخدمة رقم 00h (وضع نمط الفيديو)





2. المقاطعة رقم 11h: Equipment determination



هذه المقاطعة هي عبارة عن خدمة واحدة ترجع لنا لائحة عن المعدات المتصلة بالكمبيوتر.



لتنفيذ هذه الخدمة ننفذ التعليمة INT 11h

المدخلات:

* لا شيء

المخرجات:

* AX = لائحة المعدات



بعد تنفيذ هذه الخدمة سيحتوي المسجل AX على قيمة, كل بت من هذه القيمة يشير إلى التالي:



رقم البت المعنى



0 Floppy disk drive installed

1 Math coprocessor installed

4, 5 Initial video mode:

00 – none

01 – 40x25 Color

10 – 80x25 Color

11 – 80x25 b/w

6, 7 Number of disk drives

8 DMA presend

9,10,11 Number of RS-232 serial cards installed

12 Game I/O card installed

13 Serial printer attached

14, 15 Number of printers attached





ملاحظة:

- هذه الخدمة صممت للأجهزة القديمة يعني أغلب البايتات ستكون بلا معنى في الأجهزة الحديثة

- عندما يكون البت (bit) يحتوي على واحد هذا يعني أن المعد متصل بالجهاز

- هناك بيتات تشير إلى كم من معد معين متصل بالجهاز (مثال: 14, 15 Number of printers attached)



حمل الملف المرفق ستجد فيه برنامج قمت ببرمجته ليجلب معلومات عن المعدات و يعرضها على الشاشة.





3. المقاطعة رقم 16h: Keyboard services





تقدم لنا هذه المقاطعة خدمات متعلقة بلوحة المفاتيح و منها:



الخدمة رقم 00h:



الوظيفة: قراءة حرف من لوحة المفاتيح

البرامترات:

* ah = 00h

المخرجات:

* al = كود ASCII الحرف المدخل

المواصفات:

هناك بعض المفاتيح ليس لها مقابل في جدول ASCII, و عند إدخال مثل هذه المفاتيح يحتوي المسجل al على 0 و يصبح المسجل ah يشير إلى الزر المدخل.

مثال:

* إذا كان المدخل هو الزر UP يشير ah إلى 48h

* إذا كان المدخل هو الزر DOWN يشير ah إلى 50h

* إذا كان المدخل هو الزر RIGHT يشير ah إلى 4Dh

* إذا كان المدخل هو الزر LEFT يشير ah إلى 4Bh





3/ مقاطعات الدوس (DOS Interruptions)



يتم تنفيذ خدمات الدوس من خلال التعليمة INT 21h حيث نضع رقم الخدمة في المسجل AH مع تجهيز البرامترات في المسجلات الأخرى إن تطلب ذلك.



1) الخدمات المتعلقة بالحروف



- الخدمة رقم 01h:



الوظيفة: قراءة حرف من لوحة المفاتيح

المدخلات:

* ah = 01h

المخرجات:

* al = كود ASCII للحرف المدخل



- الخدمة رقم 02h:



الوظيفة: كتابة حرف على الشاشة

المدخلات:

* ah = 02h

* dl = كود ASCII الحرف



- الخدمة رقم 09h:



الوظيفة: كتابة سلسلة حروف على الشاشة

المدخلات:

* ah = 09h

* dx = إزاحة المتغير الذي يحتوي على الحروف



ملاحظة: المتغير يجب أن ينتهي بالرمز '$' لأن هذه الخدمة تكتب المتغير حرف بحرف و تتوقف إلا عند وجود هذا الرمز.





- الخدمة رقم 0Ah:



الوظيفة: قراءة سلسلة حروف من لوحة المفاتيح

المدخلات:

* ah = 0Ah

* dx = إزاحة المتغير الذي سنضع فيه الحروف المدخلة

المواصفات:

يجب تجهيز المتغير كالتالي:

* البايت الأول: يحتوي على عدد الحروف يتراوح بين 1 و 255

* البايت الثاني: ندعه فارغ لأنه سيشير إلى عدد الحروف المدخلة

* البايت الثالث: مصفوفة سنضع فيها الحروف المدخلة



المثال التالي يبين كيفية تجهيز المتغير:


كود:
string    label byte

            nmax    DB 15 ; max chars = 5

            len        DB ? ; will hold the length of string

            str_       DB 50 DUP(?) ; will hold the entered chars





2) الخدمات المتعلقة بالأقراص



- الخدمة رقم 19h:



الوظيفة: جلب drive إقلاع النظام

المدخلات:

* ah = 19h

المخرجات:

* al = رقم drive (0=A, 1=B, 2=C etc)





- الخدمة رقم 1Ah:

الوظيفة: تغيير عنوان منطقة التبادل مع القرص (Set Disk Tranfer Area)

المدخلات:

* ah = 1Ah

* ds:dx = العنوان الجديد لمنطقة التبادل



ملاحظة: منطقة التبادل مع القرص هي تستعمل في عمليات البحث عن الملفات

و هو مكان يحتوي على معلومات عن الملف المعالج.





- الخدمة رقم 2Fh:



الوظيفة: جلب عنوان منطقة التبادل مع القرص (Get Disk Transfer Area)

المدخلات:

* ah = 2Fh

* al = 05h

المخرجات:

es:dx = عنوان منطقة التبادل





3) خدمات الوقت و التاريخ



- الخدمة رقم 2Ah:



الوظيفة: جلب التاريخ

المدخلات:

* ah = 2ah

المخرجات:

* al = اليوم (0=Sun, 1=Mon, 2=Tue, etc)

* cx = السنة

* dh = الشهر (1=Jan, 2=Feb, 3=Mar, etc)

* dl = اليوم (1-31)



- الخدمة رقم 2bh:



الوظيفة: تغيير التاريخ



المدخلات:

* ah = 2bh

* dh = السنة (بين 1980 - 2099)

* dl = اليوم (1 – 31)



- الخدمة رقم 2ch:



الوظيفة: جلب الوقت

المدخلات:

* ah = 2ch

المخرجات:

* ch = الساعة

* cl = الدقائق

* dh = الثواني

* dl = جزء من الثانية



- الخدمة رقم 2Dh:



الوظيفة: تغيير الوقت

المدخلات:

* ah = 2Dh

* ch = الساعة

* cl = الدقائق

* dh = الثواني

* dl = جزء من الثانية





4) خدمات معالجة الملفات



- الخدمة رقم 3Dh



الوظيفة: فتح ملف

المدخلات:

* ah = 3Dh

* al = رقم نمط الوصول:

- 0: فتح الملف للقراءة فقط

- 1: فتح الملف للكتابة فقط

- 2: فتح الملف للقراءة/الكتابة

* dx = إزاحة متغير يحوي اسم الملف (المتغير يجب أن ينتهي ب 0)

المخرجات:

في حالة وجود خطأ سيحتوي علم المحمول على 1 و AX على رقم الخطأ:

- 2: File not found

- 4: Too many open files

- 5: Access denied

- 12: Invalid access

في حالة نجاح العملية سيحتوي علم المحمول على 0 و AX على مقبض الملف.



- الخدمة رقم 3Ch



الوظيفة: إنشاء ملف

المدخلات:

* ah = 3Ch

* dx = إزاحة متغير يحوي اسم الملف (المتغير يجب أن ينتهي ب 0)

* cx = خاصية الملف:

رقم البت المعنى

0 ملف للقراءة فقط

1 ملف مخفي

2 ملف نظام

ملاحظة: إذا أردنا تفعيل خاصية من هذه الخاصية نضع القيمة 1 في رقم بت الخاصية.

المخرجات:

في حالة وجود خطأ سيحتوي علم المحمول على 1 و AX على رقم الخطأ:

- 3: Path not found

- 4: Too many open files

- 5: Access denied

في حالة نجاح العملية سيحتوي علم المحمول على 0 و AX على مقبض الملف.



- الخدمة رقم 3Eh:



الوظيفة: إغلاق ملف

المدخلات:

* ah = 3Eh

* bx = مقبض الملف

المخرجات:

إذا حصل خطأ يرفع علم المحمول (CF) و يحتوي المسجل AX على القيمة 6 و هي تعني Invalid handle



- الخدمة رقم 3Fh



الوظيفة: القراءة من ملف

المدخلات:

* ah = 3Fh

* bx = مقبض الملف

* cx = عدد البايتات للقراءة

* dx = إزاحة مصفوفة (يتم فيها تخزين البايتات المقروئة)

المخرجات:

في حالة وجود خطأ سيحتوي علم المحمول على 1 و AX على رقم الخطأ:

- 5: Access denied

- 6: Invalid handle

في حالة نجاح العملية سيحتوي علم المحمول على 0 و AX على عدد البايتات التي تم قراءتها من الملف.

ملاحظة: عند نجاح العملية و احتوى المسجل AX على 0 هذا يعني أن المؤشر يشير إلى نهاية الملف



- الخدمة رقم 40h:



الوظيفة: الكتابة على ملف

المدخلات:

* ah = 40h

* bx = مقبض الملف (File handle)

* cx = عدد البايتات للكتابة

* dx = إزاحة متغير نريد كتابة محتواه في الملف

المخرجات:

في حالة وجود خطأ سيحتوي علم المحمول على 1 و AX على رقم الخطأ:

- 5: Access denied

- 6: Invalid handle

في حالة نجاح العملية سيحتوي علم المحمول على 0 و AX على عدد البايتات التي تم كتابتها على الملف.



- الخدمة رقم42h



الوظيفة: تحريك مؤشر الملف

المدخلات:

* ah = 24h

* al = طريقة التحريك:

- 0: التحريك من بداية الملف

- 1: التحريك من المكان الحالي للمؤشر

- 2: تحريك المؤشر إلى نهاية الملف

* bx = مقبض الملف

* cx:dx = عدد البايتات المراد تحركها

المخرجات:

في حالة وجود خطأ سيحتوي علم المحمول على 1 و AX على رقم الخطأ:

- 1: Invalid function

- 6: Invalid handle

في حالة نجاح العملية سيحتوي علم المحمول على 0 و dx:ax مكان الجديد للمؤشر





- الخدمة رقم 4Eh



الوظيفة: البحث عن ملف

المدخلات:

* ah = 4Eh

* cx = خاصية الملف

* dx = يشير إلى اسم الملف للبحث

المخرجات:

في حالة وجود خطأ سيحتوي علم المحمول على 1 و AX على رقم الخطأ:

- 2: File not found

- 18: No more files



ملاحظة: تمكننا هذه الخدمة من البحث عن ملفات من دون تحديد اسمها و ذلك باستعمال الرمز '?'

الكود التالي يوضح ذلك:

كود:
.model small

.code

            flname  db "*.asm",0 ; null terminated string

            msg      db "File found$"

start:

            push cs

            pop ds

            mov ah,4eh       ; find first service

            mov cx,06          ; normal attribute

            lea dx,flname     ; file to search

            int 21h

 

            jc exit                ; if error exit

            mov ah,09         ; print service

            lea dx,msg

            int 21h

 

exit:

            mov ah,4ch        ; exit to dos

            int 21h

end start




هذا المثال يقوم بالبحث عن الملفات ذات الإمتداد asm



- الخدمة رقم 4Fh



الوظيفة: البحث عن الملف التالي

المدخلات:

* ah = 4Fh

المخرجات:

في حالة وجود خطأ سيحتوي علم المحمول على 1 و AX على القيمة 18 و هذا يعني أنه لا يوجد المزيد من الملفات.



ملاحظة: هذه الخدمة يمكن استعمالها إلا بعد التنفيذ الخدمة رقم 4Eh (البحث عن ملف)





- الخدمة رقم 41h



الوظيفة: حذف ملف

المدخلات:

* ah = 41h

* dx = مسار و اسم الملف

المخرجات:

في حالة وجود خطأ سيحتوي علم المحمول على 1 و AX على رقم الخطأ:

- 2: File not found

- 5: Access denied



- الخدمة رقم 56h



الوظيفة: إعادة تسمية ملف

المدخلات:

* ah = 65h

* dx = مسار و اسم الملف القديم

* di = مسار و اسم الملف الجديد

المخرجات:

في حالة وجود خطأ سيحتوي علم المحمول على 1 و AX على رقم الخطأ:

- 2: File not found

- 5: Access denied

-17: Not the same device



ملاحظة: يمكن استخدام هذه الخدمة لتحريك ملف(Move file) مكان إلى آخر بتغيير مسار اسم الملف الجديد


مقاطعات البيوس و الدوس BIOS And DOS Interruptions
مقاطعات البيوس و الدوس BIOS And DOS Interruptions
مقاطعات البيوس و الدوس BIOS And DOS Interruptions