طباعة هذه الصفحة
كتبه المجمع NASM 6130
الدرس 12: البرمجة المباشرة الدرس 12: البرمجة المباشرة
قيم الموضوع
(1 تصويت)
 
ربما قد لم تسمع أبدا بالبرمجة المباشرة. نعم، هذا ما قررنا أن نسمي هذا الدرس به. إن البرمجة المباشرة تمكنك من برمجة العتاد والأجهزة المرتبطة بالحاسوب أو بالعقل الإلكتروني مباشرة دون الحاجة للاستعاة بأنظمة التشغيل. لقد درست القواطع في الدروس الأولى، لكن الآن سنتحدت عن القطع وليس القواطع.

1. مقدمة

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

وفي هذه الفقرة سنتطرق إلى مستويات البرمجة في المجمع ذاته.

إذن البرمجة في المجمع تنقسم أساسا إلى ثلاث مستويات، وهي:

  • المستوى 3: البرمجة باستعمال القواطع المحدثة كـ 21h المخصصة لـ DOS.
  • المستوى 2: البرمجة باستعمال القواطع الآلية كـ 10h لـ BIOS و 16h للوحة المفاتيح...
  • المستوى 1: البرمجة المباشرة باستعمال عناوين أو مداخل آليات الحاسوب، وهي الأسرع.

2. العناوين أو القطع الموجودة في الذاكرة

لقد تطرقنا في الفقرة 9 إلى مفهوم العنونة، وأن الذاكرة مقسمة إلى قطع متساوية، وحجم كل قطعة  في الغالب هو64ko.

هذه القطع تتميز بعضها عن بعض بعناوين. والمعروف حاليا أن الجزء الأول للذاكرة الذي يبلغ حجمه 1Mo يحتوي على قطع تدير معظم العمليات، وأخرى تحتوي على نواة نظام التشغيل.

ومن أبرز هذه القطع :

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

القطعة B800 التي تتكلف بإظهار الحروف على الشاشة في النظام النصي ...

وإليك قائمة تعرض هذه القطع الموجودة في الجزء الأول للذاكرة:

  العنوان المحتوى
إلى  
من
FFFFFh
FE000h
  ROM BIOS
إلى  
من
FDFFFh
F6000h
ROM BASIC : وهو المترجم الإليكتروني للـ BIOS مخصص للتعديل
إلى  
من
F5FFFh
C0000h
مستعملة من طرف بطاقات إليكترونية ذوات الشق الممتد
إلى  
من
BFFFFh
B8000h
ذاكرة مخصصة للنظام النصي ذي 16 لونا
إلى  
من
B7FFFh
B0000h
ذاكرة مخصصة للنظام النصي أحادي اللون (أبيض و أسود)
إلى  
من
AFFFFh
A0000h
ذاكرة مخصصة للنظام الهندسي والرسومات VGA ...
إلى  
من
9FFFFh
متغير
منطقة من الذاكرة مخصصة للمستعمل
إلى  
من
متغير
00600h
 جزء محتفظ به أو مخصص للـ  DOS
إلى  
من
005FFh
00500h
 معطيات  DOS
إلى  
من
004FFh
00400h
معطيات BIOS
إلى  
من
003FFh
00180h
لائحة القواطع المعرفة من طرف المستعمل
إلى  
من
0017Fh  
00080h
 لائحة القواطع المخصصة للـ DOS
إلى  
من
0007Fh  
00000h
لائحة القواطع المخصصة للـ BIOS

إذا كنت ممن يهوى اللعب بالرسومات والهندسة في الحاسوب فيجب أن تتذكر دائما القطعة A0000

كما أنه يجب أن تتعرف على القطعة B8000 التي سنستعملها في فقرتنا هذه.


3الكتابة على الشاشة باستعمال القطعة B800h

مثال     : أكتب على الشاشة الحرف 'A'

الحلول :

3.1 : البرمجة في المستوى الثالث

استعمال الدالة 02h للقاطعة المحدثة 21h المخصصة للـ DOS

 mov ah,02h  
 mov dl,'A'  
 int 21h

3.2 : البرمجة في المستوى الثاني

استعمال الدالة 0Eh للقاطعة الآلية 10h المخصصة للـ BIOS

 mov ah,0eh
 mov al,'A'
 int 10h

 

3.3 : البرمجة في المستوى الأول

البرمجة المباشرة، استعمال القطعة B800

وكما قلنا في بداية دراسة المجمع أنه:   ليس مطلوب منك الفهم الدقيق لهذه الخزانات، لأنه خلال تعمقك في دراسة المجمع ستعرف إن شاء الله دور كل واحد منها.

الآن قد حــــان الوقت للاستعمال خزانات القطع : CS و DS و SS و ES و FS و GS.

أول ما نلاحظه أن كلمة خزانات القطع مرتبطة بكلمة قطعة (قطعة هي في الأصل عبارة عن عنوان في الذاكرة).

إذن نستنج أننا بتعاملنا مع القطع يجب علينا استعمال خزانات القطع.

 

وكما تطرقنا في الفقرة 10 (العنونة والمؤشرات) أن القطعة أو العنوان:

  •  يمكننا استعماله كاسم (في حالة عدم تعرفنا على رقمه أو عنوانه)، مثلا :

mov byte [car],'A'  
mov ah,0eh  
mov al,byte [car]  
int 10h
...  
car resb 1
  كما نلاحظ هنا أننا كتبنا الحرف 'A' مباشرة في القطعة [car]
  • أو نستعمله مباشرة ، مثلا [B800]

لكن السؤال : كيف نستعمله مباشرة ؟

الجواب : ربما يوحى إليك أنه بالإمكان أن نكتب مثلا  mov [B800],'A'   أو mov byte [B800],'A'  كما هو مبين في المثال أعلاه. وهذا الجواب في الحقيقية صح، لكن المجمع أو عقل الحاسوب لا يقبل ذلك، ويفرض عليك وضع العنوان في الخزان AX  ثم تضع هذا الأخير في إحدى القطع التي تريدها (CS أو DS أو SS أو ES أو FS أو GS).

اختيار القطعة المناسبة :

  1. القطعة CS : من الأفضل تجاوزها لأنها مخصصة لشفرتك أو مشروعك.
  2. القطعة DS : من الأفضل تجاوزها لأنها مخصصة لمعطيات وتعريفات شفرتك أو مشروعك.
  3. القطعة SS : من الأفضل تجاوزها لأنها مخصصة للمكدس.
  4. القطع ES و FS و GS : من الأفضل استعمال إحداها، لأنهن غير مستعملات في الغالب.

إذن نكتب في المجمع :

mov AX,0B800h  
mov ES,AX

  لماذا وضعنا 0 أمام القطعة B800h ، لأننا إذ لم نفعل ذلك سيضن المجمع nasm أن القطعة عبارة عن متغير   وليس بالعنوان الذي نريده.

حسنا، النظام النصي يقدم لنا 80 حرفا في كل سطر ، وعدد السطور الإجمالي هو 25 سطرا ، إذن الشاشة يمكنها إظهار 80×25 حرف أي 2000 حرف.

يجب أن تعلم بأن النظام النصي يبدأ من B800:0000 وينتهي في B800:3FFF (ويجب أن تعلم أيضا أن كل حرف يحتاج لثمنين داخل هذه القطعة حيث يظهر بعد ذلك في مكان معين في الشاشة).

حيث أن الجزء الثاني للقطعة B800 يسمى البعد كما تطرقنا إليه سابقا (في الفقرة 10) ولدينا حجم القطعة هو 1 + 3FFF أي 4000h ثمن أي 16384 ثمن بالنظام العشري.

وكل ثمنين من هذه القطعة يمثلان موقعا واحدا في الشاشة، حيث أن الثمن الأول مخصص للحرف والثاني للونه ولون قعره وكذلك الوميض (ارجع إلى الفقرة 4 'خلاصة').

إذن العدد الإجمالي للحروف التي يمكن كتابتها هو 16384/2  أي 8192  حرف، وهذا كافي لاستيعاب 80×25 حرف.

المهم: نستنتج من هذا كله أنك لو أردت أن تكتب على الشاشة ستحتاج بطبيعة الحال إلى المكان الذي تود الكتابة فيه، وفي القطعة B800 لديك  16384/2 مكان وهذا يكفي لجميع المواقع أو الأمكنة الموجودة في الشاشة.

نتيجة:

  • عندما نتكلم عن الشاشة ، نقول المكان أو الموقع،

  • لكن عندما نتكلم عن القطعة ، نقول البعد.

إليك الشاشة في النظام النصي

79......................0  

             A

 

0
:
:
:
:
:
:
24

إذن لتحيد الموقع أو البعد الذي تود الكتابة فيه، لدينا العلاقة التالية : (X+80Y)*2  (حيث X يمثل الأعمدة و Y يمثل السطور أما 2 فلأن كل حرف يستوجب ثمنين في القطعة B800).

ولتمثيل البعد والقطعة نستعمل الشكل التالي :   [البعد:القطعة]

مثال: نريد أن نكتب الحرف 'A' في الموقع المحدد بالعمود 2  والسطر 10.

حساب البعد :  2*(10 × 80 + 2)  أي 1604

ونكتب إذا :

الطريقة الأولى الطريقة الثانية ملاحظات

 mov AX,0B800h
 mov ES,
AX
 mov
Byte [ES:1604],'A'

 mov AX,0B800h
 mov ES,
AX
 mov BL,'A'
 mov [ES:1604],BL

 وهذه هي البرمجة المباشرة بدون استعمال  القواطع ودوالها.  

 يمكنك استعمال BL أو AH او كل خزان ذي 8 أزواج في هذه الحالة.

ملاحظة عامة:

إن جميع قواطع الـ DOS ودوالها مبنية أساسا أو تم إنشاءها بواسطة القواطع الآلية أو باستعمال البرمجة المباشرة، ويمكن الاستنتاج من هذا أنك يمكنك الاستغناء عن قواطع الـ DOS خصوصا لمن يهتم بإنشاء نظام تشغيل جديد. أما من يهتم بإنشاء الحماة المعلوماتية (الفيروسات) الخاصة بـ DOS فعليه استيعاب والفهم الدقيق لقواطعه ودوالها.

 


4. النظام النصي والنظام الهندسي

4.1 النظام النصي

النظام النصي هو بكل بساطة النظام الذي يستعمله المترجم NASM أو DOS أو...

أمثلة:

عند الإظهار أو التنفيذ في DOS واجهة المترجم C

 

             SALAM

KAIFA ALHAL

#include <stdio.h>

void main()

{getch();}

حسنا، يتميز النظام النصي بإظهار الحروف وبعض الألوان على الشاشة بحيث لا توجد رسومات أو صور ....

وهناك عدة أنظمة نصية : تتباين فيما بينها بعدد الحروف الممكن إظهارها على الشاشة وكذلك عدد الألوان المستعملة (16 لون كأقصى حد).

جميع الأنظمة النصية مرتبطة بالقطعة B000 أو القطعة B800.

لتحديد النظام الذي تود استعماله يكفي أن تستدعي القاطعة الآلية 10h المتعلقة بـ BIOS وأن تضع رقم النظام في الخزان AH أو AX.

ونكتب إذن:

mov ax , <رقم النظام>
int   10h

إليك إذن قائمة الأنظمة النصية المتواجدة في الـ BIOS والمتحكمة فيها القاطعة 10h:

AH = 00h
AL = النظام النصي

00h : الشاشة  25×40    الألوان 16
01h : الشاشة  25×40    الألوان 16
02h : الشاشة  25×40    الألوان 16
03h : الشاشة  25×80    الألوان 16 (وهو الجد المستعمل ويسمى النظام النصي القياسي)
07h : الشاشة  25×80    الألوان 1 : أحادي اللون

مثال:

 mov AX,03h  ; النظام النصي 3
 int  10h


 mov AX,
0B800h
 mov ES,
AX
 mov
Byte [ES:1604],'A'

 

4.1 النظام الهندسي

النظام الهندسي هو بكل بساطة النظام الذي يظهر الرسومات والأشكال بشكل جميل ومتناسق على الشاشة.

أمثلة:

شاشة windows

حسنا، يتميز النظام الهندسي بإظهار الرسومات والصور والأشكال ....

وهناك عدة أنظمة هندسية : تتباين فيما بينها بعدد الألوان المستعملة (232  لون كأقصى حد لحد الآن) وكذلك استبانة الشاشة.

جميع الأنظمة الهندسية مرتبطة بالقطعة A000.

لتحديد النظام الذي تود استعماله يكفي أن تستدعي القاطعة الآلية 10h المتعلقة بـ BIOS وأن تضع رقم النظام في الخزان AH أو AX.

ونكتب إذن:

mov ax , <رقم النظام>
int   10h

إليك إذن قائمة الأنظمة الهندسية المتواجدة في الـ BIOS والمتحكمة فيها القاطعة 10h:

AH = 00h
AL = النظام الهندسي

04h : الشاشة  200×320   الألوان  4
05h : الشاشة  200×320   الألوان  4  من نوع رمادي
06h : الشاشة  200×640   الألوان  4
0Dh : الشاشة  200×320  الألوان 16 (انطلاقا من EGA)
0Eh : الشاشة  200×640   الألوان 16 (انطلاقا من EGA)
0Fh : الشاشة  640x350    الألوان N&B (انطلاقا من EGA)
10h : الشاشة  640x350    الألوان  16  (انطلاقا من EGA)
11h : الشاشة  640x480    الألوان 2  (انطلاقا من MCGA)
12h : الشاشة  640x480    الألوان 16(انطلاقا من VGA)
13h : الشاشة  200×320   الألوان 256 (انطلاقا من MCGA) (وهو الجد مستعمل أثناء التعلم)

مثال: نرسم نقطة ذات اللون 106 في الإحداثيات :الأرتوب 10 والأفصول 30

 mov AX,13h  ;1النظام الهندسي 3
 int  10h


 mov AX,
0A000h
 mov ES,
AX
 mov
Byte [ES:320*10+30],106

ملاحظة : إن الدوال التي قدمناها من الدالة 00h إلى الدالة 13h للنظامين معا ينتميان إلى النظام VGA، ويوجد نظام آخر أكثر تطورا وهو نظام VISA ويخص فقط النظام الهندسي ولا مجال لذكره هنا.

 


5. رسم نقطة على الشاشة باستعمال القطعة A000h

في هذه الحالة سنستعمل النظام الهندسي (ولنختر الدالة 13h للقاطعة 10h المتميزة بـ 256 لون واستبانة 200×320).

mov ax , 13h
int   10h

كذلك سنستعمل القطعة A000h الخاصة بالرسومات والهندسة.

mov AX,0A000h
mov ES,
AX

إذن لدينا: الشاشة في النظام  256× 200×320

319......................0  

             .

 

0
:
:
:
:
:
:
199

لتحديد مكان نقيطة (pixel) على الشاشة نستعمل العلاقة التالية : X+320Y  (حيث X يمثل الأفاصيل و Y يمثل الأراتيب).

مثال : نريد أن نرسم نقيطة ذات اللون 205 في الإحداثيات (X=100  و  Y=80)

حساب البعد :  80 × 320 + 100  أي 25700

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

ونكتب إذا :

mov ax , 13h
int   10h
mov ax,
0A000h
mov es,ax
mov dl,205
mov [es:25700],dl

 

مثال كامل في NASM :

          ;NASM-IDE ASM Assistant Assembler Project File
[BITS 16] ;Set code generation to 16 bit mode
[ORG 0x0100] ;Set code start address to 0100h

[SEGMENT .text] ;Main code segment
mov ax , 13h    ; vga نظام
int 10h

mov ax,0A000h 
mov es,ax

mov dl,205        ;نقيطة ذات اللون 205
mov [es:25700],dl

mov ah , 0        ; وانتظار الضغط على مفتاح
int 16h

mov ax , 3        ; الرجوع إلى النظام النصي
int 10h

mov ax,4c00h     ;هذه الدالة ضرورية لإنهاء الشفرة أو المشروع
int 21h

[SEGMENT .data]   ;التعريفات المهيئة

[SEGMENT .bss] ;التعريفات غير المهيئة

 


تمارين تطبيقية


التمرين 12.1

  1. ما الفرق بين النظام النصي والنظام الهندسي ؟
  2. ما الفرق بين القطعة A000h و B800h ؟

التمرين 12.2

اكتب الحرف 'S' على الشاشة بدون استعمال أية قاطعة.


التمرين 12.3

اكتب الحرف 'L' بلون أخضر وقعر أصفر بدون وميض على الشاشة بدون استعمال أية قاطعة.


التمرين 12.4

اكتب الحرف 'L' بلون أخضر وقعر أصفر بوميض على الشاشة بدون استعمال أية قاطعة.


التمرين 12.5

اكتب اسم الجلالة 'ALLAH' بلون أخضر وقعر رمادي بوميض على الشاشة بدون استعمال أية قاطعة.


التمرين 12.6

ارسم نقيطة ذات اللون 220 ولإحداثيات (X=205  و Y=100) على الشاشة بدون استعمال أية قاطعة.


*التمرين 12.7

ارسم مستطيلا وسط الشاشة عن طريق تحديد نقطتي قطره فقط بدون استعمال أية قاطعة.


**التمرين 12.8

ارسم مستقيما (قطر الشاشة)  ذو اللون 220 من النقطة المتواجدة  في أعلى اليسار إلى النقطة المتواجدة في أسفل اليمين على الشاشة بدون استعمال أية قاطعة.