0% found this document useful (0 votes)
1K views8 pages

لغة C و برمجة النظم Systems Programming

Uploaded by

dism7
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOC, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
1K views8 pages

لغة C و برمجة النظم Systems Programming

Uploaded by

dism7
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOC, PDF, TXT or read online on Scribd
You are on page 1/ 8

‫‪Systems Programming‬‬ ‫و برمجة النظم‬ ‫‪C‬‬ ‫لغة‬

‫برمجة النظم ‪ ،Systems Programming‬تشير إلى عملية الوصول إلى عتاد الحاسوب )البنية الصلب(‬
‫و العتماد عليها‪ ،‬و فائدة برمجة النظم كبيرة في مجال برمجة أنظمة التشغيل‪ ،‬بل هي الطريق الوحيدة‬
‫لعمل نظام تشغيل‪.‬‬

‫ما هي برمجة النظم؟‪:‬‬ ‫‪1.1‬‬


‫برمجة النظم كما ذكر سابقا‪ ،‬هي الوصول إلى عتاد الحاسوب)البنية الصلبة ‪ ،(Hardware‬في كل من‪:‬‬
‫لوحة المفاتيح‪ ،‬الفأرة‪ ،‬القرص الصلب و المرن‪ ،‬بطاقة الرسوم ‪ Graphic‬و الطابعة‪ ،‬و أي شيء متصل‬
‫بالحاسوب‪ .‬و من برمجة النظم يمكن برمجة أنظمة التشغيل‪ ،‬لن نظام تشغيل هدفه هو التعرف على‬
‫جميع الجهزة و البطاقات المتصلة بالجهاز و توفير برامج تسهل في التعامل مع تلك الجهزة‪ ،‬و بسرعة‪.‬‬

‫‪ 1.2‬المعالج ‪:Processor‬‬
‫المعالج هو وحدة تعالج البيانات من وحدات أخرى مثل‪ :‬وحدة الدخال‪ ،‬وحدة الخراج‪ ،‬و وحدات التصال‬
‫و التشبيك‪ ،‬ثم تظهر تلك البيانات بشكل آخر أو تقوم بتخزينها‪.‬‬

‫سوف نتطرق إلى الجزء ‪ 16‬بت من المعالجات الخاصة بشركة ‪ Intel‬و التي تدعى بـعائلة ‪. x86‬‬
‫تحتوي المعالجات على مسجلت ‪ Registers‬مختلفة لكل منها عملها‪ ،‬و هي أربع أقسام و هي‪:‬‬

‫‪1.2.1‬المسجلت العامة ‪: General Registers‬‬


‫و هي المسجلت التي تساعدنا في التعامل مع دوال ‪ ،BIOS‬و تحتوي المسجلت العامة على كل من‬
‫المسجلت التالية‪:‬‬

‫‪ 1.2.1.1‬مسجل التراكم ‪:Accumulator Register‬‬


‫و رمزه هو ‪ ،AX‬و هو بحجم ‪ 16‬بت )كلمة( أي ‪ 2‬بايت )‪ 8‬بت = ‪1‬بايت(‪ ،‬و هو أيضا ينقسم إلى قسمين‬
‫كل قسم بحجم ‪ 8‬بت‪ ،‬القسمة الول يرمز له بـ ‪ AL‬أي ‪ Accumulator Low‬و يبدأ من البت ‪ ،0‬و‬
‫ينتهي في البت ‪ ،7‬و القسم الثاني يرمز له بـ ‪ AH‬أي ‪ Accumulator High‬و يبدأ من البت ‪ ،8‬و ينتهي‬
‫في البت ‪ .15‬و هذا المسجل الكثر استعمالنا بين المسجلت الخرى‪.‬‬

‫‪ 1.2.1.2‬مسجل القاعدة ‪:Base Register‬‬


‫و يرمز له بـ ‪ ،BX‬و هو بحجم ‪ 16‬بت‪ ،‬و ينقسم إلى قسمين كل قسم بحجم ‪ 8‬بت‪ ،‬القسم الول يرمز‬
‫له بـ ‪ BL‬أي ‪ ،Base Low‬و يبدأ من البت ‪ 0‬إلى البت ‪ ،7‬و القسم الثاني يرمز له بـ ‪ BH‬أي ‪Base‬‬
‫‪ ،High‬و يبدأ من البت ‪ 8‬إلى البت ‪.15‬‬

‫‪ 1.2.1.3‬مسجل العد ‪:Count Register‬‬


‫و يرمز له بـ ‪ ،CX‬و يستعمل بكثرة في حلقات التكرار ‪ ،Loop‬و هو بحجم ‪ 16‬بت‪ ،‬و ينقسم إلى‬
‫قسمين كل قسم بحجم ‪ 8‬بت‪ ،‬القسم الول يرمز له بـ ‪ CL‬أي ‪ ،Count Low‬و يبدأ من البت ‪ 0‬إلى‬
‫البت ‪ ،7‬و القسم الثاني يرمز له بالرمز ‪ CH‬أي ‪ ،Count High‬و يبدأ من البت ‪ 8‬إلى البت ‪.15‬‬

‫‪ 1.2.1.4‬مسجل البيانات ‪:Data Register‬‬


‫و يرمز له بالرمز ‪ ،DX‬و يستعمل بكثرة في تخزين البيانات‪ ،‬و هو بحجم ‪ 16‬بت‪ ،‬و ينقسم إلى قسمين‬
‫كل قسم بحجم ‪ 8‬بت‪ ،‬القسم الول يرمز له بـ ‪ DL‬أي ‪ ،Data Low‬و يبدأ من البت ‪ 0‬إلى البت ‪ ،7‬و‬
‫القسم الثاني يرمز له بالرمز ‪ DH‬أي ‪ ،Data High‬و يبدأ من البت ‪ 8‬إلى البت ‪.15‬‬

‫‪ 1.2.1.6‬الدليل الهدفي ‪:Destination Index‬‬


‫و يرمز له بالرمز ‪ ،DI‬و هو بحجم ‪ 16‬بت‪ ،‬و هو مؤشر بيانات يستعمل لتأشير في عمليات السلسل‬
‫‪.Strings‬‬

‫‪ 1.2.1.5‬الدليل المصدري ‪:Source Index‬‬


‫و يرمز له بالرمز ‪ ،SI‬و هو بحجم ‪ 16‬بت‪ ،‬و هو مؤشر بيانات لمصدر عمليات السلسل‪.‬‬

‫‪ 1.2.1.6‬مؤشر القاعدة ‪:Base Pointer‬‬


‫و يرمز له بالرمز ‪ ،BP‬حجمه ‪ 16‬بت‪ ،‬و هو مؤشر لبيانات المكدس ‪.Stack‬‬

‫‪ 1.2.1.7‬مؤشر المكدس ‪:Stack Pointer‬‬


‫و يرمز له بالرمز ‪ ،SP‬و هو بحجم ‪ 16‬بت‪ ،‬ويستعمل في التأشير إلى موقع في مقطع المكدس ‪Stack‬‬
‫‪ ،Segment‬و يحمل دائما قيمة نهاية مقطع المكدس‪.‬‬
‫‪ 1.2.2‬مسجلت المقاطع ‪:Segments Registers‬‬
‫و تنقسم إلى أربعة مقاطعات‪ ،‬كل مقطع منها بحجم ‪ 16‬بت‪ ،‬و هي‪:‬‬
‫‪ 1.2.2.1‬مقطع البيانات ‪ :Data Segment‬يرمز له بالرمز ‪ ،DS‬و هو يحمل عنوان لبداية مقطع‬
‫البيانات الخاصة بالبرنامج‪.‬‬
‫‪ 1.2.2.2‬مقطع الشفرة ‪ :Code Segment‬يرمز له بالرمز ‪ ،CS‬و هو يحمل عنوان لبداية مقطع‬
‫الشفرة الخاصة بالبرنامج‪.‬‬
‫‪ 1.2.2.3‬مقطع المكدس ‪ :Stack Segment‬يرمز له بالرمز ‪ ،SS‬و هو يحمل عنوان لبداية‬
‫مقطع المكدس الخاصة بالبرنامج‪.‬‬
‫‪ 1.2.2.4‬المقطع الضافي ‪ :Extra Segment‬يرمز له بالرمز ‪ ،ES‬و هو يحمل عنوان لبداية‬
‫المقطع الضافي الخاصة بالبرنامج‪.‬‬

‫‪ 1.2.3‬مسجل مؤشر التعليمة ‪: Instruction Pointer Register‬‬


‫يرمز له بالرمز ‪ ،IP‬و يقوم هذه المؤشر بالتأشير إلى موقع التعليمة القادمة التي سيتم تنفيذها‪.‬‬

‫‪ 1.2.4‬مسجل العلم ‪:Flags Register‬‬


‫هو مسجل بحجم ‪ 16‬بت‪ ،‬يستعمل ‪ 9‬بتات فقط‪ ،‬كل بت منها يمثل علم حيث تكون القيمة ‪ 1‬إذا كانت‬
‫الحالة المستعملة صحيحة‪ ،‬أو ‪ 0‬إذا كانت خاطئة‪.‬‬

‫‪ 1.3‬نظام الدخال و الخراج الساسي ‪:Basic Input Output System‬‬

‫أي بما يسمى بـ ‪ ،BIOS‬و هو نظام موجود بدائرة ذاكرة القراءة فقط ‪،(ROM (Read Only Memory‬‬
‫يتم تشغيله عند تشغيل الحاسوب مباشرة‪ ،‬و ينتهي عمله عند إقلع نظام التشغيل‪ ،‬و يحتوي على‬
‫مقاطع تحتوي على دوال‪ ،‬كل مقطع مخصص لدوال معنية في نفس المجال‪ ،‬مثال على ذلك‪ ،‬المقطع‬
‫‪(h = Hexadecimal) 10‬يقوم بالوصول إلى بطاقة الفيديو و استعمال دوالها‪.‬‬

‫‪ 1.4‬مقاطعات المعالج‪:‬‬

‫عدد مقاطعات المعالج هي ‪ ،256‬كل مقطع منها لدية دوال في نفس المجال‪ ،‬يمكن ذكر بعض المقاطع‬
‫كما يلي‪:‬‬
‫المقطع ‪ ،10h‬و هو خاص بدوال بطاقة الفيديو‪.‬‬
‫المقطع ‪ ،11h‬و هو خاص بدوال بها معلومات حول خصائص الحاسوب‪.‬‬
‫المقطع ‪ ،12h‬هو خاص بدوال ذاكرة الوصول العشوائية ‪.RAM‬‬
‫المقطع ‪ ،13h‬به دوال حول القرص المرن و القرص الصلب‪.‬‬
‫المقطع ‪ ،14h‬و خاص بدوال المنفذ التسلسلي ‪.Series‬‬
‫المقطع ‪ ،15h‬خاص بدوال شريط الكاسيت‪.‬‬
‫المقطع ‪ ،16h‬خاص بدوال لوحة المفاتيح ‪.Keyboard‬‬
‫المقطع ‪ ،17h‬خاص بدوال منفذ التوازي للطابعة‪.‬‬
‫المقطع ‪ ،1Ah‬خاص بدوال الوقت و التاريخ‪.‬‬
‫المقطع ‪ ،33h‬و هو خاص بدوال الفأرة ‪.Mouse‬‬

‫‪ 1.5‬تطبيقات في برمجة النظم‪:‬‬

‫هنا سنتعرف على بعض التطبيقات في برمجة النظم‪،‬إذا أردنا عمل برنامج بدون ضم أي ملف من‬
‫الملفات الرئيسية فذلك ممكن‪ ،‬و لكنه سيصعب علينا الطريق‪ ،‬و أيضا سنحتاج إلى معرفة واسعة في‬
‫لغة التجميع كي نقوم بتفادي ضم الملفات الرئيسية‪ .‬سأعطي مثال بسيط حول طريقة برمجة دوالك‬
‫الخاص باستخدام لغة ‪ C‬بدون استعمال أي دوال أخرى‪ .‬أول نحتاج إلى دالة تقوم بمسح الشاشة‪ ،‬و‬
‫أخرى تقوم بإنتظار المستخدم أن يقوم بالضغط على زر ما من أزرار لوحة المفاتيح‪ ،‬في دالة مسح‬
‫الشاشة سنستعمل مقطع من مقاطع نظام ‪ BIOS‬و هو المقطع ‪ 10h‬و الخاص ببطاقة الفيديو‪ ،‬و‬
‫سنستعمل الدالة ‪ 3‬من هذا المقطع و نضعها في المسجل ‪ ،AX‬أما الدالة التي تنتظر المستخدم أن‬
‫يضغط على زر نستعمل المقاطعة ‪ 16h‬و التي بها دوال خاصة بلوحة المفاتيح‪ ،‬و هنا سنستعمل الدالة‬
‫‪ 10‬من دوال لوحة المفاتيح‪ .‬و سيكون البرنامج على الشكل التالي‪:‬‬

‫كود‪:‬‬
‫;)‪void clrscr(void‬‬
‫;)‪void getch(void‬‬

‫{)‪main(void‬‬
‫;)(‪clrscr‬‬

‫;)(‪getch‬‬
‫}‬

‫{)‪void clrscr(void‬‬
‫‪asm mov ax, 3‬‬
‫‪asm int 10h‬‬
‫}‬

‫{)‪void getch(void‬‬
‫‪asm mov ax, 10‬‬
‫‪asm int 16h‬‬
‫}‬

‫يحتوي المر ‪ mov‬على وسيطين‪ ،‬الول هو لسم مسجل‪ ،‬و الثاني هو لقيمة التي سيتم وضعها في‬
‫المسجل‪ .‬أما ‪ int‬فهي نستعملها في استدعاء المقاطع‪ ،‬و هي مختصرة من ‪ .interruption‬في حالة‬
‫أنك تستعمل المترجم ‪ Turbo C‬فيجب عليك ترجمة هذه البرنامج باستخدام المر ‪ tcc‬من الـ ‪.DOS‬‬
‫و بهذه الطريقة يمكن الوصول إلى أي مكان من أمكان المعالج‪ ،‬و استخدام مقاطعة نظام ‪ BIOS‬و‬
‫دواله‪ ،‬و لكن هذه طريقة أمرها طويل‪ ،‬و من البرنامج السابق لن نلحظ شيء‪ ،‬لن تلك الدوال بسيطة‬
‫و ل تحتاج إلى إرجاع قيمة أو استعمال بها مؤشرات أو سلسل حرفية‪ ،‬فمثل إذا أردنا برمجة دالة‬
‫مكافئة لدالة ‪ printf‬باستخدام الطريقة السابقة فسيكون العمل عليها غير مجدي‪ ،‬لذا سنستعمل‬
‫المترجمين ‪ Turbo C‬و ‪ ،Quick C‬لن بهما دالة تتعامل مع المقاطع بطريقة كفوءة‪ ،‬و أيضا لن نحتاج‬
‫إلى استعمال أوامر لغة التجميع مما يجعل البرمجة أكثر سهولة‪.‬‬
‫اسم الدالة هو ‪ ،int86‬و هي من دوال الملف الرأسي ‪ ،dos.h‬تحتوي على ثلثة وسائط‪ ،‬و نموذج هذه‬
‫الدالة مكتوب بهذه الطريقة‪:‬‬
‫كود‪:‬‬
‫;)‪int int86(int intno, union REGS *inregs, union REGS *outregs‬‬

‫بالنسبة للوسيط الول فهو سيحمل قيمة المقطع المراد استعماله‪ ،‬أما الوسيط الثاني و الثالث فهما‬
‫لبنية من نوع ‪ union‬و التي تحمل القيمة التي سيتم استعمالها مع المقاطعة‪ .‬و البنية ‪ REGS‬تحتوي‬
‫على بنيتين‪ ،‬البنية ‪ x‬و التي تحتوي على أسماء مسجلت المعالج ذات الحجم ‪ 16‬بت أي ‪ 2‬بايت أي‬
‫كلمة‪ ،‬و تلك المسجلت هي ‪ ،AX, BX, CX, DX, SI, DI‬و ‪ cflag‬و ‪ ،flag‬و هي معرفة بالشكل التالي‪:‬‬

‫كود‪:‬‬
‫{ ‪struct WORDREGS‬‬
‫‪unsigned int‬‬ ‫;‪ax, bx, cx, dx, si, di, cflag, flags‬‬
‫;}‬

‫أما البنية الثانية فهي ‪ ،h‬و هي تحمل أسماء مسجلت المعالج ذات الحجم ‪ 8‬بت أي ‪ 1‬بايت‪ ،‬و التي هي‬
‫‪ ،AH, AL, BH, BL, CH, CL, DH, DL‬و البنية معرفة بالشكل التالي‪:‬‬
‫كود‪:‬‬

‫{ ‪struct BYTEREGS‬‬
‫;‪unsigned char al, ah, bl, bh, cl, ch, dl, dh‬‬
‫;}‬
‫أما البنية ‪ REGS‬فهي معرفة بالشكل التالي‪:‬‬
‫كود‪:‬‬
‫‪union REGS‬‬ ‫{‬
‫;‪struct WORDREGS x‬‬
‫;‪struct BYTEREGS h‬‬
‫;}‬

‫و إذا أردنا كتابة المثال السابق باستخدام هذه الدالة فسيكون البرنامج كتالي‪:‬‬
‫كود‪:‬‬
‫>‪#include<dos.h‬‬

‫;)‪void clrscr(void‬‬
‫;)‪void getch(void‬‬

‫{)‪main(void‬‬
‫;)(‪clrscr‬‬

‫;)(‪getch‬‬
‫}‬

‫{)‪void clrscr(void‬‬
‫;‪union REGS regs‬‬
‫;‪regs.x.ax = 0x0003‬‬
‫;)‪int86(0x0010, &regs, &regs‬‬
‫}‬

‫{)‪void getch(void‬‬
‫;‪union REGS regs‬‬
‫;‪regs.x.ax = 0x0010‬‬
‫;)‪int86(0x0016, &regs, &regs‬‬
‫}‬

‫في دالة مسح الشاشة استعملنا ‪ x‬من البنية ‪ regs‬لننا سنستعمل مسجل بحجم ‪ 16‬بت و الذي هو ‪،ax‬‬
‫أما الرقم ‪ x0003 0‬فهو بالنظام ستعشري لدالة مسح الشاشة‪ .‬و في الوسيط الول من الدالة ‪int86‬‬
‫استعملنا الرقم ‪ x0010 0‬و الذي هو رقم مقطع دوال الفيديو‪ ،‬أما الوسيط الثاني فهو للبنية التي سيتم‬
‫أخذ قيمها و تطبيقها على رقم المقاطعة‪ ،‬و تأخيرا الوسيط الثالث و الذي يقوم بوضع نتائج العمليات في‬
‫نفس البنية‪ ،‬و أيضا توجد طريقة أخرى توضح فائدة الوسيط الثالث و هي تكون على الشكل التالي‪:‬‬
‫كود‪:‬‬
‫{)‪void clrscr(void‬‬
‫;‪union REGS inregs, outregs‬‬
‫;‪inregs.x.ax = 0x0003‬‬
‫;)‪int86(0x0010, &inregs, &outregs‬‬
‫}‬

‫توجد دالة أخرى مشابه لدابة ‪ int86‬و هي ‪ ،int86x‬و هي مكافئة للسابقة إل ان لها وسيط إضافي‬
‫لبنية اخرى‪ ،‬و اسم تلك البنية هو ‪ SREGS‬و هي معرفة بالشكل التالي‪:‬‬
‫كود‪:‬‬
‫‪struct SREGS‬‬ ‫{‬
‫‪unsigned int‬‬ ‫;‪es‬‬
‫‪unsigned int‬‬ ‫;‪cs‬‬
‫‪unsigned int‬‬ ‫;‪ss‬‬
‫‪unsigned int‬‬ ‫;‪ds‬‬
‫;}‬

‫و نستعمل هذه الدالة في حالة حاجتنا إلى استخدام مسجلت المقاطع ‪.Segment Registers‬‬

‫و توجد دالة ‪ intdos‬و الدالة ‪ .intdosx‬بالنسبة للدالة ‪ intdos‬فهي مكافئة لـ‪:‬‬


‫كود‪:‬‬
‫; )‪int86(0x0021, &inregs, &outregs‬‬

‫بالنسبة لرقم ‪ 0x0021‬فهو لمقطع دوال نظام ‪ ،DOS‬و هذا مثال لطريقة استخدام هذه الدالة‪:‬‬

‫كود‪:‬‬
‫>‪#include<dos.h‬‬
‫;)‪void putch(char ch‬‬
‫;)‪void clrscr(void‬‬
‫;)‪void getch(void‬‬

‫{)‪main(void‬‬
‫;)(‪clrscr‬‬

‫;)'‪putch('H‬‬
‫;)'‪putch('e‬‬
‫;)'‪putch('l‬‬
‫;)'‪putch('l‬‬
‫;)'‪putch('o‬‬
‫‪putch(10); /*New Line (ASCII)*/‬‬
‫‪putch(13); /*Return Carriage (ASCII)*/‬‬

‫;)(‪getch‬‬
‫}‬

‫{)‪void printch(char ch‬‬


‫;‪union REGS inregs, outregs‬‬
‫;‪inregs.h.ah = 0x0002‬‬
‫;‪inregs.h.dl = ch‬‬
‫‪intdos(&inregs, &outregs);/*Or int86(0x0021, &inregs,‬‬
‫‪&outregs);*/‬‬
‫}‬

‫{)‪void clrscr(void‬‬
‫;‪union REGS inregs, outregs‬‬
‫;‪inregs.x.ax = 0x0003‬‬
‫;)‪int86(0x0010, &inregs, &outregs‬‬
‫}‬

‫{)‪void getch(void‬‬
‫;‪union REGS regs‬‬
‫;‪regs.x.ax = 0x0010‬‬
‫;)‪int86(0x0016, &regs, &regs‬‬
‫}‬

‫الدالة ‪ 0x0002‬تقوم بطبع حرف على الشاشة‪ ،‬و هي تحتوي على وسيط واحد و هو للحرف الذي‬
‫سيتم طبعه‪ ،‬حيث يتم وضع الحرف في المسجل ‪.dl‬‬

‫أما الدالة ‪ intdosx‬فهي مكافئة لـ‪:‬‬


‫كود‪:‬‬

‫; )‪int86x(0x0021, &inregs, &outregs, &sregs‬‬

‫الن سأعطي بعض المثلة المتفرقة‪ ،‬و التي سنرجع إلى شرحها التفصيلي في وقتها‪ ،‬أول نبدأ بدالة‬
‫تقوم بتحريك مؤشر الكتابة إلى مكان يقوم بتحديده المبرمج‪ ،‬سنستعمل هنا دوال الفيديو و التي هي‬
‫موجودة في المقطع ‪ ،10h‬و سيكون اسم الدالة هو ‪ ،gotoxy‬و رقم الدالة في المقطع ‪ 10h‬هو‬
‫‪ ،0x02‬و لها ثلثة وسائط و هي‪ :‬وسيط لرقم صفحة الشاشة في المسجل ‪ bh‬و التي تكون غالبا ‪ ،0‬و‬
‫وسيط لمكان المؤشر في التجاه ‪ x‬و التي تكون في المسجل ‪ ،dl‬و أخيرا الوسيط الثالثة و هو لمكان‬
‫المؤشر في التجاه ‪ y‬و الذي يكون في المسجل ‪ ،dh‬أما رقم الدالة فسيكون في المسجل ‪ ،ah‬الدالة‪:‬‬
‫كود‪:‬‬
‫{)‪void gotoxy(int x, int y‬‬
‫;‪union REGS inregs, outregs‬‬
‫;‪inregs.h.ah = 0x02‬‬
‫;‪inregs.h.bh = 0x00‬‬
‫;‪inregs.h.dh = y‬‬
‫;‪inregs.h.dl = x‬‬
‫;)‪int86(0x0010, &inregs, &outregs‬‬
‫}‬

‫و يمكن أيضا عمل عكس هذه الدالة‪ ،‬حيث تقوم بأخذ قيم لموقع المؤشر‪ ،‬و ذالك بالعتماد على الدالة‬
‫‪ 0x03‬من نفس المقطع‪ ،‬حيث تكون الدالة كتالي‪:‬‬
‫كود‪:‬‬
‫{)‪void getxy(int *x, int *y‬‬
‫;‪union REGS inregs, outregs‬‬
‫;‪inregs.h.ah = 0x03‬‬
‫;‪inregs.h.bh = 0x00‬‬
‫;)‪int86(0x0010, &inregs, &outregs‬‬
‫;‪*x = outregs.h.dl‬‬
‫;‪*y = outregs.h.dh‬‬
‫}‬

‫و من الدالة ‪ gotoxy‬يمكننا عمل دالة أخرى تقوم بمسح الشاشة و تكون مكافئة بدالة ‪ ،clrscr‬و هي‬
‫على الشكل التالي‪:‬‬
‫كود‪:‬‬
‫{)‪void clrscr(void‬‬
‫;‪int i‬‬
‫)‪for(i=0;i<25;i++‬‬
‫;)"‪printf("\n‬‬
‫;)‪gotoxy(0, 0‬‬
‫}‬

‫الن نذهب إلى كيفية عمل دالة تقوم بطباعة حرف على الشاشة‪ ،‬مع إمكانيات التحكم في لون هذا‬
‫الحرف‪ ،‬و هنا سنستعمل الدالة ‪ 0x09‬من المقطع ‪ ،10h‬و هي تحتوي على أربعة وسائط‪ ،‬الوسيط‬
‫الول هو الحرف المراد طبعه و الذي يكون في المسجل ‪ ،al‬و الوسيط الثاني لصفحة الشاشة و التي‬
‫تكون دائما ‪ 0x00‬في المسجل ‪ ،bh‬و الوسيط الثالث للون الحرف و الذي يكون في المسجل ‪ ،bl‬و‬
‫أخير الوسيط الرابع و الذي هو عدد الحرف المراد طبعه و يكون في المسجل ‪ ،cx‬و الدالة تكون على‬
‫الشكل التالي‪:‬‬
‫كود‪:‬‬
‫{)‪void putc(char ch, int color‬‬
‫;‪union REGS inregs, outregs‬‬
‫;‪inregs.h.ah = 0x09‬‬
‫;‪inregs.h.al = ch‬‬
‫;‪inregs.h.bh = 0x00‬‬
‫;‪inregs.h.bl = color‬‬
‫;‪inregs.x.cx = 0x0001‬‬
‫;)‪int86(0x0010, &inregs, &outregs‬‬
‫}‬

‫و من هذه الدالة يمكننا عمل دالة تقوم بطباعة سلسلة حرفية‪ ،‬و تكون على الشكل التالي‪:‬‬
‫كود‪:‬‬
‫{)‪void puts(char *str, int color‬‬
‫;‪union REGS regs‬‬
‫;‪int getx‬‬
‫;‪regs.h.ah = 0x03‬‬
‫;‪regs.h.bh = 0x00‬‬
‫;)‪int86(0x0010, &regs, &regs‬‬
‫;‪getx = regs.h.dl‬‬

‫{)‪while(*str‬‬
‫;)‪putc(*str++, color‬‬
‫;‪regs.h.ah = 0x02‬‬
‫;‪regs.h.bh = 0x00‬‬
‫;‪regs.h.dl = ++getx‬‬
‫;)‪int86(0x0010, &regs, &regs‬‬
‫}‬
‫}‬

‫إل هنا نتوقف‪ ،‬و هكذا نكون أقد أخذنا فكرة عامة عن برمجة النظم‪ ،‬و في الدروس القادمة سنقوم‬
‫بتخصيص كل منها مجاله الخاص في كل من‪ :‬لوحة المفاتيح‪ ،‬الفأرة‪ ،‬المقود‪ ،‬الوصول إلى منفذ الطابعة‪،‬‬
‫الوصول إلى منفذ التسلسلي ‪ ،Series‬القرص الصلب و المرن‪ ،‬و قارئ القراص المضغوطة‪ ،‬الوصول‬
‫إلى بطاقة الفيديو‪ ... ،‬و أخيرا مبادئ في برمجة أنظمة التشغيل‪ .‬و هذا كله في حالة استمرار هذه‬
‫السلسلة‪ .‬و السلم عليكم‪...‬‬
‫التوقيع ‪:‬‬

‫التعلم ليس بالمر الصعب ولكن ركز وتلقى المعلومة جيدًا‪.‬‬ ‫‪.1‬‬
‫الحب والخلص سبب نهوض الكثير فلنحب بعضنا ونخلص لبعضنا البعض‪.‬‬ ‫‪.2‬‬

You might also like