السلام عليكم,
لقد انتضرت شيئا من الوقت ودلك لأني كنت أنتضر حتى يحصل على الراغبين جمع الأدوات اللازمة والمعرفة المبدئية قبل أن نبدأ في سلسلتنا والتي أتمنى لها أن تطول وهدا طبعا يتوقف على رغبتكم . فحين نرى أن ليس من يهتم بموضوع ما فنتيجته ستكون النسيان طبعا.
سنستعمل كما سبق الدكر Masm لبناء برامجنا وسأرفق الملفات اللازمة لدلك للدين لا يتوفروا عليها.
وعند برمجة الدوس فلا مفر لنا من استعمال Interruptions وخاصة الرقم 21 هيكس. ويمكن أن نعتبر Interruption كواجهة تمكننا من التواصل مع نضام التشغيل وأضن أن الكل حصل على هده النسخة المرفقة في أدوات الأسمبلر.
في بداية البداية سنتعلم طريقة كتابة برنامج ما وكيف نبني برنامجنا لنحصل على ملف exe .
على العموم هيكل أي برنامج سيكون كما يلي :
.MODEL SMALL
.data
نعلن هنا عن المعطيات ومختلف المتغيرات
وهناك نوع آخر من الداتا نتكلم عنه مستقبلا
.code
هنا بداية الكود
Start :
هنا سيبدأ البرنامج أو ما يسمى بنقطة البداية للبرنامج
وهدا نعتبره مثل main في برامج س أو س++
end Start
ننهي حلقة Start وللدكر لسنا ملزمين بتسميتها Start
يمكن أن نسميها أي شيء ولكن يجب أن يكون الإسم الأول والثاني متشابهان
End
هنا نعلن عن نهاية البرنامج
هدا سيكون الهيكل الأساسي لمعضم برامجنا ولا نزيد فيه إلا الكود الخاص ببرنامج ما.
والآن كيف نبني البرنامج.
سنستعمل Notepad لكتابة برنامجنا ونسجله على شكل ملف asm. ونضعه في مجلد يحنوي على الملفات اللازمة لدلك والمرفقة هنا أو أي طريقة أخرى تمكننا من إجراء العملية التالية في نافدة دوس:
ml test.asm
ml ضمن الملفات المرفقة فهو سيعمل Compile و Link للبرنامج في آن واحد أو يمكن أن نستعمل :
Masm test.exe
هدا سيخلق لنا ملف TEST.OBJ
ونقوم من بعد ب link test.obj ليعطينا البرنامج الأخير.
هدا طبعا إدا لم تكن هناك أخطاء ونفترض أننا سمينا ملفنا test.asm
أضن أن الكل اطلع على بعض القراءات ولا أريد أن أرجع إلى الإعادة إلا إدا كانت هناك أسئلة ما وكملخص أقول :
في الأسمبلر سنتعامل مع مختلف الرجسترات وهي من نوع 32 بايت لكن في الدوس سنستعمل إلا جزء 16 أو 8 بايت منها لأن الدوس يعمل على 16 بايت ونعلن أن داكرة الدوس مقسمة إلى segments و offsets وكدلك الرجسترات منها ما يدل على segments مثل :
CS Code Segment
DS Data Segment
SS Stack Segment
والرجسترات الأخرى مثل ax bx وغيرها وهده من نوع 16 بايت وكل واحد يمكن تقسيمه إلى جزءين من نوع 8 بايت.مثلا يمكن أن نقسم ax إلى ah و al وكلاهما من 8 بايت .al سيدل على الثمانية بايت الأولى من 0 إلى 7 والآخر ما تبقى من الثمانية الباقين.وأنصح أن نقرا عن هدا فكثيرا من المناهج تتكلم عنها وإدا كان فيه سؤال نطرحه هنا.
ولكي لا نطول الكلام وندخل التطبيق سنبدأ بأول برنامج وهدا لا يفعل شيء فبمجرد أن يبدأ سينتهي وهدا سيعلمنا كيف نخرج من برنامجنا وهو مهم جدا مع العلم أن Masm فيه ماكويات تعمل هدا ولكن نفضل أن ننجزها بأنفسنا على الأقل في الأول حتى نتعلمها.
وهنا ستبدأ اهمية لائحة Interruption وإدا اطلعنا عليها سنعرف أنه لهدا الغرض يمكن أن نستعمل Interruption 21 هيكس والدالة 4c هيكس دائما وعلما أن كل Interruption لها خصائصها فكل واحدة تتطلب Parameters مختلفة حسب العمل التي ستقوم به وتعطينا نتائج مختافة ودلك دائما حسب مهمتها. زكل هده المعطيات تكون في الرجسترات والنتائج أيضا وكما تختلف أنواع الرجسترات المستعملة حسب رقم Interruption والدالة المستعملة وكل هده المعطيات موجودة في اللائحة أو في أي منهج ل Interruptions.
وفيما يتعلق بانتهاء البرنامج قلنا سنستعمل الدالة 4c وهي لا تتطلب أشياء كثيرة فقط أن نضع رقم الدالة في ah register وبعد هدا نستدعي interruption رقم 21.
وهنا سنستعمل أول تعليمة في الأسمبلر وهي تعليمة mov وهي لها استعمالات مختلفة وتكتب كما يلي:
Mov x,y وما تقوم به هي وضع y في x فقد تكون x أو y رجسترات أم معطيات أو غير دلك وسنتطرق إلى مختلف الإستعمالات حين نستعملها.وفي مثالنا نريد أن نضع القيمة 4c هيكس في ah لدى سنقوم بما يلي:
Mov ah,4ch وهنا زدنا h في آخر 4c لنقول للكمبايلر أن الرقم هو بالهيكس.
وبعد هده التعليمة ستصبح قيمة ah هي 4c .وبعد هدا نستدعي Interruption رقم 21 هيكس ولهدا الغرض نستعمل التعليمة التالية :
Int 21h يجب وضع h ضروري فلو نسيناها سيتم استدعاء 21 عشاري وهدا قد يعطينا أي شيء وربما وقف البرنامج والتعليمة int تستعل لاستدعاء أي Interruption والبرنامج الكامل سيكون كما يلي:
.MODEL SMALL .code Start: **********************; mov ah,4ch int 21h **********************; end Start End
والملاحض هنا أننا لم نكتب .data في الأول والسبب أننا لسنا محتاجين إلى معطيات وكما يمكن أن نكتب أي تعليق في البرنامج والتعليق تسبقه ; .
نبني البرنامج باستعمال ml ولا يهمنا الإندار المتعلق بالستاك الآن.وإدا تم الكل كما يرام سنحصل على برنامج exe وحين نشغله طبعا لا يفعل شيئا بالخصوص بل ستضهر النافدة السوداء للدوس تم تختفي.
وهنا سنزيد في مثالنا أننا سنكتب حرفا على الشاشة وهنا سنستعمل دائما interruption 21 ولكن هده المرة الدالة رقم 2 وحين نتطلع علينا نجد أنه يلزمها أن تكون في ah رقم الدالة وفي رجستر dl رقم الحرف الدي نريد إضهاره وهدا كما سبق سنكتبه كما يلي.
نريد أن نضهر حرف A وقيمته أسكي هي 41 هيكس إدن سنبرمج ما يلي :
Mov ah,2 في ah نضع رقم الدالة
Mov dl,41h نضع في dl رقم الحرف و Masm يمكننا من استعمال mov dl,’A’ في عوض رقم الحرف نضع الرف نفسه بين الشرطتين علما أن المبايلر سيحوله دائما إلى الرقم.
Int 21h استدعاء interruption كما سبق.
والبرنامج كله سيكون كما يلي وهنا أيضا لا نحتاج data
.MODEL SMALL .code Start: ;********************** mov ah,2 mov dl,41h int 21h ;********************** mov ah,4ch int 21h ;********************** end Start End
وبالفعل نضيف الكود السابق لكي ينتهي برنامجنا نهاية مريحة.وبعد هدا نبني برنامجنا ونتمنى أن لا نكون كتبنا شيئا ما غلط.
هدا سيكون البداية وأتمنى أن أشاهد آراءكم واقتراحاتكم لأن هده الأخيرة هي التي ستدفع بهده السلسلة إلى الأمام.
تمرين:
حاولوا كتابة حرفين يكونا في بداية السطر واحد تحت الآخر وسوف نستعمل فقط ما رأيناه سابقا والمرجو من يصل إلى هدا يعطي النتيجة هنا ونناقشها.
أتمنى أن يكون هدا المقال مفهوما وفي متناول الجميع وإلى الحصة القادمة إن شاء الله.
أتمنى لكم التوفيق وإلى اللقاء.
وهده هي ملفات masm :