اعتذر عن التاخر الواضح في طرح هذا المقال حيث انشغلت مؤخرا بامور كثيرة جدا جدا نحن في غنى عن اضاعة الوقت لذكرها.
كنت اخطط ان اقوم اولا بالتحدث عن كيفية تعريف البيانات ضمن البرنامج لكن من خلال الامثلة التي سنتعامل معها من اليوم فصاعدا سنحاول توضيح كيفية تعريف البيانات وما هي اطوالها بحث نغطي هذه النقطة. اما بالنسبة لهذا المقال فقبل ان نبدا فيه يجب ان نتحدث عن بعض الامور كالمعاملات الفورية وانماط العنونة لان هذا الموضوع قد لا نستطيع التوسع في شرحه الى جانب شفرة برنامج ما وهو امر اساسي بالتالي يجب ان يذكر ويتم حفظه قبل البدء بكتابة اي برنامج.
المعاملات الفورية:
ما هي المعاملات الفورية؟ هي عبارة عن بيانات لا نقوم بتعريفها بشكل مسبق في بنية البرنامج وبالتحديد في مقطع البيانات .data وانما نقوم باستخدامها بشكل مباشر في البرنامج لغرض معين لا نحتاجها فيه لاحقا.
مثال على هذا النوع من المعاملات الشكل التالي في نقل احدى القيم الى احد المسجلات:
mov ax, 0123h
حيث يتم تحميل الثابت الفوري 123 الست عشري في المسجل AX؟ تمثل التعليمة السابقة بشفرة الهدف على النحو B8321, حيث B8 هي شفرة تعليمة MOV اما البايتان التاليان فيمثلان القيمة الفورية نفسها لكن بشكل معكوس والسبب موضح في مقالات سابقة.
اذن نلاحظ في حالة المعاملات الفورية اننا لسنا بحاجة الى تعريفها في مقطع المعطيات لاننا لا نحتاج الى استخدامها اكثر من مرة واحدة مثلا, اما في حال كنا بحاجة الى استخدامها بشكل مطترد فانه يفضل ان نقوم بتعريف هذه المعطيات في مقطع المعطيات بالشكل المناسب, كما في الحالة التالية:
immediate dw 0123h .... mov ax, immediate
طول المعاملات الفورية:
بشكل بديهي يجب الا يتجاوز طول المعاملات الفورية طول المعامل الهدفي destinition, اي لا يجوز لنا ان نقوم بمحاولة اسناد قيمة بطول 32بت الى مسجل بطول 16بت مثلا, وكما في مثالنا السابق, لا يجوز لنا ان نقوم بمحاولة اسناد القيمة 0123h الست عشرية الى مسجل AL لان الاخير بطول 8بت اي انه لن يتسع لاكثر من رقمين ست عشريين.
هذا الامر بالطبع معاكس في حال اردنا ان نسند قيمة بطول اقصر من طول المعامل الهدف اليه, اي انه يمكننا ان نقوم بمحاولة اسناد قيمة بطول 8بت الى مسجل بطول 16بت مثلا دون الحاجة الى القلق من ظهور اي خطا.
انماط العنونة:
العنونة باستخدام المسجلات:
تعتبر معالجة المعطيات بين المسجلات اسرع انواع المعالجة لعدم استخدام الذاكرة, وفيما يلي امثلة على هذا النمط من العنونة:
mov cl, ah add ax, bx
العنونة الفورية Immediate Addressing:
يحتوي المعامل الثاني (المعامل المصدري source operand) قيمة ثابتة في نمط العنونة الفورية, في حين يحتوي المعامل الاول (الهدفي destinition operand) على احد المسجلات او مواقع الذاكرة, وفيما يلي بعض الامثلة:
save db ? .... add cx, 12 mov save, 25 mov bx, OFFSET save
حيث تقوم التعليمة الاخيرة بتهيئة عنوان الازاحة الخاص بعنصر المعطيات save في المسجل bx تحضيرا لاستخدامه فيما بعد, وكما هو معروف فان رقم الازاحة يدل على عنوان التعليمة المطلوبة ابتداء من عنوان مقطع الشفرة code section وبالتالي لنصل اليها فيما بعد يكفي ان نقوم بتحميل عنوان مقطع الشفرة في احد المسجلات وليكن SI ونقوم باستخدام الشكل [sI+BX] مثلا.. سيتم توضيحها فيما يلي تحت العنونة الدليلية.
العنونة المباشرة للذاكرة Direct Memory Addressing:
ينشا هذا النمط من العنونة باستخدام احد المعاملين لموقع ذاكرة واستخدام الاخر لاحد المسجلات, امثلة:
word1 dw 0 byte1 db 0 .... mov ax, word1 add byte1, cl
العنونة الدليلية Indexed Addressing:
تعتبر العنونة الدليلية تقنية اكثر تعقيدا توفر امكانية اكبر في القدرة على العنونة باستخدام قيمة مسجل المقطع وقيمة الازاحة. يستخدم المعالجان 86 و 286 لهذا الغرض المسجلات BX, SI, DI, BP على ان توضع اسماؤها ضمن قوسين مربعين تمييزا لعملية العنونة الدليلية.
ترتبط المسجلات BX, DI, SI مع مسجل مقطع المعطيات DS, في حين يرتبط المسجل BP مع مسجل مقطع المكدس SS.
يمكن ان يحتوي معامل التعليمة على عنوان دليلي وسيحتوي عندئذ المعامل الاخر على قيمة فورية او مسجل ما, ويقصد بالعنوان الدليلي عنوانا مثل [bX] الذي يخبر المجمع باستخدام عنوان ذاكرة توجد قيمته في المسجل BX.
تهيئ التعليمة MOV في المثال التالي المسجل BX بعنوان ازاحة عنصر المعطيات DATAFLD في حين تهيئ تعليمة MOV الثانية موقع الذاكرة المشار اليه DATAFLD بالقيمة 0 باستخدام عنوانه الدليلي الموجود في المسجل BX:
DATAFLD db ? .... mov bx, OFFSET DATAFLD mov [bx], 0
وعمليا فان التعليمتين السابقتين لهما نفس تاثير التعليمة MOV DATAFLD, 0.
يسمح هذا النمط من العنونة بربط مجموعة من المسجلات لتشكيل عنوان دليلي, وهذا ما يجعل النمط الدليلي في العنونة مفيدا كثيرا كما في المثالين التاليين:
[BX+SI]; تمثل عنوانا يساوي حاصل جمع قيم المسجلين SI و BX [BX+2]; تمثل عنوانا يساوي حاصل جمع قيمة المسجل BX مع الرقم 2
العنونة الدليلية في المعالجين 486/386:
يسمح المعالجان 486/386 بتوليد عنوان دليلي ينشا عن اجتماع احد المسجلات العامة على الاقل مع قيمة ازاحة وعامل مقياس scaling factor (وهو احد القيم 1, 2, 3, 4) فالتعليمة التالية على سبيل المثال:
mov ebx, [ecx*2+esp+4]
تنقل محتويات العنوان المشار اليه بقية ECX المضروبة بالعدد 2 والمضاف اليها القيمة المخزنة في المسجل ESP مضافا اليه الرقم 4.
سنتابع بعد قليل
