أهلا وسهلا بك إلى لايف نت.
اهلا بك عزيزي الزائر , لتتمتع بكافة مزايا الموقع يجب عليك التسجيـل لتتمكن من المشاركة معنا و تحميل المرفقات ومشاهدة الروابط و المواضيع وتصبح أحد أفراد شبكة لايف نت . هذه الرسالة لن تظهر بعد أن تسجل او تقوم بتسجيل الدخول ان كنت مسجل مسبقا!

إضغط هنا للخروج

Header
 
 

 مسينجر مدير الموقع :

 
الاشتراك في جروب شبكة لايف نت
Email:
زيارة الجروب
 

إعلانات إدارية


العودة   لايف نت > ღ♥ღ لايف نت التقني ღ♥ღ > لغات البرمجة
القرآن الكريم الترجمة توبيكات للماسنجرحماية الروابط إسترجاع كلمة المرور طلب كود تفعيل العضوية تفعيل العضوية
قوانين الموقع ألعاب تسجيل دخول مسينجر مركز التحميل مقياس الحب زخرفة SMS الخطة الاعلانية
أفلام ثيمات XP مسينجر دروس تعليمية تعاريف البرامج دليل المواقع ترددات ديجتال أكواد جافا

لغات البرمجة programing C++ visual studio database borland pascal


دروس في لغة الاسمبلي متجدد

لغات البرمجة


رد
 
LinkBack (1) أدوات الموضوع طرق مشاهدة الموضوع
قديم 16-02-2008   #12 (permalink)

مشرف سابق

 
الصورة الرمزية smok200

 



 
عدد الترشيحات : 0
عدد المواضيع المرشحة : 0
عدد مرات الفوز : 0
smok200 سمعته مابعدها سمعة.smok200 سمعته مابعدها سمعة.smok200 سمعته مابعدها سمعة.smok200 سمعته مابعدها سمعة.smok200 سمعته مابعدها سمعة.smok200 سمعته مابعدها سمعة.smok200 سمعته مابعدها سمعة.smok200 سمعته مابعدها سمعة.smok200 سمعته مابعدها سمعة.smok200 سمعته مابعدها سمعة.smok200 سمعته مابعدها سمعة.
افتراضي رد: دروس في لغة الاسمبلي (متجدد)


وااااااااااو

موضوع رهيب وعظيم يا مزان

تسلم ايدك عالشرح المميز

 

التوقيع

Share What You Can To benefit The Others
smok200 غير متواجد حالياً   رد مع اقتباس
   
قديم 17-02-2008   #13 (permalink)

مشرف سابق

 
الصورة الرمزية MaZeN

 



 
مرشح مرة واحده في موضوع واحد
عدد مرات الفوز : 0
MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.
إرسال رسالة عبر مراسل MSN إلى MaZeN إرسال رسالة عبر مراسل Yahoo إلى MaZeN
افتراضي رد: دروس في لغة الاسمبلي (متجدد)


اوامر الدوران

هنالك عدة اوامر للدوران في لغة الاسمبلي
1.دوران نحو اليمين: فهنا تتحرك البتات من اليسار الى جهة اليمين اي ان البت الاولى تنتقل مكان البت الاخيرة والاخيرة الى قبل الاخيرة وهكذا. صورة من البت الاولى التي انتقلت الى البت الاخيرة تدخل الى راية CF
ROR OP,1

DATA

CF







مثال:

MOV AL,3DH
ROR AL,1

0
0
1
1
1
1
0
1


AL CF
1
0
0
1
1
1
1
0
1


ملاحظة:المصدر هنا عبارة عن قيمة عددية ويجب ان تكون 1 وفقط واحد وفي حالة اذا اردنا تدوير اكثر من بت واحدة فهنالك حلان
الحل الاول ان نسجل الامر بقدر عدد مرات البتات المراد تدويرها مثلا:
MOV AL,23H; AL=00100011
ROL AL,1
ROL AL,1
ROL AL,1
فهنا تم تدوير ثلاث بتات .
AL CF
0
1
1
0
0
1
0
0
0


حل اخر: نضع في CL عدد مرات الدوران ثما نسجل الامر
مثال:
MOV AL,26H
MOV CL,3
ROR AL,CL
لاحظ انه البت التي تتحرك تخرج من ال DATA تضع صورة من قيمتها في الراية CF وتنتقل البت الى اخر ال DATA وان القيمة المحفوظة في الراية CF هي قيمة اخر بت خرجت من ال DATA
تمرين: اكتب مقطع برنامج يحفظ في المسجل BL عدد البتات التي قيمتها 1 في المسجل AX
الحل:
فكرة الحل هي تدوير بتات المسجل AX 16 دورة وفي كل دورة نسأل عن قيمة الراية CF اذا كانت 1 نضيف للعداد BL القيمة 1. نسأل عن الراية cf لان كل بت تنتقل من البداية الى النهاية تضع صورة منها في داخل هذه الراية

MOV CX,16
MOV BL,0
T1:ROR AX,1
JC CF_1
JMP CF_0
CF_1:ADD BL,1
CF_0:LOOP T1
2) الامر الثاني المتخصص في الدوران هو الدوران لليسار والامر هو

ROL OP,1
فهنا البت الموجودة في نهاية المسجل تضع صورة لها في الراية CF وتنتقل الى البداية. كما هو مبين في الشكل التالي:

DATA

CF








مثال: لو فرضنا ان المسجل BL يحتوي على قيمة 6CH ونفذنا الامر التالي:
ROL BL,1

0
1
1
0
1
1
0
0
1
1
0
1
1
0
0
0

عندها نحصل على ما يلي: BL CF
0



السؤال اذا اردنا ان نقوم بتدوير عدة بتات مرة واحدة فاننا نستعمل المسجل CL ونضع فيه عدد الدورات
مثال:
ROL DL,1
ROL DL,1
ROL DL,1
ROL DL,1
يمكن ان نسجل بدلا من هذه الاوامر ما يلي:
MOV CL,4
ROL DL,CL
اوامر الازاحة
هنالك اوامر ازاحة بتات تتخصص في الاعداد الموجبة وهنالك اوامر ازاحة تتخصص في الاعداد الموجهة
1.ازاحة نحو اليمين الاعداد الموجبة.
SHR OP,1
هنا يتم اضافة صفر في نهاية ال OP ونقوم بدفع البتات الاخرى الى اليمين وفي هذه الحالة تخرج البت الاولى الى راية CF
كما هو مبين في الشكل التالي:

DATA

CF

0







مثال: معطى BL=75H اذا نفذنا الامر التالي:
SHR BL,1
اننا نحصل على الشكل التالي:
0
1
1
1
0
1
0
1

المسجل BL قبل تنفيذ الامر


بعد عملية التنفيذ نحصل على
0
0
1
1
1
0
1
0
1





CF BL
ملاحظة: هذه الامر يقوم بعملية قسمة القيمة على 2 ولكن دون باق أي انه يحفظ الناتج الصحيح من خارج القسمة والباقي يذهب الى الراية CF
لو اردنا ان نعمل الامر عدة مرات فاننا سوف نسجل الامر عدة مرات او نستعين في بالمسجل CL
مثال:
SHR AL,1
SHR AL,1
SHR AL,1
يمكن نسجل بدلا من هذه الاوامر ما يلي:
MOV CL,3
SHR AL,CL
ملاحظة: هنا لا يمكن تخزين الباقي في الراية CF لانه يمكن ان نخزن بت واحدة فقط وهي اخر بت خرجت من المسجل او المتغير. هنا تمت قسمة المسجل عل القيمة 8 لانه في كل ازاحة نقسم على 2 وهنا عملنا ثلاث ازاحات اذا قسمنا على 8



2.ازاحة نحو اليسار.
SHL OP,1
هنا يتم اضافة صفر في بداية ال OP ونقوم بدفع البتات الاخرى الى اليسار وفي هذه الحالة تخرج البت الاخيرة الى راية CF
كما هو مبين في الشكل التالي:

DATA

CF

0







مثال: معطى BL=75H اذا نفذنا الامر التالي:
SHL BL,1
اننا نحصل على الشكل التالي:
0
1
1
1
0
1
0
1

المسجل BL قبل تنفيذ الامر


بعد عملية التنفيذ نحصل على
1
1
1
0
1
0
1
0


BL CF
0



ملاحظة: هذه الامر يقوم بعملية ضرب القيمة بالعدد 2 البت الاخيرة تنتقل الى الراية CF
لو اردنا ان نعمل الامر عدة مرات فاننا سوف نسجل الامر عدة مرات او نستعين في بالمسجل CL
مثال:
SHL AL,1
SHL AL,1
SHL AL,1
يمكن ان نسجل بدلا من هذه الاوامر ما يلي:
MOV CL,3
SHL AL,CL
هنا تم ضرب العدد بالقيمة 8 والسبب هو ان كل ازاحة عبارة عن ضرب العدد بالقيمة 2 وهنا عملنا ثلاث ازاحات أي 2*2*2=8 المهم ان ننتبه جيدا لانه في بعض الاحيان المسجل لا يمكنه ان يستوعب النتيجة الجديدة وهنا نخسر بتات من النتيجة وتكون النتيجة الموجودة في المسجل غير صحيحة.
الحل ان نستعين عندها في مسجل كامل مثلا
MOV AH,0
MOV CL,3
SHL AX,CL

3.ازاحة نحو اليسار للاعداد الموجهة( السالبة والموجبة).
SAL OP,1
هنا يتم اضافة صفر في بداية ال OP ونقوم بدفع البتات الاخرى الى اليسار وفي هذه الحالة تخرج البت الاخيرة الى راية CF
كما هو مبين في الشكل التالي:

DATA

CF

0







مثال: معطى BL=75H اذا نفذنا الامر التالي:
SAL BL,1
اننا نحصل على الشكل التالي:
0
1
1
1
0
1
0
1

المسجل BL قبل تنفيذ الامر


بعد عملية التنفيذ نحصل على
1
1
1
0
1
0
1
0


BL CF
0



ملاحظة: هذه الامر يقوم بعملية ضرب القيمة بالعدد 2 البت الاخيرة تنتقل الى الراية CF
لو اردنا ان نعمل الامر عدة مرات فاننا سوف نسجل الامر عدة مرات او نستعين في بالمسجل CL
مثال:
SAL AL,1
SAL AL,1
SAL AL,1
يمكن ان نسجل بدلا من هذه الاوامر ما يلي:
MOV CL,3
SAL AL,CL
هنا تم ضرب العدد بالقيمة 8 والسبب هو ان كل ازاحة عبارة عن ضرب العدد بالقيمة 2 وهنا عملنا ثلاث ازاحات أي 2*2*2=8 المهم ان ننتبه جيدا لانه في بعض الاحيان المسجل لا يمكنه ان يستوعب النتيجة الجديدة وهنا نخسر بتات من النتيجة وتكون النتيجة الموجودة في المسجل غير صحيحة.
الحل ان نستعين عندها في مسجل كامل مثلا
MOV AH,0
MOV CL,3
SAL AX,CL
4.ازاحة نحو اليمين للاعداد الموجهة السالبة والموجبة.
SAR OP,1
هنا يتم نسخ البت الاخيرة من جهة اليسار في نهاية ال OP ونضعها في نهاية ال OP ونقوم بدفع البتات الاخرى الى اليمين وفي هذه الحالة تخرج البت الاولى الى راية CF
كما هو مبين في الشكل التالي:

DATA

CF







مثال: معطى BL=F5H اذا نفذنا الامر التالي:
SAR BL,1
اننا نحصل على الشكل التالي:
1
1
1
1
0
1
0
1

المسجل BL قبل تنفيذ الامر


بعد عملية التنفيذ نحصل على
1
1
1
1
1
0
1
0
1





CF BL
ملاحظة: هذه الامر يقوم بعملية قسمة القيمة على 2 ولكن دون باق أي انه يحفظ الناتج الصحيح من خارج القسمة والباقي يذهب الى الراية CF
مثال: معطى BL=75H اذا نفذنا الامر التالي:
SAR BL,1
اننا نحصل على الشكل التالي:
0
1
1
1
0
1
0
1

المسجل BL قبل تنفيذ الامر


بعد عملية التنفيذ نحصل على
0
0
1
1
1
0
1
0
1





CF BL

لو اردنا ان نعمل الامر عدة مرات فاننا سوف نسجل الامر عدة مرات او نستعين في بالمسجل CL
مثال:
SAR AL,1
SAR AL,1
SAR AL,1
يمكن نسجل بدلا من هذه الاوامر ما يلي:
MOV CL,3
SAR AL,CL
ملاحظة: هنا لا يمكن تخزين الباقي في الراية CF لانه يمكن ان نخزن بت واحدة فقط وهي اخر بت خرجت من المسجل او المتغير. هنا تمت قسمة المسجل عل القيمة 8 لانه في كل ازاحة نقسم على 2 وهنا عملنا ثلاث ازاحات اذا قسمنا على 8

5.التدوير الى اليمين مع الراية CF
RCR OP,1
هنا يتم اعتبار الراية CF من ضمن البتات التي يجب تدويرها انظر الشكل التالي:

DATA

CF







مثال:معطى CF=1 AL=3DH
اذا نفذنا الامر التالي:
RCR AL,1
قبل التنفيذ
CF AL

0
0
1
1
1
1
0
1
1

بعد التنفيذ:
AL CF
1
0
0
1
1
1
1
0
1


ملاحظة:المصدر هنا عبارة عن قيمة عددية ويجب ان تكون 1 وفقط واحد وفي حالة اذا اردنا تدوير اكثر من بت واحدة فهنالك حلان
الحل الاول ان نسجل الامر بقدر عدد مرات البتات المراد تدويرها مثلا:
RCR AL,1
RCR AL,1
RCR AL,1
فهنا تم تدوير ثلاث بتات .

حل اخر: نضع في CL عدد مرات الدوران ثما نسجل الامر
مثال:
MOV CL,3
RCR AL,CL


6.التدوير الى اليسار مع الراية CF
RCL OP,1
هنا يتم اعتبار الراية CF من ضمن البتات التي يجب تدويرها انظر الشكل التالي:

DATA

CF







مثال:معطى CF=0 AL=3DH
اذا نفذنا الامر التالي:
RCL AL,1
قبل التنفيذ
AL CF

0
0
1
1
1
1
0
1
0

بعد التنفيذ:
AL
0
1
1
1
1
0
1
0
0


ملاحظة:المصدر هنا عبارة عن قيمة عددية ويجب ان تكون 1 وفقط واحد وفي حالة اذا اردنا تدوير اكثر من بت واحدة فهنالك حلان
الحل الاول ان نسجل الامر بقدر عدد مرات البتات المراد تدويرها مثلا:
RCL AL,1
RCL AL,1
RCL AL,1
فهنا تم تدوير ثلاث بتات .

حل اخر: نضع في CL عدد مرات الدوران ثم نسجل الامر
مثال:
MOV CL,3
RCL AL,CL



الامر
الاختصار
ROR
ROTATE RIGHT
ROL
ROTATE LEFT
RCR
ROTATE RIGHT WITH CARRY
RCL
ROTATE LEFT WITH CARRY
SAL
SHIFT ARITHMETIC LOGICAL LEFT
SAR
SHIFT ARITHMETIC LOGICAL RIGHT

 

التوقيع

MaZeN غير متواجد حالياً   رد مع اقتباس
قديم 18-02-2008   #14 (permalink)

مشرف سابق

 
الصورة الرمزية MaZeN

 



 
مرشح مرة واحده في موضوع واحد
عدد مرات الفوز : 0
MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.
إرسال رسالة عبر مراسل MSN إلى MaZeN إرسال رسالة عبر مراسل Yahoo إلى MaZeN
افتراضي رد: دروس في لغة الاسمبلي (متجدد)


النصوص

النص: هوعبارة عن رمز او اكثر تحفظ عادة تحت اسم في مكان معين في الذاكرة وتحفظ الرموز بجانب بعضها البعض
مثال:

Str1 db 'this is my first string'
Str2 db '12345'
Str3 dw 'ad'
Str4 dw 'v'
ملاحظة هامة : اذا كان النص من نوع word يجب ان يكون عدد رموزه اصغر من ثلاثة رموز
مثلا :str4 dw 'abc' خطأ لان عدد الرموز هنا 3 رموز

اوامر النصوص
-اوامر النصوص تعمل على منطقتين في الذاكرة
المنطقة الاولى : تدعى منطقة المصدر وهذه المنطقة معرفة بمساعدة DS:SI اين ان المصدر موجود في منطقة data segment والمؤشر الذي نستخدمه هو si
المنطقة الثانية: تدعى منطقة الهدف وهذه المنطقة معرفة بمساعدة ES:DI أي انها موجودة في منطقة extra segment والمؤشر هنا هو di
ملاحظة: يمكن ان تكون المنطقة الثانية في منطقة data segment بشرط ان نعطي المسجل es نفس قيمة المسجل ds
-يجب ان يؤشر si على نص المصدر والمؤشر di على نص الهدف قبل تنفيذ عمليات النصوص
-اذا كان DF=0 المؤشرات تكبر بعد كل عملية واذا كان DF=1 المؤشرات تصغر بعد كل عملية
-الامر الذي يضع القيمة صفر في الراية DF هوالامر CLD أي clear direction flag) )
-الامر الذي يضع القيمة 1 في الراية DF هو STD أي
(set direction flag)
- قيمة المؤشر si والمؤشر di تتغير بشكل تلقائي بعد كل عملية نقوم بها على النصوص بواسطة امر من اوامر النصوص.
السؤال هو بكم تتغير ؟
الجواب حسب قيمة الراية DF ونوع الامر (هنالك اوامر تتم على بايت وهنالك اوامر تتم على word)
الاوامر
الامر MOVSB : هنا يتم نسخ بايت من نص المصدر الى نص الهدف . ويتم تتغيير المؤشرات si و di حسب وضع DF
مثال:
معطى:
Cld
Lea si,string1
Lea di,string2
Movsb
هنا تم نسخ الرمز الاول في نص المصدر (string1) الى نص الهدف (string2) وايضا تم تكبير كل واحد من المؤشرات si,di بواحد

المقطع التالي تنفذ نفس المهمة التي عملها المقطع السابق

Lea si,string1
Lea di,string2
Mov al,[si]
Mov [di],al
inc si
inc si
اذا اردنا ان ننسخ مثلا 10 رموز ماذا نعمل نسجل الامر السابق 10 مرات ام هنالك طريقة ابسط واسهل .
الجواب يمكن ان نستخدم الامر rep . (repeat)
الاستعمال كما يلي :
-ضع في المسجل cx عدد الرموز المراد نسخها
-نسجل rep movsb
الحل:
Cld
Lea si,string1
Lea di,string2
Mov cx,10
Rep Movsb
الامر movsw : يعمل مثل الامر السابق ولكن هنا يتم نسخ رمزين في كل عملية والمؤشرات تنقص اوتزيد بـ 2 حسب الراية DF
اذا كان DF=0 عندها SI=SI+2
DI=DI+2
اذا كان DF=1 عندها SI=SI-2
DI=DI-2
الامر LOADSB : هنا يتم وضع نسخة من الرمزالذي يؤشر عليه المؤشر si في المسجل AL ويتم تغيير المؤشر SI بواحد حسب وضع DF .
اذا كان DF=0 عندها SI=SI+1
اذا كان DF=1 عندها SI=SI-1

الامر LOADSW : هنا يتم نسخ رمزين من نص الهدف الى المسجل AX ويتم تغيير المؤشر SI بـ 2 حسب وضع الراية DF
اذا كان DF=0 عندها SI=SI+2
اذا كان DF=1 عندها SI=SI-2

الامر STOSB هنا يتم وضع نسخة من الرمزالموجود في المسجل AL في نص الهدف في المكان الذي يؤشر عليه المؤشر DI ويتم تغيير المؤشر DI بواحد حسب وضع DF .
اذا كان DF=0 عندها DI=DI+1
اذا كان DF=1 عندها DI=DI-1

الامر STOSW هنا يتم نسخ المسجل AX الى نص الهدف ويتم تغيير المؤشر DI بـ 2 حسب وضع الراية DF
اذا كان DF=0 عندها DI=DI+2
اذا كان DF=1 عندها DI=DI-2

الامر SCASB هنا يتم مقارنة AL مع الرمزالذي يؤشر عليه المؤشرDI في نص الهدف ويتم تغيير المؤشر DI بواحد حسب وضع DF .
اذا كان DF=0 عندها DI=DI+1
اذا كان DF=1 عندها DI=DI-1

ملاحظة: هنا المصدر والهدف لا يتأثران ولكن الرايات تتأثر
أي ان فحوى المسجل AL والرمز الذي تمت مقارنته لا يتغيران

الامر SCASW هنا يتم مقارنة AX مع الرمزالذي يؤشر عليه المؤشرDI والرمز الذي يليه في نص الهدف ويتم تغيير المؤشر DI بـ 2د حسب وضع DF .
اذا كان DF=0 عندها DI=DI+2
اذا كان DF=1 عندها DI=DI-2

ملاحظة: هنا المصدر والهدف لا يتأثران ولكن الرايات تتأثر
أي ان فحوى المسجل AX والرموز الذي تمت مقارنتها لا تتغير

الامر CMPSB هنا يتم مقارنة الرمزالذي يؤشر عليه المؤشر SI في نص المصدر مع الرمز الذي يؤشر عليه المؤشر DI في نص الهدف ويتم تغيير المؤشر DI والمؤشر SI بواحد حسب وضع DF .
اذا كان DF=0 عندها DI=DI+1
SI=SI+1
اذا كان DF=1 عندها DI=DI-1
SI=SI-1
ملاحظة: هنا المصدر والهدف لا يتأثران ولكن الرايات تتأثر
ملاحظة: هنا يتم طرح الهدف من المصدر بعكس الامر CMP الذي يطرح المصدر من الهدف

الامر CMPSW هنا يتم مقارنة الرمزالذي يؤشر عليه المؤشر SI والرمز التالي في نص المصدر مع الرمز الذي يؤشر عليه المؤشر DI والرمز التلي في نص الهدف ويتم تغيير المؤشر DI والمؤشر SI بـ 2 حسب وضع DF .
اذا كان DF=0 عندها DI=DI+2
SI=SI+2
اذا كان DF=1 عندها DI=DI-2
SI=SI-2
ملاحظة: هنا المصدر والهدف لا يتأثران ولكن الرايات تتأثر
ملاحظة: هنا يتم طرح الهدف من المصدر بعكس الامر CMP الذي يطرح المصدر من الهدف

الحلقات والنصوص
اذا اردنا تنفيذ امر من اوامر النصوص عدة مرات يمكن استخدام اوامر الحلقات
الامر rep
ينفذ امر نصوص عددمن المرات بقدر القيمة المخزنة في المسجل cx
مثلا:
Mov cx,20
Rep stosb

تمرين:
معطى نص باسم str3 بطول 15 رمزا اكتب برنامجا ينسخ الرمز C في خلايا النص
الحل:
.MODEL SMALL
.STACK 20H
.DATA
STR3 DB 15 DUP ('0')
.CODE
START:
MOV AX,@DATA
MOV DS,AX
MOV ES,AX ;ES=DS هذا مهم حتى نقول للمعالج ان
المقطع التالي للفحص سوف نقوم بطباعة حدود النص STR3 ;
MOV CX,15
MOV SI,0
T11:MOV DL,STR3[SI]
MOV AH,2
INT 21H
INC SI
LOOP T11
المقطع التالي لنسخ الرمز C في حدود النص STR3 ;
CLD
MOV CX,15
MOV AL,'C'
LEA DI,STR3
REP STOSB
المقطع التالي للفحص سوف نقوم بطباعة حدود النص STR3 ;
MOV CX,15
MOV SI,0
T1:MOV DL,STR3[SI]
MOV AH,2
INT 21H
INC SI
LOOP T1
انهاءالبرنامج واعطاء السيطرة لنظام التشغيل ;
MOV AH,4CH
INT 21H

END START

الامر REPZ : نفذ الحلقة كل الوقت الذي يتحقق به ما يلي:
CX<>0 وايضا ZF=1

يستخدم هذا الامر عادة للبحث عن رمز مختلف في النص.
لمعرفة اذا كان الخروج من الحلقة بسب CX=0 أي ان النص قد انتهى نستخدم الامر JCXZ هذا يعني اقفزاذا كان CX=0 اذا لم يتم القفز نعرف ان انتهاء الحلقة كان بسبب ZF=0 أي اننا وجدنا رمز مختلف
مثلا اذا اردنا ان نفحص اذا كان نصا معينا يحتوي على رمز يختلف عن الرمز D
.MODEL SMALL
.STACK 20H
.DATA
STR3 DB 'DDDDADDD'
NO DB 'NOT FOUND$'
YES DB ' FOUND$'
.CODE
START:
MOV AX,@DATA
MOV DS,AX
MOV ES,AX ;ES=DS هذا مهم حتى نقول للمعالج ان
المقطع التالي للفحص اذا كان هنالك رمز مختلف عن D ;
CLD
MOV CX,9
MOV AL,'D'
LEA DI,STR3
REPZ SCASB
JCXZ T1; JUMP IF CX=0 هذا يعني ان النص انتهى ولم نجد رمزا مختلفا
LEA DX,YES ; هنا يعني ان ايقاف عملية البحث بسبب اننا وجدنا رمزا مختلفا
MOV AH,9
INT 21H
JMP FINISH
T1:LEA DX,NO
MOV AH,9
INT 21H
انهاءالبرنامج واعطاء السيطرة لنظام التشغيل ;
FINISH:MOV AH,4CH
INT 21H

END START

الامر REPNZ

نفذ الحلقة كل الوقت الذي يتحقق به ما يلي:
CX<>0 وايضا ZF=0

يستخدم هذا الامر عادة للبحث عن رمز معين في النص. مثلا اذا اردنا ان نفحص اذا كان نصا معينا يحتوي على الرمز D





 

MaZeN غير متواجد حالياً   رد مع اقتباس
قديم 19-02-2008   #15 (permalink)

مشرف سابق

 
الصورة الرمزية MaZeN

 



 
مرشح مرة واحده في موضوع واحد
عدد مرات الفوز : 0
MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.
إرسال رسالة عبر مراسل MSN إلى MaZeN إرسال رسالة عبر مراسل Yahoo إلى MaZeN
افتراضي رد: دروس في لغة الاسمبلي (متجدد)


اوامر متفرقة

هنالك بعض الاوامر المتفرقة في لغة الاسمبلي التي لا بد من التطرق اليها
الاول seg
يستخدم هذا لمعرفة عنوان المقطع الموجود فيه المتغير (variable) او العنوان المطلوب (lable)
مثال:

.model small
.data
x1 db 10
student db 5 dup (?)
.code
start:
mov ax,@data
mov ds,ax
هنا نرى تم تخزين عنوان بداية مقطع البيانات data في مسجل المقطع ds
ملاحظة: @data عبارة عن عنوان اي قيمة عددية تدل على بداية مقطع البيانات data segment وكما نعلم لا يحق ان نخزن قيمة عددية بصورة مباشرة في مسجل مقطع لذلك استخدمنا المسجل ax وضعنا القيمة العددية في داخله ثم نسخنا فحوى المسجل ax الى المسجل ds

يمكن ان نحصل على نفس النتيجة بمساعدة seg
.model small
.data
x1 db 10
student db 5 dup (?)
.code
start:
mov ax,seg x1
mov ds,ax
لقد حصلنا على عنوان مقطع البيانات عن طريق اسم متغير في داخله وseg

الامر xlat
في بعض الاحيان نريد ان نترجم جدول معين الى جدول اخر (مثلا لو اردنا ان نغير قيمة الاسكي كود في الرمز الذي يلائمه) في هذه الحالات نستخدم الامر XLAT
قبل استخدام الامر XLAT علينا مراعاة الشروط التالية:
1.علينا تخزين البايت المراد ترجمته في المسجل AL وفقط في هذا المسجل
2.المسجل BX يجب ان يحتوي على عنوان جدول الترجمة

ثم نسجل الامر XLAT عندها يقوم هذا الامر بالامور التالية:
1.يجمع فحوى المسجل AL والمسجل BX وعندها نحصل على عنوان داخل جدول الترجمة (اي اننا نؤشر على بايت معين في جدول الترجمة والذي عنوانه عبارة عن BX+AL
2.يضع فحوى البايت الذي عنوانه BX+AL في المسجل AL

مثال: في هذا المثال يوجد جدولين (مصوفتين) فسوف نقوم بترجمة حدود المصفوفة الاولى (الجدول الاول) عن طريق جدول الترجمة الجدول الثاني:
.model small
.stack 10h
.data
table1 db 1,13,4,1,2,8,13,14,11,8,13,3,5,5,8,7,10,4,6,13,4,3 ,9,12,0,3,12,8
table2 db 'u','i','k','a','l','s','y','m','e','n','b','h','g ',' ','t'
.code
start:mov ax,@data
mov ds,ax
هنا سوف نقوم بمسح الشاشة;
mov ax,3
int 10h
نضع في المسجل bx عنوان جدول الترجمة;
lea bx,table2
المسجل si سوف نستعمله كمؤشر على حدود الجدول الاول للانتقال بين الحدود ;
mov si,0
هنا المسجل cx يحتوي على عدد حدود الجدول الذي نريد ان نترجمه;
mov cx,28
هنا سوف تتم عملية الترجمة لكل حد ومن ثم طباعة الحد الذي يلائمه في الجدول الثاني;
next_item:mov al,table1[si]
xlat
mov dl,al
mov ah,2
int 21h
inc si
loop next_item
انهاء البرنامج واعطاء نظام التشغيل السيطرة;
mov ah,4ch
int 21h
end start
الامر in (input) والامر out (output)
من المعروف انه يمكن ربط المعالج 8086 مع 64 كيلو اجهزة ادخال واخراج داخلية. لكل واحد يوجد عنوان حتى يتمكن المعالج من التمييز بينها.
يمكن ادخال واخراج بيانات فقط عن طريق المسجل AL او المسجل AX
عند استخدام الامر in او الامر OUT يجب ان نسجل عنوان الجهازالمطلوب

امثلة:
In AL,50H

هذا يعني ادخل الى المسجل AL فحوى جهاز الادخال الذي عنوانه 50H

OUT 50H,AL

هذا يعني اخرج فحوى المسجل AL لجهاز الاخراج الذي عنوانه 50H
IN AX,80H

هذا يعني ادخل فحوى جهاز الادخال صاحب عنوان 80H للمسجل AL وفحوى جهاز الادخال صاحب عنوان 81H للمسجل AH
OUT 90H,AX

هذا يعني اخرج فحوى المسجل AL لجهاز الاخراج صاحب العنوان 90H وفحوى المسجل AH لجهاز الاخراج صاحب عنوان 91H
في حالة اذا كان عنوان الجهازالمطلوب اكبر من 255 اي FFH عندها نستخدم المسجل DX كمؤشر
مثال:
MOV DX,301H

IN AL,DX
هنا يتم ادخال فحوى جهازالادخال صاحب عنوان 301H الى المسجل AL

الامر PUSHF والامر POPF
الامر PUSHF : يقوم بتخزين فحوى مسجل الرايات في مقطع المكدسة (STACK SEGMENT)

الامر POPF : يقوم هذا الامر بنسخ الكلمة الموجودة في راس المكدسة الى مسجل الرايات
يمكن استخدام هذه الاوامر عندما نريد ان نسأل عن قيمة راية معينة بدون ان نعمل عملية تؤثر على الراية وبقية الرايات
مثال:
PUSHF

POP AX
والان يمكن التوجه الى اي راية نريدها عن طريق المسجل AX
وايضا يمكن استخدام هذه الاوامر اذا اردنا ان نعطي الرايات قيمة بدائية. نضع مثلا في المسجل BX القيم المطلوبة ثم نخزنها في المكدسة وبعدها ننسخها الى مسجل الرايات
مثلا:
MOV BX,0000000001010001B

PUSH BX
POPF
هنا تم التحكم في الرايات CF=AF=ZF=1 وباقي الرايات قيمتها صفر




 

MaZeN غير متواجد حالياً   رد مع اقتباس
قديم 20-02-2008   #16 (permalink)

مشرف سابق

 
الصورة الرمزية MaZeN

 



 
مرشح مرة واحده في موضوع واحد
عدد مرات الفوز : 0
MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.
إرسال رسالة عبر مراسل MSN إلى MaZeN إرسال رسالة عبر مراسل Yahoo إلى MaZeN
افتراضي رد: دروس في لغة الاسمبلي (متجدد)


الماكرو


الماكرو : هوعبارة عن مجموعة اوامر لها اسم ويمكن استدعاء هذه مجموعة الاوامر عن طريق تسجيل اسم الماكرو. يمكن استدعاء الماكرو اكثر من مرة في البرنامج. فيمكن القول ان لاستخدام الماكرو عدة فوائد منها:
1.تقليل الاخطاء فيمكن تسجيل اسم الماكرو بدلا من كتابة الاوامر مرة ثانية وهذا يقلل من الوقوع في اخطاء املائية
2.زيادة البرنامج وضوحا . فبدلا من كتابة اوامر فاننا نسجل كلمات عادية مفهومة وهي اسماء الماكرو وتدل على ما يعمله هذا الماكرو
3.سرعة التغيير: اذا اردنا ان نضيف او نحذف اوامر معينة فبدلا من اجراء هذه التغييرات في جميع الاماكن التي تتواجد بها هذه الاوامر فعند استخدام الماكرو يكفي ان نغير في الماكرو.
4.زيادة سرعة البرنامج لان الماكرو يزرع الاوامر التي يحتويها في المكان الذي نستدعيه فيه
ملاحظة: الماكرو يكبر حجم البرنامج وهذا يعد صفة سلبية للماكرو


انواع الماكرو
يمكن تقسيم الماكرو حسب عدة مواصفات نأخذ التقسيم الاول
1.هنالك انواع لا تأخذ برامترات
2.هنالك انواع تأخذ برامترات
ماكرو بدون برامترات
المبنى العام للماكرو الذي لا يأخذ برامترات هوكما يلي:

Macro name macro
الاوامر
Endm
مثال : اكتب ماكرو يقوم بمسح الشاشة:
الحل:
Clear_screen macro
Mov ax,3
Int 10h
Endm
مثال اخر
اكتب ماكرو يطبع يستقبل من لوحة المفاتيح رمزا
الحل:
Read_char macro
Mov ah,1
Int 21h
Endm
مثال اخر
اكتب ماكرو يطبع نجمة على الشاشة
الحل:
Print_star macro
Mov dl,'*'
Mov ah,2
Int 21h
Endm
ملاحظات:

عليك الانتباه الى ما يلي:

1.عليك ان تحفظ قيم المسجلات التي سوف تستخدمها في الماكرو اذا كانت تحتوي على قيم مهمة بالنسبة لك وانت بحاجة اليها لان اوامر الماكرو سوف تغير القيم. هنالك عدة طرق لحفظ قيم المسجلات نذكر منها:
أ.قبل استدعاء الماكرو نقوم بتخزين القيم في مسجلات ثانية او نخزنها في الذاكرة وبعد الانتهاء من الماكرو نرجع القيم
مثال:
Mov bx,ax
Clear_screen
Mov ax,bx
نلاحظ هنا اننا قمنا بحفظ قيمة المسجل ax في المسجل bx قبل استدعاء الماكرو وبعد استدعاء الماكرو تمت عملية ارجاع القيمة الى المسجل ax
ب.يمكن ان نحفظها في داخل الماكرو قبل القيام في الاوامر الرئيسية مثلا
Clear_screen macro
Push ax
Mov ax,3
Int 10h
Pop ax
Endm
نلاحظ في التمرين السابق اننا حفظنا الماكرو في المكدسة (stack segment ) قبل ان نقوم بعملية مسح الشاشة وقبل الخروج من الماكرو تمت عملية ارجاع القيم من المكدسة
2.يمكن استدعاء ماكرو من داخل ماكرو اخر
مثال:
طور ماكرو يقوم بمسح الشاشة واستقبال رمز من لوحة المفاتيح ثم يطبع الرمز
الحل:
Print_mac macro
Clear_screen
Read_char
Mov dl,al
Mov ah,2
Int 21h
Endm
هنا تم استدعاء الماكرو clear_screen والماكرو readl_char
3.عندما نستخدم LEBLE (عنوان) في الماكرو يجب ان نعرفها بمساعدة الكلمة المحفوظة LOCAL أي اننا نقول لبرنامج الترجمة بان هذا العنوان هو عبارة عن عنوان محلي معروف في الماكرو فقط .
ملاحظة: عند استخدام عنوان والتوجه اليه اكثر من مرة عن طريق اوامر الماكرو او استدعاء الماكرواكثر من مرة فان برنامج الترجمة سوف يعلن عن خطأ
مثال:
اكتب ماكرو يطبع الارقام من 0 الى 9
الحل:
Print_numbers macro
Local t1
Mov cx,10
Mov dl,'0'
T1:mov ah,2
Int 21h
Inc dl
Loop t1
Endm
ملاحظة: اذا كان لدينا اكثر من عنوان محلي في الماكرو نسجل العناوين ونفصل بين العناوين بمساعدة فاصلة
Local t1,t2,t3
4.للخروج من الماكرو من أي نقطة نريدها أي قبل نهاية الماكرو نستخدم الامر exitm
مثال:
Check macro
Local t1,t2
Mov cx,10
T1:Mov ah,1
Int 21h
Cmp al,'B'
Jz t2
Inc dh
exitm
T2:dec dh
loop t1
endm
حل اخر بدون استخدام exitm

Check macro
Local t1,t2,t3
Mov cx,10
T1:Mov ah,1
Int 21h
Cmp al,'B'
Jz t2
Inc dh
Jmp t3
T2:dec dh
loop t1
t3:nop
endm
5.اذا اردنا ان نسجل ملاحظات في داخل الماكرو نستخدم الفاصلة المنقوطة مرتين
مثال:
Print_char macro
Mov ah,1 ;;put 1 in ah
Int 21h
Mov dl,al ;;put the ascii_code of the char in dl
Mov ah,2
Int 21h
Endm
اكتب برنامجا ينفذ ما يلي:
1.ينظف الشاشة
2.يطبع على الشاشة الجملة enter a char
3.يستقبل رمزا من لوحة المفاتيح
4.ينزل سطر جديد
5.اذا كان الرمزعبارة عن رقم [0..9]
عندها يطبع الرمز وينتهي البرنامج
والا ينظف الشاشة ويطبع نجمة ويرجع الى الفرع 2

الحل:
.model small
.stack 20h
.data
NL db 10,13,'$'
msg db 'enter a char$'
clear_screen macro
mov ax,3
int 10h
endm
print_char macro
mov dl,al
mov ah,2
int 21h
endm
read_char macro
mov ah,1
int 21h
endm
new_line macro
lea dx,NL
mov ah,9
int 21h
endm
print_msg macro
lea dx,msg
mov ah,9
int 21h
endm
.code
start: mov ax,@data
mov ds,ax
clear_screen
t2:print_msg
read_char
mov bl,al
new_line
sub bl,30h
cmp bl,9
ja t1
add bl,30h
mov al,bl
print_char
jmp finish
t1:clear_screen
mov al,'*'
print_char
jmp t2
finish:mov ah,4ch
int 21h
end start





 

MaZeN غير متواجد حالياً   رد مع اقتباس
قديم 21-02-2008   #17 (permalink)

مشرف سابق

 
الصورة الرمزية MaZeN

 



 
مرشح مرة واحده في موضوع واحد
عدد مرات الفوز : 0
MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.
إرسال رسالة عبر مراسل MSN إلى MaZeN إرسال رسالة عبر مراسل Yahoo إلى MaZeN
افتراضي رد: دروس في لغة الاسمبلي (متجدد)


الجزء الثاني من درس الماكرو

الماكرو الذي يأخذ برامترات
المبنى العام للماكرو مع برامترات

Macro name macro p1,p2,….,pn
الاوامر
Endm
P1,p2,…pn : هي البرامترات
مثال :
اكتب ماكرو يتلقى برامترين من نوع byte ويحفظ بالمسجل al البرامتر الاكبر
Max_num macro x,y
Local t1,finish
Mov al,x
Cmp y,al
Jg t1
Jmp finish
T1:mov al,y
Finish:
Endm
ملاحظة: عندما نريد استخدام الماكرو في موقع معين في البرنامج نسجل اسم الماكروونسجل البرامترات المطلوبة.
مثلا في حالة استدعاء الماكروالسابق نسجل
Max_num DH,DL
هنا تم اعطاء الماكرو المسجلات DH و DL كبرامترات

Max_num 7,9
هنا تم اعطاء الماكرو القيم 7 ، 9 كبرامترات
Max_num x1,x2
هنا تم اعطاء الماكرو متغيرين x1 , x2 كبرمترات
في كثير من الحالات يفضل استخدام الماكرو مع برامترات لانه يعطينا امكانية استخدام الماكرو لعدة عمليات.
مثال:معطى في مقطع البيانات
.data
NL db 10,13,'$'
Msg1 db 'enter the first number….$'
Msg2 db 'enter the second number..$'
Msg3 db 'your number is out the range$'
الان نسجل الماكروات المطلوبة ولكن بدون برامترات
هذا الماكرو مسؤول عن النزول الى سطر جديد
New_line macro
Lea dx,NL
Mov ah,9
Int 21h
Endm
هذا الماكرو مسؤول عن طباعة الجملة الاولى
Print_msg1 macro
Lea dx,msg1
Mov ah,9
Int 21h
Endm
هذا الماكرو مسؤول عن طباعة الجملة الثانية
Print_msg2 macro
Lea dx,msg2
Mov ah,9
Int 21h
Endm
هذا الماكرو مسؤول عن طباعة الجملة الثالثة
Print_msg3 macro
Lea dx,msg3
Mov ah,9
Int 21h
Endm

وفي داخل البرنامج نسجل

New_line
Print_msg1
Print_msg2
Print_msg3
نلاحظ من العمليات السابقة اننا بحاجة الى ماكرو لكل عملية
الحل الامثل هو استخدام ماكرو مع برامترات
الحل:
Print_mac macro x
Lea dx,x
Mov ah,9
Int 21h
Endm

وفي داخل البرنامج نسجل

Print_mac NL
Print_mac msg1
Print_mac msg2
Print_mac msg3
كما نلاحظ انه بمساعدة ماكرو واحد من نوع ماكرو مع برامترات تم اجراء جميع العمليات السابقة.
الان ننتقل الى نوع جديد وهوالماكرو المتكرر
وهو ماكرو يقوم بتنفيذ مجموعة الاوامر الموجودة فيه عدد مرات معروفة مسبقا
يسجل هذا الماكرو بشكل عام داخل مقطع البيانات
المبنى العام لهذا الماكرو
Rept n
الاوامر
Endm
بحيث n عبارة عن قيمة عددية او تعبيرا يرجع قيمة عددية او اسم ثابت من الثوابت المعرفة في البرنامج او امر يرجع قيمة عددية . بالاختصار المهم ان يكون قيمة عددية
مثال:
اكتب ماكرو يطبع النجمة 5 مرات
Rept 5
Mov dl,'*'
Mov ah,2
Int 21h
Endm
سؤال: ماذا ينفذ الماكرو التالي:
Rept 4
Add ax,2
Endm
الجواب: الماكرو السابق يمكن تغييره بالاوامر التالية
Add ax,2
Add ax,2
Add ax,2
Add ax,2
أي انه يجمع 8 للمسجل ax
المثال التالي يقوم بطباعة الاحرف الانجليزية على نفس السطر بمساعدة الماكرو المتكرر.
.model small
.stack 20h
.data
Clear_screen macro
Mov ax,3
Int 10h
Endm
.code
start: mov ax,@data
mov ds,ax
clear_screen
mov dl,'A'
rept 26
mov ah,2
int 21h
inc dl
endm
finish:mov ah,4ch
int 21h
end start
الان ننتقل الى نوع اخر من الماكرو وهو ايضا ماكرو متكرر ولكن هنا يتم استخدام جميع البرامترات في كل دورة نستخدم برامتر الذي يصل اليه الدور
المبنى العام
Irp name1, <arg1,arg2,arg3,….,argN>
مجموعة الاوامر المراد تكرارها
Endm
مثال:
Irp num , <10,20,30>
Add ax,num
Endm
الماكرو السابق ينفذ الاوامر التالية
Add ax,10
Add ax,20
Add ax,30
بالاختصار تم اضافة 60 للمسجل ax
مثال اخر
Irp push_reg, <ax,bx,cx,dx>
Push push_reg
Mov push_reg,0
End
الماكروالسابق ينفذ الاوامر التالية:
Push ax
Mov ax,0
Push bx
Mov bx,0
Push cx
Mov cx,0
Push dx
Mov dx,0

 

MaZeN غير متواجد حالياً   رد مع اقتباس
قديم 27-02-2008   #18 (permalink)

مشرف سابق

 
الصورة الرمزية MaZeN

 



 
مرشح مرة واحده في موضوع واحد
عدد مرات الفوز : 0
MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.
إرسال رسالة عبر مراسل MSN إلى MaZeN إرسال رسالة عبر مراسل Yahoo إلى MaZeN
افتراضي رد: دروس في لغة الاسمبلي (متجدد)


الدوال
تستخدم الدوال لتسهيل عملية البرمجة واجراء التغييرات السريعة وتقليل نسبةالوقوع في الاخطاء الكتابية . انظر مادة الماكرو
الفرق بين الدالة والماكرو
1.الماكرو يؤدي الى سرعة البرنامج بينما الدوال تخفف من سرعة البرنامج لان المعالج يقوم بالتوجه الى اوامر الدالة بعداستدعائها بينما الماكرو يزرع اوامره في الاماكن المطلوبة قبل ان يتوجه اليه المعالج لتنفيذ اوامره أي انها جاهزة للتنفيذ
2.الماكرو يكبر من حجم البرنامج لانه يزرع الاوامر من البداية بينما الدالة فقط عند الاستدعاء تقوم بزرع الاوامر
3.الدالة بحاجة الى مكدس لحفظ عنوان العودة بينما الماكرو ليس بحاجةالى المكدس

الامر jmp هو امر يؤدي الى القفز لعنوان معين في البرنامج بدون رجوع ولكن عند استدعاء دالة معينة فهنا يتم القفزالى مجموعة اوامر بحيث يقوم المعالج بتنفيذها وبعد الانتهاء من تنفيذ هذه الاوامر يتم الرجوع الى الامر الموجود بعد الامر الذي ادى الى استدعاء الدالة.

الدالة:هي عبارة عن مقطع برنامج يتم الانتقال اليه عندما نقوم باستدعاء الدالة وفي نهاية المقطع يجب ان يكون هنالك امر انهاء للمقطع الذي يرجع المعالج الى الامر الذي يلي امر الاستدعاء لذلك يجب على المعالج ان يحفظ عنوان الامر الذي يجب الرجوع اليه قبل ان يقوم بعملية القفز. يخزن عنوان الرجوع في المكدس stack segment .

الامر call : بمساعدة هذا الامر يتم استدعاء الدالة.
المبنى العام للامر:
Call اسم الدالة
الامر call يضع عنوان الرجوع في المكدس (stack segment). عنوان الرجوع بطول 16bit او 32bit حسب نوع الدالة.

المسجلات ip أو cs و ip تأخذ عنوان الدالة المراد تنفيذها عند استدعاء الدالة
ملاحظة: الامر call لا يؤثر على مسجل الرايات

الامر ret
الامر ret يستخدم هذا الامر للرجوع من الدالة.
مبنى الامر ret
Ret n
الرمز n يمثل عدد البايتات (bytes) التي يجب تنظيفها في المكدس عند الرجوع من الدالة.
المقصود بعملية التنظيف هو القفز عن البايتات وذلكعن طريق تغيير رأس المكدس المسجل SP
ملاحظة: اذا اردنا ان لا نقوم بعملية تنظيف بايتات في المكدس نسجل الامر ret بدون n
ملاحظة: الامر ret لا يؤثر على مسجل الرايات
انواع الدوال
هنالك نوعان من الدوال
1.دالة قريبة: وهي دالة الموجودة في نفس مقطع الاوامر(code segment) الرئيسي
2.الدالة البعيدة : وهي الدالة الموجودة في مقطع اوامر اخر.

المبنى العام لدالة قريبة
Function_name proc near
اوامر الدالة
Function_name endp
ملاحظة: يمكن الاستغناء عن الكلمة near
Function_name proc
اوامر الدالة
Function_name endp

مثال:
أكتب دالة قريبة التي تضيف 10 للمسجل al وتفحص اذا كانت النتيجة سالبة اذا تحقق الشرط تضع 1 في المسجل bl والا فانها تضع صفرفي المسجل bl
الحل:
Add_num proc near
Add al,10
Cmp al,-1
Jg t1
Mov bl,1
Jmp t2
T1:mov bl,0
T2: Ret
Add_num endp

مثال اخر:
أكتب دالة التي تضرب المسجل bl في العدد 10 وتفحص اذا كانت النتيجة اكبر من 50H اذا تحقق الشرط تضع في القيمة 2 في المسجل dl والا فانها تعوض 0 في المسجل dl . عليك تنظيف 4 bytes من المكدس stack في نهاية الدالة
الحل:
mul_num proc near
mov al,bl
mov cl,10
imul cl
cmp ax,50H
Jg t1
Mov dl,0
Jmp t2
T1:mov dl,2
T2: Ret 4
mul_num endp
المبنى العام لدالة بعيدة
Func_name proc far
اوامر الدالة
Func_name endp
اعطاء البرامترات للدوال
يمكن اعطاء الدالة برامترات في شكلين :
أ.by value : في هذه الحالة نعطي الدالة صورة من المتغير وتقوم الدالة باجراء العمليات الحسابية والتغييرات على النسخة وليس على الاصل وفي هذه الحالة قيمة المتغير الاصلية لا تتغير.

ب.by reference : في هذه الحالة نعطي الدالة عنوان المتغير فعندما تقوم الدالة باجراء تغييرات على المتغير فانها تؤثر على قيمة المتغير الاصلية ايضا.

طرق ارسال القيم للدالة
يمكن ارسال قيم للدالة بطريقتين
1.بمساعد مسجلات: في هذه الحالة قبل استدعاء الدالة نقوم بحفظ القيم في مسجلات معينة وبعدها نستدعي الدالة وتتوجه الدالة الى هذه المسجلات وتأخذ القيم المطلوبة.
مثال:
اكتب دالة تقوم بضرب قيمتين وحفظ النتيجة في المسجل BX
الحل:
mul_numbers proc near
mov al,bl
imul cl
mov bx,ax
Ret
mul_numbers endp
هنا نرى ان الدالة سوف تأخذ القيم من المسجلات bl , cl
في البرنامج الرئيسي نسجل مثلا ما يلي:
Mov bl,5
Mov cl,8
Call mul_numbers
فهنا استخدمنا الدالة السابقة لضرب القيمة 5 بالقيمة 8 وتم ارسال البرامترات للدالة عن طريق المسجلات


2.المكدس (stack): هنا قبل استدعاء الدالة نقوم بارسال القيم الى المكدس وبعدها نستدعي الدالة وتقوم الدالة باخذ القيم من المكدس بمساعدة المسجل bp والامر mov

ملاحظة: تذكر ان الامر call يقوم باستدعاء الدالة المطلوبة وايضا يقوم بادخال عنوان الرجوع ايضا في المكدس وهذا العنوان بطول 16بت (دالة قريبة) او 32 بت (دالة بعيدة) اذا القيم موجودة في الخلايا التي تحت الخلايا التي تحتوي على عنوان العودة او الرجوع

تمرين:
اكتب دالة قريبة التي تتلقى قيمتين كل قيمة بكبر كلمة (word) عن طريق المكدس تقوم الدالة بجمع هذه القيم وتحفظ الدالة النتيجة في المسجل DX .
ملاحظة: على الدالة ان تخرج هذه القيم من منطقة المكدس في نهاية الدالة
الحل:
Test_proc proc near
Mov bp,sp
Add bp,2
Mov ax,[bp]
Add bp,2
Mov dx,[bp]
Add dx,ax
Ret 4
Test_proc endp
تمرين:
اكتب برنامجا كاملا يحتوي على دالتين الدالة الاولى لتنظيف الشاشة الدالة الثانية تتلقى قيمتين عن طريق المكدس وتقوم بجمع القيمتين وحفظ النتيجة في المسجل DX .
الحل:
.model small
.stack 20h
.Data
.code
Start:mov ax,@data
Mov ds,ax
call clean
Mov bx,3
Push bx
Mov bx,6
Push bx
Call test_proc

Mov ah,4ch
Int 21h
clean proc near
mov ax,3
int 10h
ret
clean endp
Test_proc proc near
Mov bp,sp
Add bp,2
Mov ax,[bp]
Add bp,2
Mov dx,[bp]
Add dx,ax
Ret 4
Test_proc endp
End start






 

MaZeN غير متواجد حالياً   رد مع اقتباس
قديم 02-03-2008   #19 (permalink)

مشرف سابق

 
الصورة الرمزية MaZeN

 



 
مرشح مرة واحده في موضوع واحد
عدد مرات الفوز : 0
MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.MaZeN سمعته مابعدها سمعة.
إرسال رسالة عبر مراسل MSN إلى MaZeN إرسال رسالة عبر مراسل Yahoo إلى MaZeN
افتراضي رد: دروس في لغة الاسمبلي (متجدد)


العمليات الحسابية على النصوص
كود BCD
BCD-CODE: binary coded decimal code
معظم المدخلات العددية هي من نوع نص والتي تمثل اعداد عشرية. احدى الطرق لمعالجة هذه المدخلات هي ترجمة هذا النص لعدد في الميزان الثنائي وبعدها القيام بالعمليات الحسابية المطلوبة واذا اردنا ان نعرض النتيجة نقوم بتحويل النتيجة من قيمة عددية الى نص ثم نعرض النص على الشاشة مثلا. عملية الترجمة المزدوجة من نص الى قيمة عددية ومن قيمة عددية الى نص بحاجة الى وقت أي اننا نخسر وقتا طويلا في عمليات الترجمة.
طريقة ثانية لمعالجة النصوص هي ان نقوم باجراء العمليات الحسابية على النصوص وبعدها نقوم بتصحيح النتيجة بمساعدة امر معين للحصول على شكل قيمة عشرية. حتى يكون التصحيح بسيطا قاموا بانشاء كود BCD
ما يميز هذا الكود هو ان:
الرموز المستعملة في هذا الكود هي 0 ,1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9
هنالك نوعان لتمثيل لهذا الكود
1.packed BCD : في هذه الحالة كل بايت يحتوي على خانتين أي كل خانة بحاجة الى 4 بتات
2.unpacked BCD : في هذه الحالة كل بايت يحتوي على خانة واحدة فقط أي كل خانة بحاجة الى 8 بتات
اليكم الجدول التالي الذي يظهر بعض الاعداد في الميزان العشري وكود BCD
الميزان العشري
Packed BCD
Unpacked BCD
0
0H
00H
1
1H
01H
2
2H
02H
3
3H
03H
4
4H
04H
5
5H
05H
6
6H
06H
7
7H
07H
8
8H
08H
9
9H
09H
11
11H
0101H
12
12H
0102H
58
58H
0508H
215
215H
020105H

عمليات تصحيح النتيجة
الان ننظر الى العمليات الحسابية التالية:
الميزان العشري
BCD-code
12
+11
---
23
12H
+11H
-----
23H

النتيجة السابقة صحيحة اذا في هذه الحالة النتيجة ليست بحاجة الى تصحيح
ننظر الى العملية التالية:

الميزان العشري
BCD-code
12
+19
---
31
12H
+19H
-----
2BH

اذا نظرنا الى النتيجة فان النتيجة تحتوي على رمز B وهذا الرمزغير مسموح فيه في BCD-CODE
الحل:
اذا اضفنا القيمة 6 الى الخانة الغير منطقية في النتيجة تتم عملية التصحيح انظر الحل:
2BH+06H=31H
انظر الى التمرين التالي:


الميزان العشري
BCD-code
18
+19
---
37
18H
+19H
-----
31H


اذا نظرنا الى النتيجة نرى ان خانات النتيجة من الرموز المسموح فيها ولكن التيجة بحاجة الى تعديل للحصول على الشكل المطلوب.
الحل ان نضيف للنتيجة 6
31H+06H=37H
السبب هنا هو ان الخانة الاولى بعد عملية الجمع اعطت الخانة الثانية القيمة 1 . أي ان AF=1 (انظر مسجل الرايات)
بالاختصار هنالك حالتان يجب ان نصحح النتيجة فيهما
1.اذا كانت النتيجة تحتوي على رمز ليس من الرموز المسموح فيها في BCD-CODE بالاختصار اذا كانت احدى الخانات اكبر من 9
2. اذا كان AF=1
لتصحيح النتيجة تستخدم الاوامر التالية:
ملاحظة: من النفضل ان نطلب تصحيح النتيجة بعد كل عملية لاننا لا نعرف اذا كنا بحاجة او لا ولكن المعالج يمكنه ان يميز اذا نحن لسنا بحاجة الى فحص النتيجة وبعدها نقرر وانما نطلب من المعالج ان يصحح بعد كل عملية وهوالذي يقرر اذا كانت هنالك حاجة ام لا
1)AAA
ASCII adjust after addition
-يقوم هذا الامر بتصحيح النتيجة الموجودة في المسجل AL الى الشكل العشري في كود unpaked BCD وتضع النتيجة الجديدة في المسجل AX
-يستخدم هذا الامر بعد عملية جمع بين قيمتين من نوع unpaked BCD او بكود ASCII

مثال:
MOV ax,0
Mov al,5
Add al,8
AAA
بعد هذه العملية
AX=0103H
تمرين اخر:
Mov ax,0108H
add al,'7'
AAA
بعد هذه العملية:
AX=0205H
2)DAA
decimal adjust after addition
يقوم هذا الامر بتصحيح النتيجة الموجودة في المسجل AL لخانتين في packed BCD .
نستخدم هذا الامر بعد عملية جمع بين قيمتين من نوع packed BCD
مثال:
Mov ax,0
Mov al,45H
Add al ,28H
DAA
بعد هذا المقطع
AX=0073H
3)AAS
ASCII ADJUST AFTER SUBTRACTION
هذا الامر يقوم بتصحيح النتيجة في المسجل AL لعدد عشري في هيئة unpacked BCD
نستخدم هذا الامر بعد عملية طرح بين قيمتين من نوع
unpacked BCD او ASCII-code
مثال:
Mov ax , 0105H
Sub al,08H
AAS
بعد هذا المقطع
AX=0007
4)DAS
decimal adjust after subtraction


يقوم هذا الامر بتصحيح النتيجة الموجودة في المسجل AL لخانتين عشرية في هيئة packed BCD .
نستخدم هذا الامر بعد عملية طرح بين قيمتين من نوع packed BCD
مثال:
Mov ax,0
Mov al,45H
sub al ,28H
DAS
بعد هذا المقطع
AX=0017H
5)AAM
ASCII adjust after multiply
هذا الامر يقوم بتصحيح القيمة الموجودة في المسجل AL الى خانتين في هيئة unpacked BCD . نتيجة التصحيح تخزن في المسجل AX كله بحيث خانة العشرات تخزن في المسجل AH وخانة الاحاد في المسجل AL .
نستخدم هذا الامر بعد عملية الضرب
Mov al,04H
Mov CL , 08H
MUL CL
AAM
بعد هذا المقطع
AX=0302H
ملاحظة:نستخدم هذا الامر احيانا بدون أي صلة للضرب لتحويل عدد من الميزان السادس عشر الى عدد في كود unpacked BCD بشرط ان لا يكون العدد اكبر من 99
مثال:
Mov ax,0013H
AAM
هنا نحصل على
AX=0109H


6)AAD
ASCII adjust for Division
يقوم هذا الامر بتصحيح القيمة الموجودة في المسجل AX والتي هي على unpacked BCDقبل عملية القسمة الى قيمة في الميزان السادس عشر hex .
مثال:
Mov CL,06H
Mov ax,0109H
AAD
DIV CL
بعد الامر AAD تصبح قيمة المسجل AX=0013H
وبعد عملية القسمة DIV CL
AL=03 , AH=01
أي ان AX=0103H

ملاحظة:نستخدم هذا الامر احيانا بدون أي صلة للقسمة لتحويل عدد في كود unpacked BCD الى عدد في الميزان السادس عشر بشرط ان لا يكون العدد اكبر من 99
مثال:
Mov ax,0201H
AAD
هنا نحصل على
AX=0015H

 

MaZeN غير متواجد حالياً   رد مع اقتباس
قديم 24-05-2008   #20 (permalink)

مشرف سابق

 
الصورة الرمزية البرنس محمد على

 



 
عدد الترشيحات : 0
عدد المواضيع المرشحة : 0
عدد مرات الفوز : 0
البرنس محمد على في اول طريق الابداعالبرنس محمد على في اول طريق الابداعالبرنس محمد على في اول طريق الابداعالبرنس محمد على في اول طريق الابداعالبرنس محمد على في اول طريق الابداعالبرنس محمد على في اول طريق الابداع
إرسال رسالة عبر مراسل Yahoo إلى البرنس محمد على
افتراضي رد: دروس في لغة الاسمبلي (متجدد)


بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
شـكــ وبارك الله فيك ـــرا لك ... لك مني أجمل تحية .

 

التوقيع





البوسة دى للاهلوية فقط

البرنس محمد على غير متواجد حالياً   رد مع اقتباس
قديم 03-07-2008   #21 (permalink)

عضو جديد

 



 
عدد الترشيحات : 0
عدد المواضيع المرشحة : 0
عدد مرات الفوز : 0
ss-00 في اول طريق الابداع
Ylsurprise رد: دروس في لغة الاسمبلي (متجدد)


السلام عليكم
بارك الله فيك أخي مازن على الدروس وجعلها الله في ميزان حسناتك أرجو أن تكمل هذه السلسلة من الدروس وخاصة حول الشاشة أي جانب الرسم

 

ss-00 غير متواجد حالياً   رد مع اقتباس
قديم 04-07-2008   #22 (permalink)

نائب مدير الموقع

 
الصورة الرمزية Bassamo

 



 
عدد الترشيحات : 3
عدد المواضيع المرشحة : 3
عدد مرات الفوز : 0
Bassamo سمعته مابعدها سمعة.Bassamo سمعته مابعدها سمعة.Bassamo سمعته مابعدها سمعة.Bassamo سمعته مابعدها سمعة.Bassamo سمعته مابعدها سمعة.Bassamo سمعته مابعدها سمعة.Bassamo سمعته مابعدها سمعة.Bassamo سمعته مابعدها سمعة.Bassamo سمعته مابعدها سمعة.Bassamo سمعته مابعدها سمعة.Bassamo سمعته مابعدها سمعة.
إرسال رسالة عبر مراسل MSN إلى Bassamo إرسال رسالة عبر مراسل Yahoo إلى Bassamo
افتراضي رد: دروس في لغة الاسمبلي (متجدد)


مشكور حبيب قلبي على الشرح المميز لهذه اللغة الهامة من لغات البرمجة

ننتظر منكم كل ما هو جديد ومميز

 

التوقيع



Bassamo غير متواجد حالياً   رد مع اقتباس
رد

مواقع النشر

الكلمات الدلالية (Tags)
متجدد, لغة, الاسمبلي, دروس

LinkBacks (?)
LinkBack to this Thread: http://www.lifenet-sy.com/vb/t10037.html
أرسلت بواسطة For Type التاريخ
Untitled document This thread Refback 23-12-2008 03:56 PM


الذين يشاهدون محتوى الموضوع الآن : 1 ( الأعضاء 0 والزوار 1)
 
أدوات الموضوع
طرق مشاهدة الموضوع


المواضيع المتشابهه
الموضوع كاتب الموضوع المنتدى مشاركات آخر مشاركة
دروس بي اتش بي باستخدام دريم ويفر بريق الشوق دروس تعليم الكمبيوتر و الانترنت 2 18-12-2009 11:55 PM
دروس جميلة blackrose2003 العام 7 10-11-2008 10:26 PM
دروس في c شارب متجدد MaZeN لغات البرمجة 7 10-11-2008 01:30 PM
دروس في الحب أبو رامز الإسلامي 12 06-11-2008 09:12 AM

   
Preview on Feedage: %D9%84%D8%A7%D9%8A%D9%81-%D9%86%D8%AA Add to My Yahoo! لايف نت Add to Google! لايف نت Add to AOL! لايف نت Add to MSN لايف نت  

Blog

لايف نت

lifenet-sy.org خريطة لايف نت lifenetextra.com أعضاء
LifeNet English أكواد ألوان SiteMap أعلن هنا Pagerank تصميم ثيمات