المنتدى بحاجة الى مشرفين ومشرفات لجميع الاقسام لتقديم الطلب في قسم الاقتراحات والشكاوي كلمة الإدارة


الإهداءات


العودة   منتدى الدكتور نوكيا > ~*¤ô§ô¤*~القسـم التقـني والبـرامج ~*¤ô§ô¤*~ > الكتب الالكترونية


إضافة رد
 
LinkBack أدوات الموضوع انواع عرض الموضوع
قديم 18-04-2010, 11:06 AM   #11
administrator
 
الصورة الرمزية جمال الزرقاء
 
تاريخ التسجيل: Dec 2005
رقم العضوية: 1927
الدولة: بداخل الالكترونيات
العمر: 39
المشاركات: 2,917
بمعدل: 0.64 (مشاركة/اليوم)



افتراضي

 

الفصل الخامس
التفرع وتعليمات ضبط الانسياب Flow Control Instructions

لكي نكتب برنامج يقوم بعمل محدد غالبا ما يتم استخدام أوامر التفرع التي تجعل المبرمج قادراً علي اتخاذ قرارات محددة وتؤدي أوامر التفرع والتكرار إلي تنفيذ برامج فرعية ويعتمد هذا التفرع أو التكرار عادة علي قيم محددة للمسجلات وذلك عن طريق بيارق الحالة Status Flags والتي تتأثر دائماً بآخر عملية تم تنفيذها.
سنقوم في هذا الفصل بتوضيح أوامر التفرع المختلفة وسنستخدمها في تمثيل عبارات التكرار والتفرع في اللغات العليا HIGH LEVEL DrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokia وذلك بإعادة كتابتها بلغة التجميع .
مثال للتفرع :
لتوضيح عمل أوامر التفرع سنبدأ بمثال يقوم بطباعة الحروف المستخدمة كلها وذلك عن طريق طباعة جدول الحروف ASCII Table كاملاً .
.Model Small
.Stack 100h
.Code
MAIN PROC
MOV AH , 2
MOV CX , 256
MOV DL , 0
Print_Loop:
INT 21h ;DL
اطبع الحرف الموجود في المسجل
INC DL ; تجهيز الحرف التالي
DEC CX ; انقص العداد
JNZ PRINT_LOOP ; إذا لم ننتهي تفرع إلى العنوان المحدد
; DOS_EXIT
MOV AH , 4Ch
INT 21h
MAIN ENDP
END MAIN

يوجد لدينا عدد 256 حرف في IBM Character Set منها الحروف والأرقام والحروف الخاصة. لإظهار الحروف في الشاشة يتم استخدام الخدمة رقم 2 (إظهار حرف واحد فقط ) وذلك بوضع الرقم 2 في المسجل AH . تم استخدام المسجل DL ليحوى الحرف المطلوب طباعته لذلك تم وضع الرقم 0 فيه كقيمة ابتدائية وزيادته في كل مرة كما تم استخدام المسجل CX كعداد بقيمة ابتدائية 256 وإنقاصه في كل مرة حتى تصل قيمته إلي الصفر.
استخدم الأمر (Jump if Not Zero) JNZ وهو الأمر الذي يضبط الحلقة وذلك للتفرع إلى العنوان المحدد (Print-Loop) إذا تم إنقاص المسجل CX بواحد ولم تصل النتيجة إلى الصفر ويتم ذلك عن طريق استعمال بيرق الصفر ZF . فإذا كانت النتيجة لا تساوي صفر
(ZF= 0) يتم القفز إلى العنوان المحدد أما إذا كانت النتيجة تساوي الصفر (ZF= 1) يتم الاستمرار في البرنامج و العودة إلى نظام التشغيل باستخدام الخدمة رقم 4CH .
التفرع المشروط CONDITIONAL JUMP
الأمر JNZ السابق هو مثال لأوامر التفرع المشروط. و يكون أمر التفرع المشروط على الصورة
Jxxx destination-Label
فإذا تحقق الشرط المحدد يتم تفرع البرنامج إلى العنوان الموضح كمعامل للأمر، ويكون الأمر التالي هو الأمر الموجود في العنوان المحدد .أما إذا لم يتحقق الشرط يتم الاستمرار كالمعتاد إلى الأمر التالي مباشرة .
في حالة التفرع يجب أن يكون العنوان الذي سيتم التفرع عليه على بعد 126 قبل العنوان الحالي أو 127 بعد العنوان الحالي وسنرى فيما بعد كيفية التفرع إلى أماكن أبعد من هذا المدى .
كيف يقوم المعالج بتنفيذ عملية التفرع المشروط ؟
يقوم المعالج باستخدام البيارق لتحديد عملية التفرع . حيث أن البيارق تعكس الحالة بعد تنفيذ آخر عملية وبالتالي فإن أوامر التفرع يجب أن تعتمد على بيرق محدد أو بيارق محددة حيث يتم التفرع إذا تم رفع هذه البيارق .
إذا تحقق التفرع يقوم المعالج بتحميل مؤشر التعليمات IP بالقيمة المحددة بالعنوان الموجود في أمر التفرع .أما إذا لم يتم تحقق الشرط فإن مؤشر التعليمات يواصل إلى العنوان التالي مباشرة .
ففي المثال السابق نجد الأمر
JNZ PRINT-LOOP
وهذا يعني أنه إذا كان بيرق الصفر لا يساوي واحد ZF= 0 فإنه يتم التفرع إلى العنوان PRINT-LOOP وذلك بتحميل مؤشر التعليمات بالعنوان . أما إذا كانت النتيجة تساوي الصفر (ZF= 1 ) فإن البرنامج يواصل إلى الخطوة التالية.
تنقسم أوامر التفرع المشروط إلى ثلاثة مجموعات :
المجموعة الأولى التفرع بالإشارة Signed Jumps وتستخدم في حالة استخدام الأرقام بالإشارة Singed Numbers
المجموعة الثانية التفرع بدون إشارة Unsigned Jumps وتستخدم في حالة استخدام الأرقام بدون إشارة Unsigned Numbers .
التفرع ببيرق واحد Single Flag Jumps والتي تعتمد على بيرق محدد .
الجداول التالية توضح أوامر التفرع المختلفة . لاحظ أن الأمر قد يأخذ أكثر من اسم مثلا JG وJNLE حيث تعني تفرع إذا كانت النتيجة أكبر JG أو تفرع إذا كانت النتيجة ليست أصغر من أو تساوي . ويمكن استخدام أي من الأمرين لأنهما يؤديان إلى نفس النتيجة .




1-التفرع بالإشارة Signed Jumps
الأمر
الوصف
شرط التفرع
JG / JNLE
تفرع في حالة أكبر من ( ليس أصغر من أو يساوي )
ZF=0 & SF=OF
JGE / JNL
تفرع في حالة أكبر من أو يساوي ( ليس أصغر من )
SF=OF
JL / JNGE
تفرع في حالة أقل من ( ليس أكبر من أو يساوي )
SF<>OF
JLE / JNG
تفرع في حالة أقل من أو يساوي ( ليس أكبر من )
ZF=1 OR SF<>OF
2-التفرع بدون إشارة Unsigned Jumps
الأمر
الوصف
شرط التفرع
JA / JNBE
تفرع في حالة أكبر من (ليس أصغر من أو يساوي )
CF=0 & ZF=0
JAE / JNB
تفرع في حالة أكبر من أو يساوي ( ليس أصغر من )
CF=0
JB / JNAE
تفرع في حالة أقل من ( ليس أكبر من أو يساوي )
CF=1
JBE / JNA
تفرع في حالة أقل من أو يساوي (ليس أكبر من )
CF=1 OR ZF=1
3-التفرع ببيرق واحد Single Flag Jumps
الأمر
الوصف
شرط التفرع
JE / JZ
تفرع في حالة التساوي أو الصفر
ZF=1
JNE / JNZ
تفرع في حالة عدم التساوي ( لا يساوي الصفر )
ZF=0
JC
تفرع في حالة محمول Carry
CF=1
JNC
تفرع في حالة عدم وجود محمول Carry
CF=0
JO
تفرع في حالة الفيضان
OF=1
JNO
تفرع في حالة عدم حدوث الفيضان
OF=0
JS
تفرع في حالة النتيجة سالبة
SF=1
JNS
تفرع في حالة النتيجة موجبة
SF=0
JP / JPE
تفرع في حالة التطابق الزوجي
PF=1
JNP / JPO
تفرع في حالة التطابق الفردي
PF=0




الأمر CMP
الأمر Compare(CMP) يستخدم لمقارنة رقمين ويأخذ الصيغة :
CMP Destination , Source
يقوم البرنامج بعملية المقارنة عن طريق طرح المصدر source من المستودع destination ولا يتم تخزين النتيجة ولكن البيارق تتأثر , لا يقوم الأمر CMP بمقارنة موضعين في الذاكرة كما أن المستودع destination لا يمكن أن يكون رقم ثابت .
لاحظ أن الأمر CMP يماثل تماما الأمر SUB فيما عدا أن النتيجة لا يتم تخزينها .
افترض أن البرنامج يحتوي على التالي:
CMP Ax , Bx
JG Below
حيث AX=777Fh , BX=0001h فان نتيجة الأمر Ax,Bx CMP هي:
7FFFh - 0001h = 7FFEh
والتفرع هنا يتم حيث أن البيارق تكون zf = sf = of =0 والأمر JG يتطلب أن تكون
Zf = 0 و كذلك Sf = Of وعلى هذا يٍتم التفرع إلى العنوان المحدد Below .
في حالة التفرع المشروط ورغم أن عملية التفرع تتم حسب حالة البيارق المختلفة فان المبرمج ينظر إلى الأمر بدون تفاصيل البيارق فمثلا :
CMP AX,BX
JG Below
إذا كان الرقم الموجود في المسجل AX أكبر من الرقم الموجود في المسجل BX فان البرنامج يتفرع إلى العنوان Below .
بالرغم من أن الأمر CMP صمم خصيصا للتعامل مع التفرع المشروط ولكن يمكن لعبارة التفرع المشروط أن تكون بعد أي أمر آخر مثلا :
DEC CX
JNZ loop
يتم هنا التفرع إلى العنوان loop إذا لم تكن قيمة المسجل CX تساوي صفر.

التفرع بإشارة والتفرع بدون إشارة:
كل أمر تفرع بإشارة يناظره أمر تفرع بدون إشارة , مثلا الأمر JG يناظره الأمر JA واستخدام أي منهما يعتمد على طريقة التعامل مع الأرقام داخل البرنامج. حيث أن الجدول السابق قام بتوضيح أن كل عملية من هذه العمليات تعتمد على بيارق محددة حيث أن التفرع بإشارة يتعامل مع البيارق zf , sf , of بينما التفرع بدون إشارة يعتمد على البيارق zf , cf واستخدام الأمر غير المناسب قد يؤدي إلى نتائج غير صحيحة .







التوقيع
جمال الزرقاء غير متواجد حالياً  
Digg this Post!Bookmark Post in Technorati
رد مع اقتباس
قديم 18-04-2010, 11:07 AM   #12
administrator
 
الصورة الرمزية جمال الزرقاء
 
تاريخ التسجيل: Dec 2005
رقم العضوية: 1927
الدولة: بداخل الالكترونيات
العمر: 39
المشاركات: 2,917
بمعدل: 0.64 (مشاركة/اليوم)



افتراضي

 

مثلا إذا اسAx يحتوي على الرقم 7fffh والمسجل Bx يحتوي على الرقم 8000h وتم تنفيذ الأوامر التالية :
CMP AX,BX
تخدمنا الأرقام بإشارة وكان المسجل JA Below
فبالرغم من أن 7EFF > 8000h في حالة الأرقام بإشارة فان البرنامج لن يقوم بالتفرع إلى العنوان Below وذلك لأن 7FFFh < 8000h في حالة الأرقام بإشارة ونحن نستعمل الأمر JA الذي يتعامل مع الأرقام بدون إشارة .
التعامل مع الحروف:
عند التعامل مع الحروف يمكن استخدام الأرقام بإشارة أو بدون إشارة ذلك لأن الحروف تحتوي على الرقم 0 في الخانة ذات الوزن الأكبر MSB وعموما نستخدم الأرقام بدون إشارة في حالة التعامل مع الحروف المسماة الممتدة Extended ASCII Code والواقعة في المدى 80h - FFh .
مثال :
افترض أن المسجلين AX و BX يحتويان علي أرقام بإشارة، اكتب جزء من برنامج يضع القيمة الأكبر في المسجل CX.
MOV CX , AX
CMP BX , CX
JLE NEXT
NEXT: MOV CX,BX
التفرع الغير مشروط Unconditional Jump
يستخدم الأمر JMP للتفرع إلي عنوان محدد وذلك بدون أي شروط حيث الصيغة العامة للأمر هي:
Jmp Destination
ويكون العنوان الذي سيتم التفرع إليه داخل مقطع البرنامج الحالي وعلي ذلك فإن المدى الذي يمكن التفرع إليه أكبر من حالة التفرع المشروط. ويمكن استغلال هذه الخاصية كما في الجزء التالي وذلك لتحسين أداء التفرع المشروط.
TOP:
; Loop Body
عبارات الحلقة
Dec CX ; انقص واحد من العداد
JNZ TOP ; استمر في التفرع إذا كان العداد لا يساوي صفر
إذا احتوت الحلقة علي عبارات كثيرة بحيث يكون العنوان TOP بعيد جداً ( أبعد من 126 خانة ) فإن الأمر JNZ لن يصلح ولكن يمكن علاج هذه المشكلة بإعادة كتابة البرنامج علي النحو التالي واستخدام الأمر JMP الذي يتيح لنا التعامل مع مدي أكبر

TOP:
; Loop Body
عبارات الحلقة
DEC CX
JNZ BOTTOM
JMP EXIT
BOTTOM:
JMP TOP
EXIT:
هيكلية البرنامج
ذكرنا أن عمليات التفرع يمكن استخدامها في التفرع والتكرار ولأن أوامر التفرع بسيطة سنتطرق في هذا الجزء لكيفية كتابة أوامر التكرار والتفرع والمستخدمة في لغات البرمجة الراقية High Level Programming DrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokias .

أوامر التفرع
الأمر IF……..Then…….
الشكل العام لعبارة If..Then… هو

IF condition is True then
Execute True branch statements
End_IF
أي إذا تحقق الشرط يتم تنفيذ الأوامر وإذا لم يتحقق لا يتم تنفيذ شيء

مثال
استبدل محتويات المسجل AX بالقيمة المطلقة لها.
أي إذا كانت محتويات المسجل سالبه (اقل من صفر) استبدلها بالقيمة الموجبة.
IF AX < 0 then
Replace AX with –AX
End_IF
بلغة التجميع تصبح
CMP AX , 0
JNL END_IF
; Then
NEG AX
END_IF:
2 – عبارة IF…THEN…..ELSE…..ENDIF
وهي تكون علي الصورة
IF Condition is True then
Execute True_Branch statements
ELSE
Execute False_Branch statements
End_IF


إذا تحقق الشرط يتم تنفيذ مجموعة من الأوامر وإذا لم يتحقق يتم تنفيذ مجموعة أخرى من الأوامر
مثال:-
افترض أن BL,AL يحتويان حروف (ASCII CODE) ، قم بعرض الحرف الأول بالترتيب (ذو القيمة الأصغر)
IF AL < = BL THEN
DISPLAY AL
ELSE
DISPLAY BL
END_IF
(تصبح بلغة التجميع) كالآتي :-
MOV AH,2
CMP AL,BL
JNBE ELSE_
MOV DL,AL
JMP DISPLAY
ELSE_:
MOV DL,BL
DISPLAY:
INT 21H

3- عبارة CASE
في حالة عبارة CASE يوجد أكثر من مسار يمكن أن يتبعه البرنامج والشكل العام للأمر هو :
CASE EXPRESSION
VALUE_1 : STATEMENT_1
VALUE_2 : STATEMENT_2
:
VALUE_N : STATEMENT_N
END_CASE
مثال:
إذا كان المسجل AX يحتوى على رقم سالب ضع الرقم –1 في المسجل BX فإذا كان AX به صفر ضع الرقم 0 في المسجل BX أما إذا كان المسجل AX به رقم موجب ضع الرقم 1 في المسجل BX.
الحل:
CASE AX
< 0 : PUT –1 IN BX
= 0 : PUT 0 IN BX
> 0 : PUT 1 IN BX
END_CASE







التوقيع
جمال الزرقاء غير متواجد حالياً  
Digg this Post!Bookmark Post in Technorati
رد مع اقتباس
قديم 18-04-2010, 11:08 AM   #13
administrator
 
الصورة الرمزية جمال الزرقاء
 
تاريخ التسجيل: Dec 2005
رقم العضوية: 1927
الدولة: بداخل الالكترونيات
العمر: 39
المشاركات: 2,917
بمعدل: 0.64 (مشاركة/اليوم)



افتراضي

 


في لغة التجميع :
CMP AX, 0 ; AX افحص
JL NEGATIVE ; AX < 0
JE ZERO ; AX = 0
JG POSITIVE ; AX > 0
; Otherwise (Else) part will be here
NEGATIVE :
MOV BX,-1
JMP END_CASE
ZERO :
MOV BX,0
JMP END_CASE
POSITIVE :
MOV BX,1
END_CASE:
لاحظ أننا نحتاج فقط لـ CMP واحدة لأن أوامر التفرع لاتؤثر علي البيارق.
مثال : إذا كانت محتويات المسجل AL هي الرقم 1 أو الرقم 3 أطبع "0" ،وإذا كانت محتويات
المسجل
AL هي الرقم 2 أو الرقم 4 أطبع ‘E’.
الحل :
CASE AL of
1,3:DISPLAY “0”
2,4:DISPLAY “E”
END_CASE
بلغة التجميع

CMP AL , 1
JE ODD
CMP AL , 3
JE ODD
CMP AL , 2
JE EVEN
CMP AL , 4
JE EVEN
JMP END_CASE
ODD: MOV DL , ‘O’
JMP DISPLAY
EVEN: MOV DL , ‘E’
DISPLAY: MOV AH ,2
INT 21H
END_CASE:
التفرع بشروط مركبة Compound Conditions
في بعض الأحيان يتم استعمال شرط مركب لعملية التفرع مثل
IF condition1 AND condition2
IF condition1 OR condition2 أو
حيث في الحالة الأولي تم استخدام الشرط
"و" AND وفي الحالة الثانية تم استخدام الشرط "أو" OR
الشرط "و" AND Condition
تكون نتيجة الشرط "و" صحيحة إذا تحقق كل من الشرطين في آن واحد
مثال
: اقرأ حرف من لوحة المفاتيح، وإذا كان حرفاً كبيراً Capital Letter اطبعه
خوارزمية الحل
:
Read a Character into AL
If ( ‘A’ <= character AND character <= ‘Z’) then
Display character
End_IF
بلغة التجميع
MOV AH , 1 ; قراءة الحرف
INT 21h
CMP AL , ‘A’
JNGE End_IF
CMP AL , ‘Z’
JNLE End_IF
MOV DL , AL
MOV AH , 2
INT 21h
End_IF:
الشرط "أو" OR Condition
يتحقق الشرط "أو" إذا تحقق أي من الشرطين أو كلاهما
مثال
: اقرأ حرف وإذا كان الحرف ‘y’ أو ‘Y’ اطبعه وإذا لم يساوي ‘y’ أو ‘Y’ قم بإنهاء البرنامج
خوارزمية الحل
Read character from keyboard into AL
IF ( character = ‘y’ OR character = ‘Y’ ) then
Display character
Else
Terminate the program
End_IF
بلغة التجميع
MOV AH , 1 ; قراءة الحرف
INT 21h
CMP AL , ‘y’
JE then
CMP AL , ‘Y’
JE Then
JMP else_
Then: MOV DL,AL
MOV AH , 2
INT 21h
JMP End_if
else: MOV AH ,4ch
INT 21h
End_if:
التكرار
التكرار هو عملية تنفيذ مجموعة من الأوامر لأكثر من مرة.وقد يكون التكرار لعدد محدد من المرات أو قد يكون التكرار حتى حدوث حدث محدد.
التكرار لعدد محدد
في هذه الحالة يتم تكرار مجموعة من الأوامر لعدد محدد من المرات وتسمي بالfor loop والشكل العام هو
For loop_count times do
statements
End_for
يتم استخدام الأمر loop لتمثيل الحلقة وهو بالصيغة
loop destination_label
حيث يتم استخدام المسجل CX كعداد ويتم تحميله بقيمة العداد (عدد مرات تكرار الحلقة) وتنفيذ الأمرloop يؤدي إلى إنقاص قيمة المسجل CX بمقدار واحد وإذا لم تصبح قيمة المسجل CX =صفر يتم التفرع إلي العنوان destination_label(الذي يجب أن يسبق العنوان الخالي بمقدار 126 خانة كحد أقصي) ويتم تكرار هذه العملية حتى تصل قيمة المسجل CX إلي الصفر عندها يتم الانتهاء من الحلقة ومواصلة البرنامج. باستخدام loop يكون على النحو التالي
; ( CX ) وضع قيمة ابتدائية في المسجل
top:
; جسم البرنامج
loop top
مثال:- اكتب برنامج يستخدم حلقة التكرار وذلك لطباعة 80 نجمة"* "
الحل
for 80 times do
display “*”
End_for
بلغة التجميع
MOV CX , 80 ; عدد مرات النجوم المطلوب عرضها
MOV AH , 2
MOV DL , ‘*’
Top: INT 21h
LOOP top







التوقيع
جمال الزرقاء غير متواجد حالياً  
Digg this Post!Bookmark Post in Technorati
رد مع اقتباس
قديم 18-04-2010, 11:09 AM   #14
administrator
 
الصورة الرمزية جمال الزرقاء
 
تاريخ التسجيل: Dec 2005
رقم العضوية: 1927
الدولة: بداخل الالكترونيات
العمر: 39
المشاركات: 2,917
بمعدل: 0.64 (مشاركة/اليوم)



افتراضي

 

من البرنامج LOOP يؤدي إلي تكرار جسم الحلقة مره واحدة علي الأقل وبالتالي إذا كانت قيمة العداد CX تساوي صفر فإن البرنامج سيؤدي جسم الحلقة مرة واحدة حيث

يقوم بطرح 1 من العداد لتصبح قيمة العداد 65535 حيث تقوم الحلقة بالتكرار عدد 65535 (00FFFh)
مرة بعدها ينتهي البرنامج.
لعلاج هذه الحالة يجب التأكد من أن قيمة المسجل CX لا تساوي السابق نلاحظ أن عملية التكرار باستخدام الأمر صفر قبل الدخول للحلقة وذلك باستخدام الأمر JCXZ ( Jump if CX is Zero ) ويكون شكل البرنامج علي النحو التالي

JCXZ skip
Top:
; جسم الحلقة
loop top
skip:
حلقة WHILE
يتم تكرار هذه الحلقة حتى حدوث شرط محدد حيث الشكل العام لها علي النحو التالي
While Condition DO
Statements
End_while
يتم اختبار الشرط في بداية الحلقة فإذا تحقق الشرط يتم تنفيذ جسم الحلقة وإذا لم يتحقق يتم الخروج من الحلقة وتنفيذ الأوامر التالية في البرنامج.
لاحظ أن الشرط قد لا يتحقق من البداية وبالتالي لا يتم الدخول أصلاً في جسم الحلقة مما يؤدي إلي إمكانية عدم تنفيذ جسم الحلقة علي الإطلاق. لاحظ أيضاً أن جسم الحلقة يقوم دائماً بتغيير أحد معاملات شرط الحلقة حتى يتحقق شرط إنهاء الحلقة ( في حالة عدم تغيير معاملات الشرط تكون الحلقة لانهائية )
مثال :اكتب جزء من برنامج يقوم بإيجاد عدد الحروف في سطر محدد
الحل
INITIALIZE COUNT TO 0 ; ابدأ العداد بالقيمة صفر
READ A CHARACTER ; اقرأ حرف
WHILE CHARACTER<>CARRIAGE-RETURN DO
COUNT =COUNT+1
READ A CHARACTER
END-WHILE
بلغة التجميع:

MOV DX,0 ; عداد الحروف
MOV AH , 1 ; الخدمه رقم 1 (قراءة حرف)
INT 21h
WHILE:
CMP AL,0DH ;
من نهاية السطر
JE END_WHILE ; اذا كانت نهاية السطر
INC DX ; أضف واحد إلى ا لعداد
INT 21H ; اقرأ الحرف التالي
JMP WHILE.
END-WHILE :

حلقة REPEAT

وهى حلقة أخري تقوم بالتكرار حتى حدوث شرط محدد.والشكل العام لها يكون على الصورة
REPEAT
STATEMENT(s) ;
UNTIL CONDITION
وهنا يتم تنفيذ جسم الحلقة ثم بعد ذلك يتم اختبار الشرط .فإذا تحقق الشرط يتم الخروج من الحلقة أما إذا لم يتحقق يتم تكرار الحلقة .

مثال :اكتب جزء من برنامج يقوم بقراءة حروف تنتهي بالمسافة blank
MOV AH,1 ; خدمة قراءة حرف
REPEAT:
INT 2!H
CMP AL ,‘ ‘ ;
قارن الحرف والمسافة
JNE REPAET ; اذا لم يساويه كرر الحلقه
الفرق بين حلقة WHILE وحلقة REPEAT
استخدام الحلقتين عادة يعتمد على تفضيل الشخص وعموما تمتاز حلقة WHILE بان الشرط يتم اختباره قبل الدخول إلى الحلقة وبالتالي يمكن عدم تنفيذ جسم الحلقة على الإطلاق بينما تمتاز حلقة REPEAT بالمرور على جسم الحلقة أولاً ثم اختبار الشرط وبالتالي يجب تنفيذ جسم الحلقة مرة واحدة على الأقل.

كتابة برنامج
لتوضيح كيفية كتابة برامج كبيره من لغة راقية إلي لغة التجميع نوضح المثال التالي :
اكتب برنامج كامل يقوم بسؤال المستخدم لإدخال جمله يقوم البرنامج بتحديد أصغر حرف كبير ورد في الرسالة وأكبر حرف كبير يرد فى الرسالة (وذلك حسب ترتيب الحروف في جدول الـ ASCII).
إذا لم ترد حروف كبيره يقوم البرنامج بإظهار الرسالة (No capital letters ) . كالآتي :
TYPE A LINE OF TEXT :
SUDAN UNIVERSITEY OF SCIENCE AND TECHNOLOGY
FIRST CAPITAL = A LAST CAPITAL = Y
سوف نقوم بكتابة هذا البرنامج على طريقة تجزئه المشكلة إلي مجموعه من المشاكل الفرعية الصغيرة التي يتم حل كل واحدة منها على حده وهذه الطريقة تسمى بطريقه التصميم من أعلى إلي اسفل TOP - DOWN PROGRAM DESIGN كالآتي :
1-اظهر رسالة للمستخدم لإدخال نص.
2- اقرأ وتعامل مع النص .
3- اظهر النتيجة .
وبعد ذلك يتم التعامل مع كل خطوه بالتفصيل.
1-إظهار الرسالة للمستخدم لإدخال نص
يتم ذلك عن طريق كتابة الجزء التالي
MOV AH,9 ; خدمة رقم 9 نص
LEA DX ,PROMPT ; عنوان الرسالة
INT 21H ; اعرضها
حيث يتم تعريف الرسالة PROMPT في مقطع البيانات على النحو التالي
PROMPT DB ‘ TYPE A LINE OF TEXT : ‘,0DH,0AH, ‘$’
وهى تتضمن تحويل المحث CURSOR إلى السطر التالي
2- قراءة النص والتعامل معه:
هذه الخطوة تحتوي على قلب البرنامج والتي يتم فيها الجزء الكبير في البرنامج ويمكن كتابة الخوارزمية لها على النحو التالي
Read Character; اقرا حرف
While Character Is Not a Carriage Return Do
IF Character Is A Capital Letter Then
IF Character Precedes First Capital THEN
First Capital =CHARACTER
END_IF
IF Character Follo** Last Capital THEN
Last Capital = Character
END_IF
END_IF
Read Character
END_WHILE
حيث يكون الحرف كبير إذا تحقق الشرط Character >= ‘A’ AND Character <=’Z’
ويكون هذا الجزء بلغة التجميع علي النحو التالي
MOV AH , 1
INT 21H
WHILE:
CMP AL,0DH
JE END_WHILE
CMP AL , ‘A’
JNGE END_IF
CMP AL , ‘Z’
JNLE END_IF
CMP AL,FIRST
JNL CHECK-LAST
MOV FIRST,AL
CHECK-LAST:
CMP AL,LAST
JNG END-IF
MOV LAST,AL
END_IF: INT 21H
JMP WHILE
END_WHILE :

حيث FIRSTوLASTعبارة عن متغيرات حرفية يتم تعريفها في مقطع البيانات على النحو التالى:-
FIRST DB ‘]’
LAST DB ‘@’
حيث الحرف ] هو الحرف التالي للحرف Z و الحرف @ هو الحرف السابق للحرف A







جمال الزرقاء غير متواجد حالياً  
Digg this Post!Bookmark Post in Technorati
رد مع اقتباس
قديم 18-04-2010, 11:10 AM   #15
administrator
 
الصورة الرمزية جمال الزرقاء
 
تاريخ التسجيل: Dec 2005
رقم العضوية: 1927
الدولة: بداخل الالكترونيات
العمر: 39
المشاركات: 2,917
بمعدل: 0.64 (مشاركة/اليوم)



افتراضي

 

3/ طباعة النتيجة :-
فى هذه الخطوة يتم التالي :
IF NO CAPITAL LETTER TYPED THEN
DISPLAY ’NO CAPITAL’
ELSE
DISPLAY FIRST & LAST CHARACTER
END_IF
حيث يتم إظهار الرسالة الأولى في حالة عدم إدخال أي حرف كبير داخل الرسالة أو قيمة اكبر واصغر حرف تم إدخاله. ولأجراء ذلك نقوم بتعريف البيانات التالية:
NOCAP-MSG DB ‘NO CAPITALS $’
CAP-MSG DB ‘FIRST CAPITAL=‘
FIRST DB ‘]’
DB ‘LAST CAPITAL=‘
LAST DB ‘@ $’
و يتم كتابة الجزء التالي
MOV AH , 9
CMP FIRST,’]’
JNE CAPS
LEA DX ,NOCAP_MSG
JMP DISPLAY
CAPS : LEA DX, CAP_MSG
DISPLAY: INT 21H

البرنامج الكامل
TITLE THIRD: CASE CONVERSION PROGRAM
.MODEL SMALL
.STACK 100H
.DATA
CR EQU 0DH
LF EQU 0AH
PROMPT DB ‘TYPE A LINE OF TEXT',CR,LF,'$'
NOCAP_MSG DB CR,LF,'NO CAPITALS $'
CAP_MSG DB CR,LF,'FIRST CAPITAL ='
FIRST DB ']'
DB ' LAST CAPITAL = '
LAST DB '@ $'
.CODE
MAIN PROC
; initialize DS
MOV AX,@DATA
MOV DS,AX
;display opening message
LEA DX,prompt
MOV AH,09H
INT 21H
;read and process a line of text
MOV AH,01H
INT 21H
WHILE_:
CMP AL,CR
JE END_WHILE
;if char is capital
CMP AL,'A'
JNGE END_IF
CMP AL,'Z'
JNLE END_IF
; if character precede first capital
CMP AL,FIRST
JNL CHECK_LAST
MOV FIRST,AL
CHECK_LAST:
; if character follow last capital
CMP AL,LAST
JNG END_IF
MOV LAST,AL
END_IF:
INT 21H
JMP WHILE_
END_WHILE:
MOV AH,9
;if no capital were typed
CMP FIRST,']'
JNE CAPS
LEA DX,NOCAP_MSG
JMP DISPLAY
CAPS:
LEA DX,CAP_MSG
DISPLAY:
INT 21H
;exit to DOS
MOV AH,4CH
INT 21H
MAIN ENDP
END MAIN

تمارين
1 - حول العبارات التالية إلي لغة التجميع
1 - IF AX < 0 THEN
PUT -1 IN BX
END_IF
2 - IF AL < 0 THEN
PUT FFh IN AH
ELSE
PUT 0 IN AH
END_IF
3 - IF ( DL >= “A” AND DL = < “Z” ) Then
DISPLAY DL
END_IF
4 - IF AX < BX THEN
IF BX < CX THEN
PUT 0 IN AX
ELSE
PUT 0 IN BX
END_IF
END_IF
5 - IF ( AX < BX ) OR ( BX < CX ) THEN
PUT 0 IN DX
ELSE
PUT 1 IN DX
END_IF


6 - IF AX < BX THEN
PUT 0 IN AX
ELSE
IF BX < CX THEN
PUT 0 IN BX
ELSE
PUT 0 IN CX
END_IF
END_IF

2 - استعمل الشكل الهيكلي لعبارة CASE اكتب الجزء التالي من البرنامج بلغة التجميع
أ - اقرأ حرف.
ب - إذا كان الحرف ‘A’ اطبع ( نفذ) Carriage Return
جـ - إذا كان الحرف ‘B’ اطبع ( نفذ) Line Feed
د - إذا كان أي حرف آخر قم بإنهاء البرنامج والعودة لنظام التشغيل.
3 - اكتب جزء من برنامج يقوم بالآتي :
أ - ضع حساب مجموع الأرقام 1 + 4 + 7 + ........ + 148 في المسجل AX.
ب - ضع حساب مجموع الأعداد 100 + 95 + 90 + ...... + 5 في المسجل BX.
4 - مستخدماً الأمر LOOP قم بكتابة برنامج يقوم بالآتي :
أ - حساب أول 50 عنصر في المتوالية 1 ، 5 ، 9 ، 13 في المسجل AX
ب - قراءة حرف وطباعته 80 مرة في السطر التالي.
5 - الخوارزمية التالية تقوم بقسمة رقمين باستخدام عملية الطرح
INITIALIZE QUOTIENT TO 0
WHILE DIVIDENT > = DIVISOR DO
INCREMENT QUOTIENT
SUBTRACT DIVISOR FROM DIVIDEND
END_WHILE
اكتب جزء من برنامج يقوم بقسمة الرقم الموجود في المسجل AX علي الرقم الموجود
بالمسجل BX ووضع النتيجة في المسجل CX
6 - الخوارزمية التالية تقوم بإيجاد حاصل ضرب رقمينN و M باستخدام عملية الجمع المتكرر
INITIALIZE PRODUCT TO 0
REPEAT
ADD M TO PRODUCT
DECREMENT N
UNTIL N = 0
اكتب جزء من برنامج يقوم بضرب الرقم الموجود في المسجل AX في الرقم الموجود
بالمسجل BX ووضع النتيجة في المسجل CX ( يمكنك تجاهل حدوث عملية الفيضان)
7 - إذا علمت أن الأمرين LOOP و LOOPZ يتضمن تنفيذهما إنقاص قيمة المسجل CX وإذا
كانت CX <> 0 و ( AND ) ZF = 1 يتم تكرار الحلقة ( يتم القفز إلي العنوان المحدد).
كذلك الأمرين LOOPNE و LOOPNZ يتضمن تنفيذهما إنقاص قيمة المسجل CX وإذا
كانت CX <> 0 و ( AND ) ZF = 0 يتم تكرار الحلقة ( يتم القفز إلي العنوان المحدد).
اكتب برنامج يقرأ حروف تنتهي إما بالضغط علي مفتاح الإدخال Carriage Return او يتم
إدخال 80 حرف ( استعمل الأمر LOOPNE ).
البرامج
8 - اكتب برنامج يقوم بإظهار الحرف ‘?’ ثم يقوم بقراءة حرفين كبيرين. يقوم البرنامج بطباعة
الحرفين بعد ترتيبهما في السطر التالي.
9- اكتب برنامج يقوم بطباعة الحروف ابتداء من الحرف رقم 80h وحتي الحرف الرقم FFh من حروف الـ ASCII يقوم البرنامج بطباعة 10 حروف في السطر الواحد تفصلها مسافات.
10- اكتب برنامج يقوم بسؤال المستخدم لإدخال رقم سداسي عشر مكون من خانة واحدة (
"0" إلى "9" أو "A" إلى "F" ) يقوم البرنامج بطباعة القيمة المناظرة في النظام العشري
في السطر التالي. يقوم البرنامج بسؤال المستخدم إذا كان يريد المحاولة مرة ثانية فإذا ضغط
علي الحرف 'Y’ أو الحرف ‘y’ يقوم البرنامج بتكرار العملية وإذا أدخل أي حرف آخر يتم
إنهاء البرنامج. ( إذا ادخل المستخدم أي رقم غير مسموح به يقوم البرنامج بإظهار رسالة
والمحاولة مرة أخرى)
11- كرر البرامج في 10 بحيث إذا فشل المستخدم في إدخال رقم سداسي عشر في عدد 3 محاولات
يقوم البرنامج بالانتهاء والعودة إلي نظام التشغيل.








جمال الزرقاء غير متواجد حالياً  
Digg this Post!Bookmark Post in Technorati
رد مع اقتباس
قديم 18-04-2010, 11:12 AM   #16
administrator
 
الصورة الرمزية جمال الزرقاء
 
تاريخ التسجيل: Dec 2005
رقم العضوية: 1927
الدولة: بداخل الالكترونيات
العمر: 39
المشاركات: 2,917
بمعدل: 0.64 (مشاركة/اليوم)



افتراضي

 

الفصل السادس
الأوامر المنطقية وأوامر الإزاحة والدوران
الأوامر المنطقية AND,OR,XOR
تستخدم الأوامر المنطقية في التعامل مع خانة ثنائية واحدة في المسجل المحدد والشكل العام للأوامر هو:
AND DESTINATION , SOURCE
OR DESTINATION , SOURCE
XOR DESTINATION , SOURCE
وتم تخزين النتيجة في المستودع DESTINATION الذي يجب أن يكون مسجل أو موقع في الذاكرة بينما المعامل الآخر SOURCE يمكن أن يكون مسجل أو موقع في الذاكرة أو قيمة ثابتة. عموماً لا يمكن التعامل مع موقعين في الذاكرة.
يكون تأثر البيارق على النحو التالي :
PF,ZF,ZF : تعكس حالة النتيجة.
AF : غير معرفة.
CF,OF : تساوي صفر .
أحد الاستخدامات المهمة للأوامر المنطقية هو تغيير خانة محددة داخل مسجل ويتم ذلك باستخدام حجاب MASK حيث يتم بواسطته تحديد الخانة المطلوب التعامل معها ويتم الاستعانة بالخصائص التالية للأوامر المنطقية :
b AND 1 = b , b AND 0 = 0
b OR 1 = 1 , b OR 0 = b
b XOR 1 =~ b , b XOR 0 = b
وعلى هذا يمكن الآتي :
1- لوضع القيمة ‘0’ في خانة (أو خانات) محددة Clear يتم استخدام الأمر AND حيث يتم وضع القيمة ‘0’ في الحجاب MASK للخانات المطلوب وضع '0’ فيها بينما يتم وضع القيمة '1’ في الخانات الغير مطلوب تعديلها .
2- لوضع القيمة ‘1’ في خانة (أو خانات) محددة SET يتم استخدام الأمر ORحيث يتم وضع القيمة ‘1’ في الحجاب MASK للخانات المطلوب وضع '1’ فيها بينما يتم وضع القيمة '0’ في الخانات الغير مطلوب تعديلها.
3-لعكس قيمة خانة (أو خانات) محددة COMPLEMENT يتم استخدام الأمر XOR حيث يتم وضع القيمة '1’ في الحجاب MASK للخانات المطلوب عكس قيمتها بينما يتم وضع القيمة '0’ في الخانات الغير مطلوب تعديلها .
مثال:
ضع القيمة '0’ في خانة الإشارة في المسجل AL واترك باقي الخانات بدون تعديل.
الحل
يتم استخدام القيمة 0111 1111b = 7Fh كحجاب MASK ويتم استخدام الأمر AND
AND AL, 7Fh
مثال
ضع القيمة Set ‘1’ في كل من الخانة ذات الوزن الأكبر MSB والخانة ذات الوزن الأصغر LSB في المسجل AL وأترك باقي الخانات بدون تعديل
الحل
يتم استعمال الحجاب Mask = 1000 0001b = 81h ونستخدم الأمر OR كالتالي
OR AL , 81h
مثال
غير إشارة المسجل DX
الحل
يتم استخدام الحجاب Mask التالي 1000 0000 0000 0000b = 8000h ونستخدم الأمر XOR
XOR DX , 8000h
وعموماً يتم استخدام الأوامر المنطقية في مجموعة من التطبيقات والتي سنتحدث عن بعضها في الجزء التالي
تحويل الحروف الصغيرة لحروف كبيرة
نعلم أن الحروف الصغيرة ( ‘a’ to ‘z’) تقع في جدول الـ ASCII ابتداء من الرقم 61h وحتى 7Ah بينما تقع الحروف الكبيرة ( ‘A’ to ‘Z’) في جدول الـASCII ابتداء من الرقم 41h وحتى 5Ah وعلي ذلك فإنه لتحويل الحرف من صغير إلي كبير نطرح الرقم 20h فمثلاً إذا كان المسجل DL يحتوي علي حرف صغير ومطلوب تحويله إلي حرف كبير نستعمل الأمر SUB DL , 20h وقد قمنا باستخدام هذه الطريقة من قبل. ونريد هنا استخدام طريقة أخري للتحويل.
إذا نظرنا للأرقام المناظرة للحروف نجد أن
الرقم المناظر للحرف ‘a’ هو 61h = 0110 0001
الرقم المناظر للحرف ‘A’ هو 61h = 0100 0001
ومن الأرقام نلاحظ تحويل الحرف من صغير إلي كبير يتطلب وضع القيمة ‘0’ في الخانة السادسة في المسجل الذي يحوي الحرف ويتم ذلك باستخدام الحجاب Mask التالي 1101 1111b= 0DFh ونستعمل الأمر AND
AND DL , 0DFh
ويمكنك الآن توضيح كيفية تحويل الحروف الكبيرة إلي حروف صغيرة بنفسك.

تفريغ مسجل (وضع صفر فيه ) Clear Register
نعلم أنه لوضع القيمة صفر في مسجل يمكننا استخدام أحد الأمرين MOV AX,0
أو SUB AX , AX إذا أردنا استخدام أمر منطقي يمكننا الاستعانة بالأمر XOR حيث نعلم أن
0 XOR 0 = 0 و 1 XOR 1 = 0
وبالتالي يمكننا استخدام الأمر XOR للمسجل مع نفسه لنضع الرقم صفر فيه علي النحو التالي
XOR AX , AX
اختبار وجود الرقم صفر في مسجل
لأن '0’ OR ‘0’ = ‘0’ و '1’ OR ‘1’ = ‘1’ فإن الأمر OR AX , AX يبدو كأنه لا يفعل شيئاً حيث لا يتم تغيير محتويات المسجل AX بعد تنفيذ الأمر، ولكن الأمر يقوم بالتأثير علي بيرق الصفر ZF و بيرق الإشارة SF فإذا كان المسجل AX يحوي الرقم صفر فسيتم رفع بيرق الصفر ( ZF = 1 ) وبالتالي يمكن استخدام هذا الأمر بدلاً من استخدام الأمر CMP AX , 0
الأمر NOT
يقوم الأمر NOT بحساب المكمل لواحد 1’s Complement ( وهو تحويل الـ ‘0’ إلي ‘1’ والـ '1’ إلي '0’ أي عكس الخانات بداخل المسجل ) والشكل العام للأمر هو :
NOT Destination
ومثال له الأمر NOT AX
الأمر TEST
يقوم الأمر TEST بعمل الأمر AND ولكن بدون تغيير محتويات المستودع Destination والهدف منه هو التأثير علي بيارق الحالة والشكل العام للأمر هو
TEST Destination , Source
ويقوم بالتأثير علي البيارق التالية:
البيارق PF و ZF و SF تعكس النتيجة
البيرق AF غير معرف
البيارق OF و CF تحتوي علي الرقم 0
إختبار خانة أو خانات محددة
يستخدم الأمر TEST لاختبار محتويات خانة أو خانات محددة ومعرفة إن كان بها '1’ أو '0’ حيث يتم استخدام حجاب Mask ووضع الرقم ‘1’ في الخانات المطلوب اختبارها ووضع الرقم '0’ في الخانات الغير مطلوب معرفة قيمتها وذلك لأن 0 AND b = 0 و 1 AND b = b ويتم استخدام الأمر
TEST Destination , Mask
وبالتالي فإن النتيجة ستحتوي علي الرقم '1’ في الخانة المراد اختبارها فقط إذا كانت هذه الخانة تحتوي علي الرقم ‘1’، وتكون صفر في كل الخانات الأخري.







جمال الزرقاء غير متواجد حالياً  
Digg this Post!Bookmark Post in Technorati
رد مع اقتباس
قديم 18-04-2010, 11:13 AM   #17
administrator
 
الصورة الرمزية جمال الزرقاء
 
تاريخ التسجيل: Dec 2005
رقم العضوية: 1927
الدولة: بداخل الالكترونيات
العمر: 39
المشاركات: 2,917
بمعدل: 0.64 (مشاركة/اليوم)



افتراضي

 

مثال:
اختبر قيمة المسجل AL وإذا احتوى على رقم زوجي قم بالقفز إلى العنوان Even_No
الحل
الأرقام الزوجية تحتوي على الرقم 0 في الخانة ذات الوزن الأصغرLSB وعلى ذلك لاختبار هذه
الخانة يتم استخدام الحجابMASK التالي 00000001b ويكون البرنامج على الصورة التالية :
TEST AL , 01h
JZ Even_No
أوامر الإزاحة:
تستخدم أوامر الإزاحة لإجراء عملية إزاحة بمقدار خانة أو أكثر للخانات الموجودة في المستودع وذلك لليمين أو لليسار .
عند استخدام الأمر shift يتم فقد للخانة التي يتم إزاحتها إلى الخارج ، بينما في حالة أوامر الدوران يتم دخول هذه الخانة إلى الطرف الثاني من المستودع ،كما سنرى فيما بعد.
يوجد شكلان لأوامر الإزاحة وهي إما :
Opcode Destination,1
أو Opcode Destination,CL
حيث يحتوي المسجل CL على عدد مرات الإزاحة المطلوب تنفيذها .

الإزاحة لليسار : Shift Left (SHL)
يقوم الأمر SHL بعمل إزاحة لليسار ويمكن أن تكون الإزاحة بمقدار خانة واحدة وفي هذه الحالة نستعمل الأمر:
SHL Destination , 1
أو أكثر من خانة حيث يتم وضع عدد مرات الإزاحة المطلوبة في المسجل CL واستعمال الأمر
SHL Destination , CL
ولا تتغير قيمة المسجل CL بعد تنفيذ الأمر

تقوم البيارق PF , SF , ZF بتوضيح حالة النتيجة .
البيرق CF يحتوي على آخر خانة تمت إزاحتها للخارج
بينما البيرق of يحتوي على 1 إذا كانت آخر عملية إزاحة أدت إلى رقم سالب .
مثال:
إذا كان DH = 8AH و CL = 3 ما هي محتويات المسجلين CL و DH بعد تنفيذ الأمر SHL DH , CL وكذلك بيرق المحمول.
الحل:
قبل تنفيذ الأمر كانت محتويات المسجل DH هي الرقم 10001010 بعد 3 ازاحات إلي اليسار تصبح محتوياته h = 01010000 50 بينما يحتوى المسجل CL على قيمته السابقة (الرقم 3) ويحتوى بيرق المحمول على القيمة ‘0’. (محتويات DH الجديدة يمكن الحصول عليها بمسح 3 أرقام ثنائية في أقصى اليسار وإضافة 3 أصفار في أقصى اليمين)
الضرب باستخدام الإزاحة لليسار:
تعتبر عملية الإزاحة لليسار عملية ضرب في الرقم (2d) مثلاً الرقم (5d) 101 إذا تمت إزاحته لليسار بمقدار خانه واحدة نحصل على الرقم (10d) 1010 وبالتالي فإذا تمت الإزاحة بمقدار خانتين تعتبر كأننا قمنا بضرب الرقم في العدد (4d) وهكذا. وبالتالي فإن الإزاحة لليسار في رقم ثنائي تعني ضربه في ( 2 )
الأمر Shift Arithmetic Left ( SAL ):
يعتبر الأمر SAL مثل الأمر SHL ولكن يستخدم SAL في العمليات الحسابية حيث يقوم الأمرين بتوليد نفس لغة الآلة Machine Code.
الفيضان:
بالرغم من أن عملية ألإزاحه تقوم بالتأثير على بيارق الفيضان والمحمول إلا انه إذا حدثت ازاحه لأكثر من مره فان حالة البيارق لا تدل على أي شئ حيث أن المعالج يعكس فقط نتيجة أخر عملية ازاحه فمثلاً إذا حدثت عملية ازاحه لمسجل يحتوى على الرقم 80h وذلك بمقدار خانتين CL=2 فسنجد أن قيمة البيارق Of , Cf تساوى صفر وذلك بالرغم من حدوث عملية الفيضان.
مثال:أكتب الأوامر اللازمة لضرب محتويات المسجل AX في الرقم (8) مفترضاً عدم وجود فيضان.
الحل: نحتاج إلي إزاحة لليسار بمقدار (3) خانات.
MOV CL , 3
SAL AX, CL
الازاحة لليمين والأمر Shift Right (SHR):
يقوم الأمر SHR بعمل ازاحه لليمين للمستودع ويأخذ الصورة SHR Destination,1 يتم إدخال القيمة صفر في الخانة ذات الوزن الأعلى MSB بينما يتم إزاحة الخانة ذات الوزن الأصغر LSB إلى بيرق المحول Cf . كبقية أوامر الازاحه يمكن إجراء عملية الازاحه لأكثر من خانه وذلك بوضع عدد مرات الازاحه المطلوبة في المسجل CL واستخدام الصيغة.
SHR Destination, CL
ويكون تأثر البيارق كما في حالة الأمر SHL.
مثال:
ما هي محتويات المسجل DH و والبيرق CF بعد تنفيذ الجزء التالي من برنامج
MOV DH, 8Ah
MOV CL , 2
SHR DH,CL
الحل:
DH = 10001010
بعد الازاحه بمقدار خانتين تصبح محتويات المسجل
DH = 00100010 = 22h
وتكون قيمة البيرق Cf هى ‘1’
الامر ( Shift Arithmetic Right (SAR:
يقوم الأمر SAR بنفس عمل الأمر SHR ماعدا أن محتويات الخانة ذات الوزن الأعلى MSB لا يتم تغييرها بعد تنفيذ الأمر. وكبقية أوامر الازاحه بأخذ الأمر الصيغة.
SAR Destination , 1
أو فى حالة الازاحه عدد من المرات حيث يتم وضع عدد مرات الإزاحة المطلوب في المسجل CL وبأخذ الأمر الصيغة
SAR Destination, CL
القسمة باستخدام الازاحه لليمين:
يتم استخدام الازاحه لليمين لإجراء عملية القسمة على العدد 2 وذلك في حالة الأعداد الزوجية. أما بالنسبة للأعداد الفردية فان النتيجة تكون مقربه للعدد الصحيح الأصغر وتكون قيمة بيرق المحول Cf تساوى 1 فمثلاً عند إجراء عملية الازاحه لليمين للرقم (00000101)=5 فان النتيجة هي الرقم (00000010) وهو الرقم 2.
القسمة بإشارة وبدون إشارة:
عند إجراء عملية القسمة يجب التفرقة بين الأرقام بإشارة والأرقام بدون إشارة. في حالة الأرقام بدون إشارة يمكن استخدام الأمر SHR . بينما في حالة الأرقام بإشارة يجب استخدام الأمر SAR حيث يتم الاحتفاظ بإشارة الرقم (تذكر أن خانة الإشارة هي الخانة ذات الوزن الأكبر).
مثال:
استخدم الازاحه لليمين لقسمة الرقم 65143على الرقم 4 وضع النتيجة في المسجل AX.
الحل:
MOV AX, 65143
MOV CL,2
SHR AX, CL








التوقيع
جمال الزرقاء غير متواجد حالياً  
Digg this Post!Bookmark Post in Technorati
رد مع اقتباس
قديم 18-04-2010, 11:14 AM   #18
administrator
 
الصورة الرمزية جمال الزرقاء
 
تاريخ التسجيل: Dec 2005
رقم العضوية: 1927
الدولة: بداخل الالكترونيات
العمر: 39
المشاركات: 2,917
بمعدل: 0.64 (مشاركة/اليوم)



افتراضي

 

مثال:
إذا احتوى المسجل AL على الرقم -15 ما هي محتويات المسجل AL بعد تنفيذ الأمر.
SAR AL,1
الحل:
تنفيذ الأمر يعنى قسمة محتويات المسجل AL بالعدد 2 ويتم تقريب النتيجة كما ذكرنا وهنا النتيجة هي الرقم -7.5 وبتقريبه الى العدد الأصغر ونحصل على العدد -8 وإذا نظرنا للعدد في الصورة الثانية نجد أن العدد -15 هو 11110001 وبعد إجراء عملية الازاحه لليمين نحصل على الرقم 11111000 وهو العدد -8.
عموماً يمكن استخدام أوامر الازاحه لليسار ولليمين لإجراء عمليتي الضرب والقسمة على العدد 2 أو مضاعفاته وإذا أردنا إجراء عملية الضرب على إعداد غير العدد 2 ومضاعفاته يتم إجراء عملية إزاحة وجمع كما سنرى فيما بعد كما يمكن استخدام الأوامر IMUL, MUL للضرب والأوامر IDIV, DIV لإجراء عملية القسمة على أي رقم ولكن تعتبر هذه الأوامر أبطأ من عملية الازاحه.
أوامر الدوران:
الدوران لليسار
Rotate Left (ROL)
بقوم هذا الأمر بإجراء عملية ازاحه لليسار ويتم وضع الخانة ذات الوزن الأعلى في الخانة ذات الوزن الأصغر وفى نفس الوقت يتم وضعها في بيرق المحمول CF . ويتم النظر للمسجل كأنه حلقه كاملة حيث الخانة ذات الوزن الأعلى بجوار الخانة ذات الوزن الأصغر ويأخذ الأمر الصور
ROL Destination , 1
ROL Destination , CL
الدوران لليمين: Rotate Right (ROR)
يقوم هذا الأمر بنفس عمل الأمر ROL فيما عدا أن الازاحه تكون لليمين حيث يتم وضع الخانة ذات الوزن الأصغر في الخانة ذات الوزن الأكبر وفى نفس الوقت يتم وضعها في بيرق المحمول. ويأخذ الأمر أحد الصيغتين:
ROR Destination ,1
ROR Destination ,CL
يلاحظ انه في الأمرين ROR , ROL يتم وضع الخانة التي يتم طردها في بيرق المحمول CF
مثال:
استخدم الأمر ROL لحساب عدد الخانات التي تحتوى على الرقم (1) في المسجل BX دون تغيير محتويات المسجل BX. ضع النتيجة في المسجل Ax.
الحل:
MOV DX ,16D ;عدد التكرار للالتفاف
XOR AX,AX ; AX يتم حساب عدد الخانات في
MOV CX,1 ; عدد الخانات
Top : ROL BX,CX ; CF الخانة التي تم طردها توجد في
JNC NEXT
INC AX
NEXT: DEC DX
JNZ Top
الدوران لليسار عبر بيرق المحمول (RCL) Rotate through Carry Left
يقوم هذا الأمر بإجراء عملية الدوران لليسار واعتبار بيرق المحمول جزء من المسجل حيث يتم وضع الخانة ذات الوزن الأعلى في بيرق المحمول ويتم وضع محتويات بيرق المحمول في الخانة ذات الوزن الأصغر. ويأخذ إحدى الصيغتين.
RCL Destination , 1
RCL Destination , CL
الدوران لليمين عبر بيرق المحمول Rotate through carry Right RCR
يقوم هنا الأمر بنفس عمل الأمر RCL فيما عدا أن الدواران يكون لليمين حيث يتم وضع الخانة ذات الوزن الأصغر في بيرق المحول ووضع بيرق المحول في الخانة ذات الوزن الأعلى ويأخذ الصيغتين
RCR Destination , 1
RCR Destination ,CL
مثال:
إذا كانت محتويات المسجل DH هي الرقم 8Ah وكانت محتويات بيرق المحول هي الرقم CF=1 والمسجل CL يحتوى على الرقم 3 ما هي محتويات المسجل DH وبيرق المحمول بعد تنفيذ الأمر
RCR DH, CL
الحل:

DH
CF
القيمة الابتدائية
10001010
1
بعد الدوره الاولى نحو اليمين
11000101
0
بعد الدوره الثانية نحو اليمين
01100010
1
بعد الدوره الثالثة نحو اليمين
10110001
0
أي محتويات المسجل DH هي الرقم B1h وبيرق المحمول يساوى صفر.
مثال:
أكتب جزء من برنامج يقوم بعكس الخانات الموجودة في المسجل AL ووضع النتيجة في المسجل DL فمثلاً إذا كانت محتويات المسجل AL هي الرقم الثاني 11011100 يتم وضع الرقم 00111011 في المسجل BL.
الحل:
يتم استخدام الأمر SHL حيث يتم وضع الخانة ذات الوزن الأكبر في بيرق المحول وبعدها مباشرة يتم استخدام الأمر RCR لوضعها في الخانة ذات الوزن الأعلى في المسجل BL وتكرار هذه العملية عدد 8 مرات. كما في الجزء التالي
MOV CX, 8
Reverse: SHL AL,1
RCR BL,1
Loop Reverse
MOV AL , BL

قراءة وطباعة الأرقام الثنائية والسداسية عشر:
في هذا الجزء سنتناول كيفية كتابة برامج تقوم بقراءة أرقام ثنائية أو سداسية عشر من لوحة المفاتيح وكذلك طباعة الأرقام في الصورة الثنائية والسداسية عشر في الشاشة.
1- إدخال الأرقام الثنائية:
في برنامج الإدخال للأرقام الثنائية يقوم المستخدم بإدخال رقم ثنائي انتهى بالضغط على مفتاح الإدخال Carriage Return. حيث يكون الرقم المدخل عبارة عن سلسة الحروف '0’ و '1’ وعند إدخال كل حرف يتم تحويله إلى القيمة الناظرة (1, 0) ونجمع هذه الخانات في مسجل. الخوارزمية التالية تقوم بإدخال رقم ثنائي من لوحة المفاتيح ووضعه في المسجل BX :
Clear BX ( BX will hold Binary values )
Input a character ( ‘0’ OR ‘1’)
While character < > CR DO
Convert character to binary value
Left shift BX
Insert value into LSB of BX
Input a character
End_While
ويمكن توضيح الخوارزمية في حالة إدخال الرقم 110 كالتالي:
Clear BX : BX = 0000 0000 0000 0000
Input character ‘1’ , convert to 1
Left shift BX: BX = 0000 0000 0000 0000
Insert value into LSB of BX: BX = 0000 0000 0000 0001
Input character ‘1’, convert to 1
Left shift BX: BX = 0000 0000 0000 0010
Insert value into LSB of BX: BX = 0000 0000 0000 0011
Input character ‘0’ , convert to 0
left shift BX : BX = 0000 0000 0000 0110
Insert value into LSB of BX
BX = 0000 0000 0000 0110
محتويات المسجل BX هي 110b
تفترض الخوارزمية السابقة أن الأرقام المدخلة تحتوى على '0’ و ‘1’ فقط وأن عدد الخانات لا يتعدى 16 خانة وإلا سيتم فقد أول خانه تم إدخالها في حالة إدخال 17 خانة وأول خانتين إذا تم إدخال 18 خانه وهكذا.
تم عمل ازاحه للمسجل BX لليسار لفتح خانة في المسجل BX في الخانة ذات الوزن الأصغر وإدخال الرقم المدخل في الخانة المفتوحة باستخدام الأمر OR حيث أن الخانة ذات الوزن الأصغر تحتوى على الرقم 0( نتيجة للإزاحة لليسار والتي تضع الرقم 0 فيها) ونعلم أن b OR 0 = b وبالتالي فانه بعد استخدام الأمر OR تصبح القيمة المخزنة فى الخانة ذات الوزن الأصغر هي قيمة الرقم المدخل ويصبح هذا الجزء من البرنامج بلغة التجميع على النحو التالي:
XOR BX,BX
MOV AH,1
INT 21h ;
اقرأ حرف
While_:
CMP AL, 0Dh
JE END_While
AND AL , 0fh ;
حول الحرف إلى رقم ثنائي
SHL BX, 1
OR BL, AL ; BL
ادخل القيمة في الخانة ذات الوزن الأصغر في
INT 21h ; اقرأ الحرف التالي
JMP While_
END_While:
2 - إخراج الأرقام الثنائية Binary Output:
في حالة إخراج الرقم في الصورة الثنائية نستخدم عملية الدوران لليسار حيث يتم إزاحة الخانة ذات الوزن الأكبر إلى بيرق المحمول. ويتم اختيار محتويات البيرق فإذا كانت تساوى 1 يتم طباعة الحرف ‘1’ وإذا كانت







جمال الزرقاء غير متواجد حالياً  
Digg this Post!Bookmark Post in Technorati
رد مع اقتباس
قديم 18-04-2010, 11:15 AM   #19
administrator
 
الصورة الرمزية جمال الزرقاء
 
تاريخ التسجيل: Dec 2005
رقم العضوية: 1927
الدولة: بداخل الالكترونيات
العمر: 39
المشاركات: 2,917
بمعدل: 0.64 (مشاركة/اليوم)



افتراضي

 

تساوى صفر يتم طباعة الحرف '0’. وفيما يلي خوارزمية البرنامج
FOR 16 times Do
Rotate left BX
If CF = 1 then
Output ‘1’
else
Output ‘0’
end - if
END_FOR
البرنامج بلغة التجميع يُترك كتمرين للطالب .
3 - إدخال الأرقام السداسية عشر Hex input:
الأرقام السداسية عشر المدخلة تحوى المفردات '0’ إلى '9’ والحروف 'A’ إلى 'F’ تنتهي بمفتاح الإدخال في نهاية الرقم. وللتبسيط سنفترض هنا أن الحروف المدخلة حروف كبيره فقط وان المدخلات لا تتعدى 4 خانات سداسية عشر ( السعه القصوى للمسجل). طريقة عمل الخوارزمية هي نفسها الطريقة المتبعة في إدخال الأرقام الثنائية فيما عدا أن عملية الازاحه للمسجل تتم بأربعة إزاحات في المرة الواحدة (لان الخانة السداسية عشر يحتوى على أربعة خانات ثنائية) وذلك لتفريغ مكان لإدخال الخانة السداسية عشر فيه. وفيما يلي نذكر خوارزمية البرنامج:
Clear BX
Input Hex character
While character <> CR Do
Convert character to Binary value
Left shift BX 4 Times
Insert value into lower 4 bits of BX
input a character
End_While
ويكون البرنامج بلغة التجميع كما يلي:
XOR BX , BX
MOV CL,4
MOV AH,1
INT 21h ;
اقرأ أول حرف
While_:
CMP AL , 0dh
JE END_While
;
حول الحرف أى الصورة الثنائية
CMP AL , 39h ; قارن مع الحرف “9"
JG Letter ;
اذا كان اكبر فهو حرف
;المفردة عبارة عن رقم
AND AL , 0fh ; حول إلى رقم ثنائي
JMP shift
;
المفردة عبارة عن حرف
Letter: Sub AL , 37h ; حول إلى رقم ثنائي
Shift: SHL BX, CL
; BX
ادخل القيمة في المسجل
OR BL, AL ; ضع القيمة في الأربع خانات السفلي
INT 21h ; اقرأ الحرف الثاني
JMP While_
END_While:

4- إخراج الأرقام السداسية عن HEX Output:
يحتوى المسجل BX على 16 خانة ثنائية أي 4 خانات سداسية عشر. ولطباعه هذا الرقم في الصورة السداسية عشر نبدأ من اليسار ونأخذ آخر أربعة خانات ثم نحولها إلى خانه سداسية عشر ونطبعها ونستمر كذلك 4 مرات كما في الخوارزمية التالية:
For 4 times Do
MOV BH to DL
Shift DL 4 times to Right
If DL < 10 then
Convert to character in 0 ......9
else
Convert to character in A..........F
end_if
Output character
Rotate BX left 4 times
END_For
تمارين
1 - قم بإجراء العمليات المنطقية التالية:
a. 10101111 AND 10001011 b. 10110001 OR 01001001
c. 01111100 XOR 11011010 d. Not 01011110

2- ما هي الأوامر المنطقية التي تقوم بالآتي:
وضع الرقم ‘1’ في الخانة ذات الوزن الأكبر والخانة ذات الوزن الأصغر في المسجل BL مع ترك باقي الخانات بدون تغيير.
عكس قيمة الخانة ذات الوزن الأكبر في المسجل BX مع ترك باقي الخانات دون تصغير.
عكس قيمة كل الخانات الموجودة في المتغير Word1.
3- استخدم الأمر Test في الآتي:
وضع الرقم '1’ في بيرق الصفر إذا كان المسجل AX يحتوى على الرقم صفر.
وضع الرقم '0’ في بيرق الصفر إذا كان المسجل DX يحتوى على عدد فردى.
وضع الرقم '1’ في بيرق الإشارة إذا كان المسجل DX يحتوى على عدد سالب.
وضع الرقم ‘1’ في بيرق الصفر إذا كان المسجل DX يحتوى على صفر.
وضع الرقم ‘1’ في بيرق خانة التطابق إذا كان المسجل BL يحتوى على عدد زوجي من الخانات التي تحتوى على الرقم '1’
4- إذا كان المسجل AL يحتوى على الرقم 11001011b وكانت قيمة بيرق المحمول
تساوى واحد CF=1 ما هي محتويات المسجل AL بعد تنفيذ كل من العمليات التالية
(افترض القيمة الابتدائية مع كل عملية).
a. SHL AL,1 b. SHR AL , 1
c. ROL AL , CL ; if CL contains 2 d. ROR AL, CL ; if CL contains 3
e. SAR AL,CL ; if CL contains 2 f. RCL AL, CL if CL contains 3
g. RCR AL ,CL; if CL contains 3
5- أكتب الأمر أو الأوامر التي تقوم بعمل التالي مفترضاً عدم حدوث فيضان.
أ- مضاعفة الرقم B5h
ب- ضرب محتويات المسجل AL في الرقم 8
جـ- قسمة الرقم 32142 على الرقم 4 ووضع النتيجة في المسجل AX
د- قسمة الرقم -2145 على الرقم 16 ووضع النتيجة في المسجل BX

6- أكتب الأمر أو الأوامر التي تقوم بالآتي:
إذا كان المسجل AL يحتوى على رقم أقل من 10 قم بتحويل الرقم الى الحرف المناظر.
إذا كان المسجل DL يحتوى على الكود ASCII لحرف كبير. قم بتحويله لحرف صغير.
7 - أكتب الأمر أو الأوامر التي تقوم بالآتي:
ضرب محتويات المسجل BL في الرقم 10D مفترضاً عدم حدوث فيضان.
إذا كان المسجل AL يحتوى على عدد موجب. قم بقسمة هذا الرقم على (8) وطرح الباقي في المسجل AH (مساعدة : استخدم الأمر ROR).

تمارين البرامج :
8 - أكتب برنامج يقوم بسؤال المستخدم لإدخال حرف. يقوم البرنامج في السطر الثاني بطباعة الكود الـ ASCII في الصورة الثنائية للحرف المدخل وكذلك عدد الخانات التي تحتوى على العدد ‘1’ في الكود . مثال
TYPE A CHARACTER : A
THE ASCII CODE OF A IN BINARY IS 01000001
THE NUMBER OF 1 BITS IS 2
9 - أكتب برنامج يقوم بسؤال المستخدم لإدخال حرف. يقوم البرنامج في السطر الثاني بطباعة الكود الـ ASCII في الصورة السداسية عشر للحرف المدخل. يقوم البرنامج بالتكرار حتى يقوم المستخدم بعدم إدخال حرف والضغط على مفتاح الإدخال.
TYPE A CHARACTER : 7
THE ASCII CODE OF 7 IN HEX IS : 37
TYPE A CHARCTER :
10 - أكتب برنامج يقوم بسؤال المستخدم لإدخال عدد سداسي عشر مكون من 4 خانات كحد أقصى. يقوم البرنامج في السطر الثاني بطباعة الرقم المدخل في الصورة الثنائية. إذا قام المستخدم بإدخال قيمة غير مسموح بها (رقم غير سداسي عشري ) يقوم البرنامج بسؤاله بالمحاولة مره أخرى.
TYPE A HEX NUMBER (0000 - FFFF) : xa
ILLEGAL HEX DIGIT, TRY AGAIN ; 1ABC
IN BIRARY IT IS 0001101010111100
11- اكتب برنامج يقوم بسؤال المستخدم لإدخال رقم ثنائي يكون من 16 خانة لعدد
أقصي.يقوم البرنامج في السطر التالي بطباعة الرقم في الصورة السداسية عشر . إذا
قام المستخدم بإدخال رقم غير ثنائي ( يحتوي علي خانة لا تساوي "0" أو لا تساوي
"1" ) يقوم البرنامج بسؤال المستخدم ليحاول مره أخري.
TYPE A BINARY NUMBER UB TO 16 DIGITS : 112
ILLEGAL BINARY DIGIT , TRY AGAIN : 11100001
IN HEX IT IS EI
12- أكتب برنامج يقوم بسؤال المستخدم لإدخال عددين ثنائيين بطول أقصى 8 خانات
يقوم البرنامج بطباعة مجموع العددين في السطر التالي في الصورة الثنائية أيضاً .
إذا قام المستخدم بإدخال رقم خطأ يتم طلب إدخال الرقم مره أخري.
TYPE A BINARY NUMBER , UP TO 8 DIGITS : 11001010
TYPE A BINARY NUMBER , UP TO 8 DIGITS : 10011100
THE BINARY SUM IS 101100110
13 - أكتب برنامج يقوم بسؤال المستخدم لإدخال عدد سداسي عشر بدون إشارة يقوم
البرنامج بطباعة مجموع العددين في السطر التالي . إذا ادخل المستخدم رقم خطأ
يتم سؤاله للمحاولة مره أخري . يقوم البرنامج باختبار حدوث عملية الفيضان
بدون إشارة ويطبع النتيجة الصحيحة
TYPE A HEX NUMBER (0 – FFFF ) : 21AB
TYPE A HEX NUMBER (0 – FFFF ) : FE03
THE SUM IS 11FAE
14- اكتب برنامج يقوم بسؤال المستخدم بإدخال أرقام عشرية تنتهي بالضغط على
مفتاح الإدخال . يقوم البرنامج بحساب وطباعة مجموع الخانات العشرية التي تم
إدخالها في السطر التالي في الصورة السداسية عشر . إذا قام المستخدم بإدخال
رقم خطأ ( لا يقع بين 9 , 0) يقوم البرنامج بسؤاله للمحاولة مرة أخرى
ENTER A DECIMAL DIGIT STRING : 1299843
THE SUM OF THE DIGITS IN HEX IS : 0024








التوقيع
جمال الزرقاء غير متواجد حالياً  
Digg this Post!Bookmark Post in Technorati
رد مع اقتباس
قديم 18-04-2010, 11:17 AM   #20
administrator
 
الصورة الرمزية جمال الزرقاء
 
تاريخ التسجيل: Dec 2005
رقم العضوية: 1927
الدولة: بداخل الالكترونيات
العمر: 39
المشاركات: 2,917
بمعدل: 0.64 (مشاركة/اليوم)



افتراضي

 

المكدس ومقدمة عن الإجراءات
The Stack and Introduction to Procedures

يتم استخدام مقطع المكدس للتخزين المؤقت للعناوين والبيانات أثناء عمل البرنامج وفى هذا الفصل سنتناول طريقة عمل المكدس واستخدامه في عملية النداء للبرنامج الفرعية Procedures وذلك لتوضيح كيفية وضع قيم في المكدس وأخذ قيم منه باستخدام الأوامر pop, push ثم نتطرق لميكانيكية نداء البرامج الفرعية مع توضيح مثال لذلك.
يعتبر المكدس كمصفوف أحادي في الذاكرة ويتم التعامل مع طرف واحد فقط منه حيث يتم إضافة العنصر في قمة المكدس ويتم أخذ آخر عنصر في عملية السحب التالية بمعني انه يعمل بطريقة آخر مدخل هو أول مخرج LIFO (Last In first out) يجب على كل برنامج أن يقوم بتحديد منطقة في الذاكرة وتعمل كمكدس كما ذكرنا في الفصول السابقة وذلك باستخدام الأمر.
STACK 100h
حيث يشير مسجل مقطع المكدس SS إلى مقطع المكدس في المثال السابق ويحتوى مؤشر المكدس SP على القيمة 100h وهى تشير إلى مكدس خالي وعند وضع قيم فيه يتم إنقاص هذه القيمة.
وضع قيم في المكدس والأوامر PUSH , PUSHF:
يتم استخدام الأمر PUSH لإدخال قيمة في المكدس وصيغته
PUSH SOURCE
حيث المصدر هو مسجل أو موقع في الذاكرة بطول 16 خانة . مثلاً
PUSH AX
ويتم في هذه العملية الآتي:
1- إنقاص قيمة مؤشر المكدس SP بقيمة 2
2- يتم وضع نسخة من المصدر في الذاكرة في العنوان SS:SP
لاحظ أن محتويات المصدر لا يتم تغييرها.
الأمر PUSHF يقوم بدفع محتويات مسجل البيارق في المكدس. فمثلاً لو كانت محتويات مؤشر المسجل SP هى الرقم 100h قبل تنفيذ العملية فبعد تنفيذ الأمر PUSHF يتم إنقاص 2 من محتويات المسجل SP لتصبح قيمته 00FEh بعد ذلك يتم عمل نسخة من محتويات مسجل البيارق في مقطع المكدس عند الإزاحة 00FE.


سحب قيمة من المكدس والأوامر POP , POPF:
لسحب قيمة من المكدس يتم استخدام الأمر POP وصيغته
POP Destination
حيث المستودع عبارة عن مسجل 16 خانة ( ماعدا المسجل IP) أو خانة في الذاكرة مثلاً POP BX وتنفيذ الأمر POP يتضمن التالي:
1- نسخ محتويات الذاكرة من العنوان SS:SP الى المستودع
2- زيادة قيمة مؤشر المكدس SP بالقيمة 2
الأمر POPF يقوم بسحب أول قيمة من المكدس إلى مسجل البيارق.
لاحظ أن أوامر التعامل مع المكدس لا تؤثر في البيارق كما أنها تتعامل مع متغيرات بطول 16 خانة ولا تتعامل مع 8 خانات. فمثلاً الأمر التالي غير صحيح
Push AL ; ILLEGAL
بالإضافة إلى برنامج المستخدم User Program يقوم نظام التشغيل باستخدام المكدس لأداء عمله فمثلاً عند استخدام نداء المقاطعة INT 21h يقوم نظام التشغيل بتخزين القيم المختلفة للمسجلات في المكدس ثم استرجاعها مره أخرى عند الانتهاء من عمل نداء المقاطعة والعودة للبرنامج وبالتالي لا يتأثر برنامج المستخدم بالتغييرات التي تمت في المسجلات.
مثال لتطبيقات استخدام المكدس:
لان نظرية عمل المكدس تعتمد على أن آخر قيمة تم تخزينها هي أول قيمة سيتم سحبها LIFO ستقوم في هذا الجزء بتوضيح مثال يقوم بقراءة جملة من لوحة المفاتيح. يقوم البرنامج في السطر التالي بطباعة الجملة بصورة عكسية مثال للتنفيذ:
? this is a test
tset a si siht
والخوارزمية هي:
Display ‘?’
Initialize count to 0
Read a character
While Character is not a Carriage return Do
push character onto the stack
increment counter
Read a character
End_While
Go to New line
For count times Do
Pop a character from the stack
Display it
End_For
يستخدم البرنامج المسجل CX للاحتفاظ بعدد حروف الجملة التي تم إدخالها بعد الخروج من حلقة while يكون عدد الحروف الموجودة في المسجل CX وتكون كل الحروف التي تم إدخالها موجودة في المكدس بعد ذلك يتأكد البرنامج من انه قد تم إدخال حروف وذلك بالتأكد من أن المسجل CX لا يساوى صفر.
.MODEL SMALL
.STACK 100H
.CODE
MAIN PROC
; display user prompt
MOV AH,2
MOV DL,'?'
INT 21H
;initialize character count
XOR CX , CX
;read character
MOV AH , 1
INT 21H
;while character is not a carriage return do
WHILE_:
CMP AL , 0DH
JE END_WHILE
PUSH AX
INC CX
INT 21H
JMP WHILE_
END_WHILE:
MOV AH , 2
MOV DL , 0DH
INT 21H
MOV DL , 0AH
INT 21H
JCXZ EXIT
TOP:
POP DX
INT 21H
LOOP TOP
EXIT: MOV AH , 4CH
INT 21H
MAIN ENDP
END MAIN
البرامج الفرعية PROCEDURES:
عند كتابة البرنامج وبالذات الكبيرة منها يتم تقسيم البرنامج إلى مجموعة البرامج الفرعية الصغيرة والتي تسهل كتابتها ويكون عمل هذه البرامج الفرعية كوحدة مستقلة لها مدخلات وتؤدى وظيفة محدودة ولها مخرجات محدده وواضحة وبالتالي يسهل استعمالها وكذلك إعادة استخدامها في برامج أخرى كما سنرى فيما بعد.
وبالتالي فان طريقة كتابة البرامج تبدأ بتقسيم المشكلة إلى مجموعة من البرامج الصغيرة ثم توزيع هذه البرامج الصغيرة وكتابة كل منها على حده واختباره وبعد ذلك يتم تجميع هذه البرامج الصغيرة لتعطى برنامج كبير.
أحد هذه البرامج الصغيرة هو البرنامج الرئيسي وهو يعتبر نقطة الدخول للبرنامج ويقوم بدوره بنداء البرامج الفرعية الأخرى والتي يقوم كل منها بدوره بعد الانتهاء بالعودة إلى البرنامج الذي قام باستدعائه. وفى حالة البرامج ذات المستوى العالي High Level Programming DrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokias تكون عملية النداء والعودة مخفية عن المبرمج ولكن في لغة التجميع يجب كتابة أمر الاستدعاء CALL أمر العودة RET كما سنرى عند التعامل مع البرامج الفرعية.
التصريج عن البرامج الفرعية Procedure Declaration:
يتم التصريح عن البرنامج الفرعي على النحو التالي:
Name PROC type
; Body of the procedure
RET
Name ENDP
حيثName هو اسم الإجراء و type هو معامل Operand اختياري ويأخذ الصيغتين NEAR أو FAR حيث NEAR تعنى أن نداء البرنامج الفرعي يتم من داخل نفس المقطع أما FAR فتعنى إن نداء البرنامج الفرعي يتم من مقطع مختلف. وإذا لم يتم كتابة شئ يتم افتراض أن البرنامج الفرعي من النوع NEAR.
الأمر RET ( Return) يؤدى إلى إنهاء البرنامج الفرعي والعودة إلى البرنامج الذي قام باستدعائه . وأي برنامج فرعى يجب أن يقوم باستخدام الأمر RET للعودة إلى البرنامج الذي قام استدعاؤه ( فيما عدا البرنامج الرئيسي) ويتم هذا عادة في آخر جملة في البرنامج الفرعي.








جمال الزرقاء غير متواجد حالياً  
Digg this Post!Bookmark Post in Technorati
رد مع اقتباس
إضافة رد


يتصفح الموضوع حالياً : 2 (0 عضو و 2 ضيف)
 
أدوات الموضوع
انواع عرض الموضوع

ضوابط المشاركة
لا تستطيع إضافة مواضيع جديدة
لا تستطيع الرد على المواضيع
لا يمكنك اضافة مرفقات
لا يمكنك تعديل مشاركاتك

BB code متاحة
كود [IMG] متاحة
كود HTML معطلة
Trackbacks are متاحة
Pingbacks are متاحة
Refbacks are متاحة



جميع الأوقات بتوقيت GMT +4. الساعة الآن 05:59 PM.

 

 
 

SEO by vBSEO 3.5.0 RC2

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426