heroking2005
17-01-2006, 08:15 PM
ان شاء الله سنتناول في هذا الموضوع كيفية كتابة وتجهيز وتشغيل برنامج لغة التجميع وبنهاية الدرس سنستطيع ان نكتب برنامج لغة تجميع وان نقوم بتشغيله ورؤية النتيجة.
طبعا كأي لغة سنبدأ بتوضيح الصيغة العامـة للأوامـر وهي صيغة بسيطة جـدا بعدهــا سنوضح طريقة تعريف المتغيرات داخـل البرنامـج وبعدهـا نستعـرض بعـض اوامـر نقـل البينات واوامــر العمليـات الحسابيـة البسيطـة وفي النهايـة سنستعـرض الشكل العــام للبرنامــج.
يتم تحويل برنامج لغة التجميع للغة الالة بواسطة برنامــج يسمى Assembler وبالتالـي يجـب علينا كتابـة التعليمـات بصورة محـددة حتى يتعرف عليهـا الـ Assembler عمومـا نتعـرف الان على الشكل العـام للاوامــر المستخدمــة .
يتكون البرنامج من مجموعة من التعليمات او الاوامر بحيث يحتوي كل سطـر على امــر واحد فقط كما ان هناك نوعين من التعليمات .
الاوامر او التعليمات والتي يقوم الـ Assembler بتحويلها الى لغة الالة .
والايعــازات Assembler - Directives وهي ايعازات للاسمبلـر للقيـام ببعـض العمليــات المحـددة مثل تخصيص جـزء من الذاكـرة لمتغير محـدد . عمومـا كـل الاوامــر في لغــة التجميــع تأخـــذ الصــورة :
كود:
NAME: OPERATION operands COMMENT
. يتـم الفصــــل بين الحقـــول بواسطــة مفتــاح TAB او المسطــرة اي يكـــون هنـاك فــراغ واحـد على الاقـل بين كـل حـقل والحـقل التـالي.
. يتم استخدام الاسم NAME ويطلق عليه معـرف السطـر في حـالة حـدوث عمليـة تفريـع لهذا الامر ( لهـذا السطـر من االبرنامـج ) في جـزء ما من البرنامـج وهو حقـل اختيـاري .
.الحقل OPERATION يحتوي على الامر المطلوب تنفيذه .
.الحـقل OPERANDS يحتـوي على المعـامل او المعامـلات المطلـوب تنفيذهـا بواسطـة الامـر المحــدد ويعتمـــد علـى نــوع الامـــر . بعـــض التعليمــات تتطلـــب وجــود حــقل واحـــد والبعـض الاخـــر يتطلـــب وجــــود حــقلين وهنــاك بعــض الاوامــر لا تتـطلـــب وجــود هـــذا الحـــقل .
.حــــقل الملحوظــــات الـ COMMENT يستخــدم عــادة للتعليـــق علـى الامـر الحـالي وهــو يستخـــدم لتوثيـــق البرنامـــــج.
ملاحظـــات عـــلى حقـــل العنــــوان Name Field
===================================
يتم استخــدام هـــذا الحقــل لاعطــاء عنــوان لامــر محــدد او لاعطــاء اســم لبرنامــج فرعـــي كــذلك لاعــــلان أسمــــاء المتغيـــرات ، يتــم تحويـــل هـــذا الحقـــل الــى عناويـن فــي الذاكــرة . يمكــن ان يكــون هــذا الحقــل بطــول حتى 31 حـرف وغيـر مسمــوح وجــود مسافــات بداخــل الحقــل كــذلك لا يستخــدم الحــرف "."الا فـــي بــداية الاســم ولا يبــدأ برقـم ولا يتم التفريــق بين الحــروف الكبيرة والصـغيرة فـيه .
===========================
=البيانات المستخدمة في البرنامج : =
===========================
يقوم البرنامــج بالتعامــل مع البيانــات في صــورة ارقــام ثنائية وفـي برنامـج لغــة التجميــع يتـم التعامــل مع الارقــام في الصــورة الثنائـيـة او السداسيــة او العشريــة او حتى في صـــورة حـــروف.
اما انــواع البيانــات فهى كالتالــي :
الاعـــــــداد - الحـــــــروف-المتغيــــرات-المتغــيرات الحرفيـــــــة- متغــيرات الجمـــــل-الثوابــــت-المصفوفـــــات - الرســــــائل والنصــــــوص.
الاعـــــــــــــــــــــداد
================
يتـــم كتـابـــة الأرقـــام الثنائيـــة فــي صـــــورة 1 و 0 وتنتهـــي بالحــــرف B او b لـلدلالــة علـــى ان الرقــــم ثنائـــي Binary مثــــل 01010111B.
الارقـــام العشـــرية يتـــم كتابتهــا فـــــي الصـــورة المعتـــادة ، كمـــا يمكـــن ان تنتهــــي بالحـــرف D دلالــة علــــى أنهـــا عشريــــة .
الارقــــام السداسيــة عشـــر يجــــب ان تبـــدأ برقـــــم وتنتهـــي بالحــــرف H او h لـلدلالـــة عـــلى أنهــا سداسيــة عشـــر Hexadecimal مثـــــل 0abh او 56H .
( الســبب فــي استعمـــال 0 فــي المثـــال الاول لتوضيــــح أن المطلـــوب هــو الرقم السداســـي عشـــر ab وليــس المتغيــر المسمــى ab )
مثال 10011 رقم عشري 10011b رقم ثنائي
الحــــــــــــــــــروف
===============
يتـــم وضـــع الحــــروف والجمــــل داخــــل علامـــات التنصيـص مثـل "A" او "ARAB" ويتــم داخليــا تحويـــل الحـــروف الــى الارقـــام المناظــــرة فـــي كـــود الـــ ASCII وبالتالــي تخزينهــا فـــي الذاكــــرة وعلـــى ذلك لا يوجـــد فــــرق بين الحــرف "A" والرقــــم 41h داخــــل البرنامــــج او من ناحيــــة التخزيــن فـــي الذاكــــرة ( 41hهو الرقــــم المناظــــر للحـــرف A فـي الجـــــدول ) .
المتغيـــــــــــــــــــرات
================
المتغيـرات ومــا أدراك مـا المتغيــرات . المتغيــرات تلعـــب في لغــة التجميـــع نفـــس الـــدور الـذي تلعبـــه فـــي البرامـــج باللغـــات ذات المستـــوى العــــالي مثــل لغـة البسكـــال والســـي . وعـــلى ذلك يجـــب تحديـــد اسمـــاء المتغيــرات المستخدمـــة فـــي البرنامـــج ونـــوع كــل متغــير حيـــث سيـتم حجـــز مكــــان فـــي الذاكــــرة لكـــل متغـــير وبطـــــول يتناســــب مــــع نــــوع المتغــــير وذلك بمجــــرد تعـــريف المتغـــير .
ايعـــــــــــازات المتغيرات
===================
DB == لتعــريف متغيــر حرفــي يشغـل خانـة واحـدة بمقـدار بايت واحـد في الذاكرة .
Byte ==لتعـريف متغيــر حرفــي يشغـل خانـة واحـدة فـي الذاكــــرة او المتغيـــــرات العدديــــة الموجبـــــة والتـي لا تزيـــد قيمتهـــا عن 255 وحجــم المكـان بايــت واحـد .
Sbyte ==لتعريف متغير عددي موجب او سالب والتي لا تزيد قيمتها عن 128 +- وحجم المكان بايت واحد .
DW لتعريف متغير كلمة يشغل خانتين متتاليتين في الذاكرة وحجم المكان 2 بايت .
Word لتعريف متغير كلمة يشغل خانتين متتاليتين في الذاكرة أو المتغيرات العددية الموجبة والتي لا تزيد عن 65000وحجم المكان 2 بايت .
ايضـــا يوجــــد Sword و DD و Dword و SDWord و DQ و DT ولا يوجـــــد اختــلاف بينهـم وبيـــن ما سبــــق ذكـــرة فقــــط حجــــم المكـــان مثــــلا المتغيــر مــن النـوع DT يحجـــز مكـــان في الذاكــرة يســاوي 10 خانـــات متتاليـــة .
اكتفــي بالحديــث عـــن الاعـــداد والحـــروف والمتغيـــرات امــا باقـــي انـــــــواع البيــــانات إن شــــاء اللــه عنـــد الحاجـــة اليهــــا ســــــوف اقــــــوم بشرحهــــا .
(أعتــذر الموضــوع طويــل بعـــــض الشـــئ عمـــومـا اذا كـــان يوجـــد شـئ غامـض فـــي الموضــوع اتمنـى منكم ذكـره كمــا اتمنــى ان تكــــون الاسئلــة فــي حــــدود الموضــــــوع واتمنــــى ان لا نتطــــرق الــى مواضيـــع متقدمـــــة حـــــاليـا الـــى ان انتهــــي مـــن الاساسيــــات حتـــى لا يجــــد بعــــض منـا صعــــوبة فــي المتابعـــة)
الأمر الأساسية في لغة التجميع
======================
سنتعـــرف علـىبعـــض الاوامـــر الاساسيــة وكيفيـــة استخـدامهـا والقيـود علــى استخـدامهــا وسنفتــرض ان لدينـا متغيـرات حرفيـه باسـم Byte1 و Byte2 ومتغيــرات كلمــــة باســـم Word1 و word2 .
1- الامــــــر MOV
يستخــــدم الامـــر MOV في نقـــل البيانـــات مـــن مكـــان لاخـــر وهـــذه الاماكـــن هـــي المسجــــلات العامـــة او المسجـــلات الخاصـــة او المتغيـــرات فــي الذاكــــرة او حتـى فـي نقـــل ( وضــع ) قيمــــة ثابتـــة فــي مكــان محـــدد مــن الذاكـــرة او علــى مسجـــــــــل والصــــــورة العامـــــة للامــــر هـــي :
كود:
MOV Destination , Source
حيــث يتـــم نقـــــل محتويــــات المصــدر Source الــى المستــــودع Destination ولا تتأثــــر قيمــــة المصــــدر بعــــد تنفيــــذ الامــــر مثــال علـى ذلك :
كود:
MOV AX , Word1
حيــث يتــم نســـخ محتويــات ( قيمـــة ) المتغيـــر Word1 الـى المسجـــل AX وبالطبع يتـم فقــد القيمـــة الأوليـــة للمسجـــل AX بعـــد تنفيـــذ الامــــر .
كود:
MOV AL , 'A'
يقـــوم بوضــع الرقـــم 041h في المسجـــل AL .
لكــن مــا هــي قيــود استخـــدام الامـــر MOV
هنـــاك بعـــض الحـــالات التـي لا يصـــح استخــدام الامـــر اذا مــا كــان المصـــــدر والمستــــودع غيــر مسمـــوح النســــخ بينهمــــا.
اذا مــــا كــان المصـــدر مــن النـــــوع :
مسجـــــل عــــام
=============
والمستـــــودع مـــن النـــوع
=====================
مسجـــــــل عام (#) مسموح .
مسجــــل مقطع (#) مسموح .
متغيـــــــــــــــر (#) مسموح .
ثابــــــــــــــــت (#) مسموح .
مسجـــــل مقطع
============
والمستـــــــودع مـــن النــوع
======================
مسجـــــــــل عام (#) مسموح .
مسجـــــــل مقطع (x) غير مسموح .
متغيــــــــــــــــــر (#) مسموح .
ثابــــــــــــــــــــت (x) غير مسموح .
متغيــــــــــــــر
============
والمستــــــــودع مــن النـــوع
=======================
مسجـــــــــــل عام (#) مسموح .
مسجـــــــل مقطع (#) مسموح .
متغيـــــــــــــــر (x) غير مسموح .
ثابـــــــــــــــــت (x) غير مسموح .
ثابــــــــــــت
==========
والمستـــــــــودع مــن النــــوع
=======================
مسجــــــــــل عام (#) مسموح .
مسجـــــــل مقطع (x) غير مسموح .
متغيــــــــــــــــــر (#) مسموح .
ثابـــــــــــــــــــت (x) غير مسموح .
مثــــلا اذا كـــان المصـــــدر مـــن النــــوع متغيــــر والمستـــودع مـــن النــــوع ثابــت فـــــي هـــذه الحالـــة لا يصـــح استخــــدام الامــــر MOV
ولابــــد ان نراعـــي ذلك جيـــدا لاننـــا ســـوف نستخـــدم الامــــر MOV كثيـــرا وللعلــم ان اي برنامــج لـن يخلـو مــن هــذا الامــر .
ايضــــا لابـــد ان نراعـــي حجــم كـــل بيــان فـي عمليــة النســخ او النقـــل
يعنــي هــذا ان عنــد التعامـــل مــع البيانــات يتطلــب الامــر ان تكـــون متوافقــة في الحجـــم ويمكـــن التعامـــل مــع البيانــات ذات المساحــة التخزينيــة المختلفــة عن طريـــق الارشـــاد PTR فمثــلا يمكــن نقـل البايـت الاول مـن متغيــر يعــرف بكلمة ووضعــه فـي متغيــر اخـر معــرف ببايـت .
كود:
MOV AX , WORD PTR num[0]
MOV DX , WORD PTR num[2]
مــن المعلــوم ان التعليمــة MOV لا تسمــح بالتعامـــل مــع موقعيــن فـي الذاكــــرة فــي امــر واحـــد ولكـــن يمكــن تفـــادي هــذا القيــد باستخــدام مسجــل وسيــــط كمــــا يلـــي :
كود:
MOV AX , WORD2
MOV WORD1 , AX
ايضــا لا تسمــح التعليمــة بالتعامـــل مــع موقعيــن فــي الذاكــرة او مسجليــن ليسا لهـم نفـس الحجــم يعنــي ان الجملــة التاليــة غيــر صحيحــة .
كود:
MOV AX , BL
لكــن يمكــن تفــادي هــذا القيــد باستخــدام مجمــوعة مــن التعليمـــات التاليــة :
CBW تحويل القيمة الموجـودة فـي المسجـل AL الـى كلمـة تخـزن في المسجل AX .
CWD تحويــل القيمــة الموجــودة فــي المسجــل AX الــى كلمتيــن يتـم تخزينهـا فــي المسجــلات DX:AX فــي حالــة المعالــج 8086 .
CEDE تحــويل القيمــة الموجــودة فــي المسجـل AX الـى كلمتيـن يتـم تخزينهمـــا فـي المسجــل EAX فــي حالة 86380 .
ادرس الامثلــة التاليــة ولاحــظ كلهــا امثلــة للتعليمــة MOV حــاول تحــديد العبــارات الصحيحـــة منهــا :
كود:
mov word_1 , word_2
mov ds , 1000h
mov ip , ax
mov al , bx
mov word_1, al
mov 1000h , ax
mov byte_1 , ax
اعذرونـــي للاطالــة كــان بإمكانــي الدخـــول الــى الاوامــر مباشــرة لكننــي لا افضــل هــذا الاسلــوب وعلــى مــاأعتقــد تفسيـر الامــر شــئ جميــل يزيــل بعــض الغمــوض عــن اللغــة ويجعلهــا نوعــا ما بسيطـة .
نلتقــي فـــي المشاركــة القادمـــة ان شــاء اللــه
مع احترامي (أخوكم)
heroking
--...فى انتظار الردود....isa والوعود.....
طبعا كأي لغة سنبدأ بتوضيح الصيغة العامـة للأوامـر وهي صيغة بسيطة جـدا بعدهــا سنوضح طريقة تعريف المتغيرات داخـل البرنامـج وبعدهـا نستعـرض بعـض اوامـر نقـل البينات واوامــر العمليـات الحسابيـة البسيطـة وفي النهايـة سنستعـرض الشكل العــام للبرنامــج.
يتم تحويل برنامج لغة التجميع للغة الالة بواسطة برنامــج يسمى Assembler وبالتالـي يجـب علينا كتابـة التعليمـات بصورة محـددة حتى يتعرف عليهـا الـ Assembler عمومـا نتعـرف الان على الشكل العـام للاوامــر المستخدمــة .
يتكون البرنامج من مجموعة من التعليمات او الاوامر بحيث يحتوي كل سطـر على امــر واحد فقط كما ان هناك نوعين من التعليمات .
الاوامر او التعليمات والتي يقوم الـ Assembler بتحويلها الى لغة الالة .
والايعــازات Assembler - Directives وهي ايعازات للاسمبلـر للقيـام ببعـض العمليــات المحـددة مثل تخصيص جـزء من الذاكـرة لمتغير محـدد . عمومـا كـل الاوامــر في لغــة التجميــع تأخـــذ الصــورة :
كود:
NAME: OPERATION operands COMMENT
. يتـم الفصــــل بين الحقـــول بواسطــة مفتــاح TAB او المسطــرة اي يكـــون هنـاك فــراغ واحـد على الاقـل بين كـل حـقل والحـقل التـالي.
. يتم استخدام الاسم NAME ويطلق عليه معـرف السطـر في حـالة حـدوث عمليـة تفريـع لهذا الامر ( لهـذا السطـر من االبرنامـج ) في جـزء ما من البرنامـج وهو حقـل اختيـاري .
.الحقل OPERATION يحتوي على الامر المطلوب تنفيذه .
.الحـقل OPERANDS يحتـوي على المعـامل او المعامـلات المطلـوب تنفيذهـا بواسطـة الامـر المحــدد ويعتمـــد علـى نــوع الامـــر . بعـــض التعليمــات تتطلـــب وجــود حــقل واحـــد والبعـض الاخـــر يتطلـــب وجــــود حــقلين وهنــاك بعــض الاوامــر لا تتـطلـــب وجــود هـــذا الحـــقل .
.حــــقل الملحوظــــات الـ COMMENT يستخــدم عــادة للتعليـــق علـى الامـر الحـالي وهــو يستخـــدم لتوثيـــق البرنامـــــج.
ملاحظـــات عـــلى حقـــل العنــــوان Name Field
===================================
يتم استخــدام هـــذا الحقــل لاعطــاء عنــوان لامــر محــدد او لاعطــاء اســم لبرنامــج فرعـــي كــذلك لاعــــلان أسمــــاء المتغيـــرات ، يتــم تحويـــل هـــذا الحقـــل الــى عناويـن فــي الذاكــرة . يمكــن ان يكــون هــذا الحقــل بطــول حتى 31 حـرف وغيـر مسمــوح وجــود مسافــات بداخــل الحقــل كــذلك لا يستخــدم الحــرف "."الا فـــي بــداية الاســم ولا يبــدأ برقـم ولا يتم التفريــق بين الحــروف الكبيرة والصـغيرة فـيه .
===========================
=البيانات المستخدمة في البرنامج : =
===========================
يقوم البرنامــج بالتعامــل مع البيانــات في صــورة ارقــام ثنائية وفـي برنامـج لغــة التجميــع يتـم التعامــل مع الارقــام في الصــورة الثنائـيـة او السداسيــة او العشريــة او حتى في صـــورة حـــروف.
اما انــواع البيانــات فهى كالتالــي :
الاعـــــــداد - الحـــــــروف-المتغيــــرات-المتغــيرات الحرفيـــــــة- متغــيرات الجمـــــل-الثوابــــت-المصفوفـــــات - الرســــــائل والنصــــــوص.
الاعـــــــــــــــــــــداد
================
يتـــم كتـابـــة الأرقـــام الثنائيـــة فــي صـــــورة 1 و 0 وتنتهـــي بالحــــرف B او b لـلدلالــة علـــى ان الرقــــم ثنائـــي Binary مثــــل 01010111B.
الارقـــام العشـــرية يتـــم كتابتهــا فـــــي الصـــورة المعتـــادة ، كمـــا يمكـــن ان تنتهــــي بالحـــرف D دلالــة علــــى أنهـــا عشريــــة .
الارقــــام السداسيــة عشـــر يجــــب ان تبـــدأ برقـــــم وتنتهـــي بالحــــرف H او h لـلدلالـــة عـــلى أنهــا سداسيــة عشـــر Hexadecimal مثـــــل 0abh او 56H .
( الســبب فــي استعمـــال 0 فــي المثـــال الاول لتوضيــــح أن المطلـــوب هــو الرقم السداســـي عشـــر ab وليــس المتغيــر المسمــى ab )
مثال 10011 رقم عشري 10011b رقم ثنائي
الحــــــــــــــــــروف
===============
يتـــم وضـــع الحــــروف والجمــــل داخــــل علامـــات التنصيـص مثـل "A" او "ARAB" ويتــم داخليــا تحويـــل الحـــروف الــى الارقـــام المناظــــرة فـــي كـــود الـــ ASCII وبالتالــي تخزينهــا فـــي الذاكــــرة وعلـــى ذلك لا يوجـــد فــــرق بين الحــرف "A" والرقــــم 41h داخــــل البرنامــــج او من ناحيــــة التخزيــن فـــي الذاكــــرة ( 41hهو الرقــــم المناظــــر للحـــرف A فـي الجـــــدول ) .
المتغيـــــــــــــــــــرات
================
المتغيـرات ومــا أدراك مـا المتغيــرات . المتغيــرات تلعـــب في لغــة التجميـــع نفـــس الـــدور الـذي تلعبـــه فـــي البرامـــج باللغـــات ذات المستـــوى العــــالي مثــل لغـة البسكـــال والســـي . وعـــلى ذلك يجـــب تحديـــد اسمـــاء المتغيــرات المستخدمـــة فـــي البرنامـــج ونـــوع كــل متغــير حيـــث سيـتم حجـــز مكــــان فـــي الذاكــــرة لكـــل متغـــير وبطـــــول يتناســــب مــــع نــــوع المتغــــير وذلك بمجــــرد تعـــريف المتغـــير .
ايعـــــــــــازات المتغيرات
===================
DB == لتعــريف متغيــر حرفــي يشغـل خانـة واحـدة بمقـدار بايت واحـد في الذاكرة .
Byte ==لتعـريف متغيــر حرفــي يشغـل خانـة واحـدة فـي الذاكــــرة او المتغيـــــرات العدديــــة الموجبـــــة والتـي لا تزيـــد قيمتهـــا عن 255 وحجــم المكـان بايــت واحـد .
Sbyte ==لتعريف متغير عددي موجب او سالب والتي لا تزيد قيمتها عن 128 +- وحجم المكان بايت واحد .
DW لتعريف متغير كلمة يشغل خانتين متتاليتين في الذاكرة وحجم المكان 2 بايت .
Word لتعريف متغير كلمة يشغل خانتين متتاليتين في الذاكرة أو المتغيرات العددية الموجبة والتي لا تزيد عن 65000وحجم المكان 2 بايت .
ايضـــا يوجــــد Sword و DD و Dword و SDWord و DQ و DT ولا يوجـــــد اختــلاف بينهـم وبيـــن ما سبــــق ذكـــرة فقــــط حجــــم المكـــان مثــــلا المتغيــر مــن النـوع DT يحجـــز مكـــان في الذاكــرة يســاوي 10 خانـــات متتاليـــة .
اكتفــي بالحديــث عـــن الاعـــداد والحـــروف والمتغيـــرات امــا باقـــي انـــــــواع البيــــانات إن شــــاء اللــه عنـــد الحاجـــة اليهــــا ســــــوف اقــــــوم بشرحهــــا .
(أعتــذر الموضــوع طويــل بعـــــض الشـــئ عمـــومـا اذا كـــان يوجـــد شـئ غامـض فـــي الموضــوع اتمنـى منكم ذكـره كمــا اتمنــى ان تكــــون الاسئلــة فــي حــــدود الموضــــــوع واتمنــــى ان لا نتطــــرق الــى مواضيـــع متقدمـــــة حـــــاليـا الـــى ان انتهــــي مـــن الاساسيــــات حتـــى لا يجــــد بعــــض منـا صعــــوبة فــي المتابعـــة)
الأمر الأساسية في لغة التجميع
======================
سنتعـــرف علـىبعـــض الاوامـــر الاساسيــة وكيفيـــة استخـدامهـا والقيـود علــى استخـدامهــا وسنفتــرض ان لدينـا متغيـرات حرفيـه باسـم Byte1 و Byte2 ومتغيــرات كلمــــة باســـم Word1 و word2 .
1- الامــــــر MOV
يستخــــدم الامـــر MOV في نقـــل البيانـــات مـــن مكـــان لاخـــر وهـــذه الاماكـــن هـــي المسجــــلات العامـــة او المسجـــلات الخاصـــة او المتغيـــرات فــي الذاكــــرة او حتـى فـي نقـــل ( وضــع ) قيمــــة ثابتـــة فــي مكــان محـــدد مــن الذاكـــرة او علــى مسجـــــــــل والصــــــورة العامـــــة للامــــر هـــي :
كود:
MOV Destination , Source
حيــث يتـــم نقـــــل محتويــــات المصــدر Source الــى المستــــودع Destination ولا تتأثــــر قيمــــة المصــــدر بعــــد تنفيــــذ الامــــر مثــال علـى ذلك :
كود:
MOV AX , Word1
حيــث يتــم نســـخ محتويــات ( قيمـــة ) المتغيـــر Word1 الـى المسجـــل AX وبالطبع يتـم فقــد القيمـــة الأوليـــة للمسجـــل AX بعـــد تنفيـــذ الامــــر .
كود:
MOV AL , 'A'
يقـــوم بوضــع الرقـــم 041h في المسجـــل AL .
لكــن مــا هــي قيــود استخـــدام الامـــر MOV
هنـــاك بعـــض الحـــالات التـي لا يصـــح استخــدام الامـــر اذا مــا كــان المصـــــدر والمستــــودع غيــر مسمـــوح النســــخ بينهمــــا.
اذا مــــا كــان المصـــدر مــن النـــــوع :
مسجـــــل عــــام
=============
والمستـــــودع مـــن النـــوع
=====================
مسجـــــــل عام (#) مسموح .
مسجــــل مقطع (#) مسموح .
متغيـــــــــــــــر (#) مسموح .
ثابــــــــــــــــت (#) مسموح .
مسجـــــل مقطع
============
والمستـــــــودع مـــن النــوع
======================
مسجـــــــــل عام (#) مسموح .
مسجـــــــل مقطع (x) غير مسموح .
متغيــــــــــــــــــر (#) مسموح .
ثابــــــــــــــــــــت (x) غير مسموح .
متغيــــــــــــــر
============
والمستــــــــودع مــن النـــوع
=======================
مسجـــــــــــل عام (#) مسموح .
مسجـــــــل مقطع (#) مسموح .
متغيـــــــــــــــر (x) غير مسموح .
ثابـــــــــــــــــت (x) غير مسموح .
ثابــــــــــــت
==========
والمستـــــــــودع مــن النــــوع
=======================
مسجــــــــــل عام (#) مسموح .
مسجـــــــل مقطع (x) غير مسموح .
متغيــــــــــــــــــر (#) مسموح .
ثابـــــــــــــــــــت (x) غير مسموح .
مثــــلا اذا كـــان المصـــــدر مـــن النــــوع متغيــــر والمستـــودع مـــن النــــوع ثابــت فـــــي هـــذه الحالـــة لا يصـــح استخــــدام الامــــر MOV
ولابــــد ان نراعـــي ذلك جيـــدا لاننـــا ســـوف نستخـــدم الامــــر MOV كثيـــرا وللعلــم ان اي برنامــج لـن يخلـو مــن هــذا الامــر .
ايضــــا لابـــد ان نراعـــي حجــم كـــل بيــان فـي عمليــة النســخ او النقـــل
يعنــي هــذا ان عنــد التعامـــل مــع البيانــات يتطلــب الامــر ان تكـــون متوافقــة في الحجـــم ويمكـــن التعامـــل مــع البيانــات ذات المساحــة التخزينيــة المختلفــة عن طريـــق الارشـــاد PTR فمثــلا يمكــن نقـل البايـت الاول مـن متغيــر يعــرف بكلمة ووضعــه فـي متغيــر اخـر معــرف ببايـت .
كود:
MOV AX , WORD PTR num[0]
MOV DX , WORD PTR num[2]
مــن المعلــوم ان التعليمــة MOV لا تسمــح بالتعامـــل مــع موقعيــن فـي الذاكــــرة فــي امــر واحـــد ولكـــن يمكــن تفـــادي هــذا القيــد باستخــدام مسجــل وسيــــط كمــــا يلـــي :
كود:
MOV AX , WORD2
MOV WORD1 , AX
ايضــا لا تسمــح التعليمــة بالتعامـــل مــع موقعيــن فــي الذاكــرة او مسجليــن ليسا لهـم نفـس الحجــم يعنــي ان الجملــة التاليــة غيــر صحيحــة .
كود:
MOV AX , BL
لكــن يمكــن تفــادي هــذا القيــد باستخــدام مجمــوعة مــن التعليمـــات التاليــة :
CBW تحويل القيمة الموجـودة فـي المسجـل AL الـى كلمـة تخـزن في المسجل AX .
CWD تحويــل القيمــة الموجــودة فــي المسجــل AX الــى كلمتيــن يتـم تخزينهـا فــي المسجــلات DX:AX فــي حالــة المعالــج 8086 .
CEDE تحــويل القيمــة الموجــودة فــي المسجـل AX الـى كلمتيـن يتـم تخزينهمـــا فـي المسجــل EAX فــي حالة 86380 .
ادرس الامثلــة التاليــة ولاحــظ كلهــا امثلــة للتعليمــة MOV حــاول تحــديد العبــارات الصحيحـــة منهــا :
كود:
mov word_1 , word_2
mov ds , 1000h
mov ip , ax
mov al , bx
mov word_1, al
mov 1000h , ax
mov byte_1 , ax
اعذرونـــي للاطالــة كــان بإمكانــي الدخـــول الــى الاوامــر مباشــرة لكننــي لا افضــل هــذا الاسلــوب وعلــى مــاأعتقــد تفسيـر الامــر شــئ جميــل يزيــل بعــض الغمــوض عــن اللغــة ويجعلهــا نوعــا ما بسيطـة .
نلتقــي فـــي المشاركــة القادمـــة ان شــاء اللــه
مع احترامي (أخوكم)
heroking
--...فى انتظار الردود....isa والوعود.....