| كاتب الموضوع :
MaZeN المنتدى :
منتدى لغات البرمجة
رد: دروس في لغة الاسمبلي (متجدد) الاوامر1)الامر MOV
الصيغة الاولى: هنالك مجموعة من الاوامر التي بحاجة الى مصدر وهدف. المصدر لا يتغير وانما الهدف الذي يتغير
الامر
الهدف
المصدر
MOV OP1,OP2 الامر mov يعني ضع في op1 نسخة من قيمة op2 بدون التأثير على OP2 . بعد هذه العملية op2 لا يتغير بينما OP1 يتغير
مثال:
معطى AL=20H و BL=50H MOV AL,BL
MOV BL,60H
نعمل جدول متابعة لمشاهدة التغييرات
BL
AL
الامر
50h
20H
50H
50H
MOV AL,BL
60H
50H
MOV BL,60H
بعد تنفيذ المقطع نحصل على
AL=50H BL=60H
ملاحظات
1) الامر MOV لا يؤثر على الرايات flags أي ان قيم الرايات لا يتغير وانما تحافظ على القيم السابقة
2)يجب ان يكون المصدر من نفس كبر الهدف (بايت، بايت) او (word , word)
مثال:
MOV AX ,CX MOV DL,AL MOV CH,20H
اما هذه الامثلة بعضها غير صحيح
الامر
الوضع
السبب
MOV AL,BX
غير صحيح
لان المصدر اكبر من الهدف
MOV AL,123H
غير صحيح
لا يمكن تخزين عدد من ثلاث منازل في الميزان 16 في مسجل بكبر 8 بتات. يمكن تخزين قيمة بكبر منزلة او منزلتين
MOV BL,120
صحيح
لان 120=78H أي انه يتكون من منزلتين
MOV DX,12345H
غير صحيح
لانه في مسجل بكبر 16 بت يمكن تخزين قيمة بكبر 4 منازل على الاكثر في الميزان السادس عشر
تمارين:
1) اكتب مقطع برنامج يبدل قيم DL , CL فيما بينها. أي ان DL يأخذ قيمة CL وCL يأخذ قيمة DL
الحل: هنا يجب ان نستعين بمسجل مساعد
MOV AL,DL
MOV DL,CL
MOV CL,AL
2)معطى الامر التالي:
MOV DX , 2011H
ما هي القيم الموجودة في كل من DL , DH
11
20
DL
DH
2)الامر ADD
ADD OP1, OP2
Op1=op1+op2
اجمع قيمة المصدر وقيمة الهدف واحفظ النتيجة في الهدف
مثال:
Mov dh,41H
Add dh,3
بعد تنفيذ المقطع المسجل dh يصبح 44H
مثال :
Mov AL , 6
MOV CL , 8
ADD AL , CL
جدول متابعة:
AL
CL
الامر
؟؟
؟؟
06H
؟؟
Mov AL , 6
06H
08H
MOV CL , 8
0EH
08H
ADD AL , CL
ملاحظات:
- ؟؟ : تعني اننا لا نعلم ما بداخله
-علينا تسجيل القيم في الميزان السادس عشر على شكل منزلتين في المسجلات ذات 8 بت وعلى شكل 4 منازل في المسجلات ذات 16 بت.
مثال:
DX=1024H AL=06H
-كل قيمة عددية تبدأ بحرف A , B ,C ,D ,E ,F يجب ان نسجل 0 عن يسارها
مثال:
Mov DL , 0D1H
ADD CX , 0A123H
تمرين : اكتب مقطع برنامج ينفذ ما يلي: CL=2*AL+BL
الحل:
Mov CL,AL
ADD CL ,CL
ADD CL,BL
3) الامر SUB
sub op1 ,op2
op1=op1-op2
اطرح المصدر من الهدف وخزن النتيجة في الهدف
تمرين:
اكتب مقطع برنامج يحسب حاصل الفرق بين DL والمسجل BL ويحفظ النتيجة في BH
الحل:
Mov BH , DL
Sub BH , BL
4)الامر INC
هذا الامر بحاجة الى operand واحد فقط
Inc op1
Op1=op1+1
كبر الهدف بِ 1
5)الامر DEC
هذا الامر بحاجة الى operand واحد فقط
Dec op1
Op1=op1-1
اطرح من OP1 واحد
التعامل مع الذاكرة
يمكن القراءة من الذاكرة او الكتابة الى الذاكرة . عندما نريد التوجه الى الذاكرة للكتابة او القراءة علينا ان نقوم بما يلي:
-ضع في المسجل SI او DI او BX عنوان الخلية المطلوبة
-ضع القيم العددية التي تريد كتابتها في مسجل ملائم من حيث الكبر
-استخدم الامر MOV وضع المسجل الذي يحوي عنوان الخلية بين اقواس مربعة
مثال:
أكتب مقطع برنامج يخزن في الخلية 102H القيمة 30H
الحل:
Mov si,102H
Mov AL, 30H
Mov [SI],AL
في حالة اذا لم كتبنا بدلا من MOV [si],AL الامر MOV si,AL نحصل على خطأ لان المترجم يفهم باننا نريد ان نخزن قيمة AL في المسجل SI ونحن نعلم ان المسجل si 16 بت والمسجل AL 8 بت اذا لا تواجد ملائمة بين المصدر والهدف
بينما MOV [si],AL ضع قيمة AL في الخلية التي عنوانها مخزن في المسجل si
ملاحظة مهمة جدا: لا يجوز ان يكون الهدف خلية في الذاكرة والمصدر ايضا خلية في الذاكرة
مثال: X اسم متغير
الامثلة التالية غير صحيحة
Mov [si],[bx] add [di],X
تمرين : اكتب مقطع برنامج يقرأ فحوى الخلية 440H ويحفظها في المسجل DH
الحل:
Mov DI,440H
Mov DH,[DI]
تمرين: اكتب مقطع برنامج يجمع فحوى الخلية 10H وفحوى الخلية 11H ويخزن النتيجة في الخلية 12H
الحل:
Mov si,10H
Mov ah,[si]
Inc si
Add ah,[si]
Inc si
Mov [si],ah
تمرين مهم جدا:
معطى المقطع التالي:
Mov si,5
Mov ax,1122H
Mov [si],ax
ماذا يعمل هذا المقطع
نحن نعرف ان كبر كل خلية في الذاكرة هو 8 بت اذا يمكن تسجيل قيمة تتكون من منزلتين في الميزان السادس عشر.
ولكن AX عبارة عن 16 بت أي لا يمكن تخزينها كلها في خلية واحدة لهذا السبب
يتم حفظ قيمة AL في الخلية التي يؤشر عليها SI ويحفظ قيمة ah في الخلية التي تليها.
اذا
في الخلية 5 يسجل 22H وفي الخلية 6 تسجل القيمة 11H
|