You are on page 1of 11

‫الفصل الرابع‬

‫مسجل البيارق‬

‫أحد أهم مميزات الحاسب هي القدرة علي اتخاذ القرارات ويتم ذلك‬
‫عن طريق تحديد حالة المعالج الدقيق بعد تنفيذ عملية محددة‪ .‬في‬
‫المعالج ‪ 8086‬يتم تمثيل حالة المعالج بعد تنفيذ آخر عملية في ‪9‬‬
‫خانات ثنائية تسمي البيارق ‪ Flags‬ويتم اتخاذ القرارات المختلفة حسب‬
‫قيمة هذه البيارق‪.‬‬
‫يتم تخزين البيارق في مسجل يسمي مسجل البيارق ‪Flag Register‬‬
‫ويمكن تقسيم البيارق إلي نوعين وهما بيارق التحكم ‪Control Flags‬‬
‫وبيارق الحالة ‪ .Status Flags‬وتقوم بيارق التحكم لتشغيل أو تعطيل‬
‫عمليات محددة أثناء تنفيذ البرنامج بينما تقوم بيارق الحالة بعكس‬
‫حالة المعالج بعد تنفيذ أمر محدد كأن يتم إظهار أن النتيجة تساوي‬
‫صفر وذلك عن طريق رفع بيرق الصفر كما سنري في الجزء التالي‪.‬‬

‫مسجل البيارق‬
‫يحتوي هذا المسجل علي البيارق المختلفششة كمشا هششو موضشح بالششكل‬
‫حيث يتم تمثيل بيارق الحالششة فششي الخانششات ‪ 0‬و ‪ 2‬و ‪ 4‬و ‪ 6‬و ‪ 7‬و ‪11‬‬
‫بينما تشغل بيارق التحكم الخانات ‪ 8‬و ‪ 9‬و ‪ 10‬وتبقششي بقيششة الخانششات‬
‫بششدوت اسششتخدام ) ليششس مششن الضششروري معرفششة موقششع الششبيرق مششن‬
‫المسجل في أغلب الحالت حيث توجد أوامر للتخاطب مع كششل بيششرق‬
‫علي حدة (‪ ،‬سنتناول في الجزء التالي بيارق الحالة‬
‫‪Of Df If‬‬ ‫‪Tf‬‬ ‫‪Sf‬‬ ‫‪Zf‬‬ ‫‪Af‬‬ ‫‪Pf‬‬ ‫‪Cf‬‬
‫شكل يوضح مسجل البيارق‬
‫‪Status Flags‬‬ ‫بيارق الحالة‬
‫تقوم هذه البيارق بإظهار حالة المعالج بعد تنفيذ آخر أمر فمثل ً عند‬
‫تنفيذ المر ‪ SUB Ax,Bx‬فإن بيرق الصفر يتأثر وتصبح قيمته تساوي ‪1‬‬
‫إذا كانت النتيجة تساوي صفر‪ .‬الجدول التالي يوضح البيارق المختلفة‬

‫‪Status Flags‬‬ ‫بيارق الحالة‬


‫الخان‬ ‫‪Name‬‬ ‫السم‬ ‫الرم‬
‫ة‬ ‫ز‬
‫‪0‬‬ ‫‪Carry Flag‬‬ ‫بيرق المحمول‬ ‫‪CF‬‬
‫‪2‬‬ ‫‪Parity Flag‬‬ ‫بيرق خانة‬ ‫‪PF‬‬

‫‪- 41 -‬‬ ‫‪SUST‬‬


‫الفصل الرابع ‪ :‬مسجل البيارق‬
‫ـــــــــــــــــــــــــــــــــــــــــــــــــــــــ‬

‫التطابق‬
‫‪4‬‬ ‫‪Auxiliary Carry‬‬ ‫بيرق المحمول‬ ‫‪AF‬‬
‫‪Flag‬‬
‫المساعد‬
‫‪6‬‬ ‫‪Zero Flag‬‬ ‫بيرق الصفر‬ ‫‪ZF‬‬
‫‪7‬‬ ‫‪Sign Flag‬‬ ‫بيرق الشارة‬ ‫‪SF‬‬
‫‪11‬‬ ‫‪Overflow Flag‬‬ ‫بيرق الفيضان‬ ‫‪OF‬‬

‫‪Control Flags‬‬ ‫بيارق التحكم‬


‫‪8‬‬ ‫‪Trap Flag‬‬ ‫بيرق التنفيذ‬ ‫‪TF‬‬
‫خطوة بخطوة‬
‫‪9‬‬ ‫‪Interrupt Flag‬‬ ‫بيرق المقطعات‬ ‫‪IF‬‬
‫‪10‬‬ ‫‪Direction Flag‬‬ ‫بيرق التجاه‬ ‫‪DF‬‬

‫بيرق المحمول ‪(Carry Flag (CF‬‬


‫يحتوي هذا البيرق علي القيمة ‘‪) ’1‬يتم رفع البيرق ( إذا وجد‬
‫محمول من أو إلي الخانة ذات الوزن الكبر ‪Most Significant Bit‬‬
‫‪ ((MSB‬ويتم ذلك في حالت الجمع والطرح المختلفة‪ .‬خلف ذلك‬
‫تكون قيمة البيرق تساوي صفر‪.‬‬
‫يتأثر البيرق أيضا ً في حالة عمليات الزاحة ‪ Shift‬والدوران ‪Rotate‬‬
‫والتي سنتحدث عنها فيما بعد‪.‬‬
‫بيرق التطابق ‪(Parity Flag (PF‬‬
‫يحتوي هذا البيرق علي القيمة ‘‪ ’1‬إذا كان الحرف الصغر من‬
‫النتيجة ‪ Low Byte‬يحتوي علي عدد زوجي من الخانات التي‬
‫تحتوي علي الرقم ‘‪ .’1‬ويساوي صفر إذا كان عدد الخانات‬
‫التي تحتوي علي الرقم ‘‪ ’1‬فردي‪ .‬فمثل ً إذا كانت نتيجة آخر‬
‫عملية هو الرقم ‪ FFFEh‬فإن الحرف الصغر يحتوي علي العدد‬
‫‪ ( FEH ( 1110 1111‬وبالتالي فإن عدد الخانات التي تحتوي علي‬
‫الرقم ‘‪ ’1‬هو ‪ 7‬خانات ) عدد فردي( وعلي هذا فإن قيمة‬
‫البيرق تساوي ‘‪( PF = 0 ) ’0‬‬
‫بيرق المحمول المساعد ‪(Auxiliary Carry Flag (AF‬‬
‫يحتوي هذا البيرق علي القيمة ‘‪ ’1‬إذا كان هناك محمول من أو‬
‫إلي الخانة الرابعة ‪ bit-3‬ويتم استخدام هذا البيرق في حالة الكود‬
‫‪.(Binary Coded Decimal (BCD‬‬
‫بيرق الصفر ‪(Zero Flag (ZF‬‬
‫يحتوي هذا البيرق علي القيمة ‘‪ (ZF=1) ’1‬إذا كانت النتيجة‬
‫تساوي صفر‬
‫بيرق الشارة ‪(Sign Flag (SF‬‬

‫ـــــــــــــــــــــــــــــــــــــــــــــــــــ‬
‫‪- 42 -‬‬ ‫‪SUST‬‬
‫الفصل الرابع ‪ :‬مسجل البيارق‬
‫ـــــــــــــــــــــــــــــــــــــــــــــــــــــــ‬

‫يحتوي هذا البيرق علي القيمة ‘‪ ’1‬إذا كانت الخانة ذات الوزن‬
‫الكبر ‪ MSB‬تساوي ‘‪ ’1‬حيث يعني هذا أن النتيجة سالبة‪ ) .‬أي‬
‫أن ‪ SF = 1‬إذا كانت ‪ MSB =1‬و ‪ SF= 0‬إذا كانت ‪(MSB= 0‬‬
‫بيرق الفيضان ‪(Overflow Flag (OF‬‬
‫يحتوي هذا البيرق علي القيمة ‘‪ (OF=1) ’1‬إذا حدث فائض في‬
‫حالة الرقام ذات الشارة ‪ Signed Numbers‬وإل فإنه سيحتوي علي‬
‫صفر‪ .‬وسنناقش هذا الموضوع بالتفصيل في الجزاء المتبقية‬
‫من هذا الفصل‪.‬‬
‫الفيضان ‪Overflow‬‬
‫كما نعلم فإن إمكانية تخزين الرقام في الحاسوب محدودة‬
‫وذلك حسب المكان الذي سيتم فيه تخزين الرقم ) مثل ً أكبر‬
‫رقم يمكن تمثيله وتخزينه في خانة واحدة ‪ One Byte‬هو الرقم‬
‫‪ ( 255‬وعلي ذلك إذا أردنا إجراء عملية حسابية وزاد الناتج عن‬
‫هذه القيمة فإن المكان لن يسمح بتخزين النتيجة وفي هذه‬
‫الحالة يكون قد حدث فيضان‪.‬‬
‫أمثلة علي الفيضان‬
‫يختلف الفيضان عند التحدث عن الرقام الموجبة فقط‬
‫) الرقام بدون إشارة ( ‪ Unsigned Numbers‬عنه في الرقام بإشارة‬
‫‪ .Signed Numbers‬وعند إجراء عملية مثل الجمع هنالك أربع‬
‫احتمالت للنتيجة‪:‬‬
‫‪ - 1‬ل يوجد فيضان‬
‫‪ - 2‬فيضان بإشارة فقط‬
‫‪ - 3‬فيضان بدون إشارة فقط‬
‫‪ - 4‬فيضان بإشارة وبدون إشارة‬
‫وكمثال للفيضان بدون إشارة وليس بإشارة افترض أن المسجل ‪AX‬‬
‫يحتوي علي الرقم ‪ FFFFh‬وأن المسجل ‪ BX‬يحتوي علي الرقم ‪ 1‬وقمنا‬
‫بتنفيذ المر ‪ ADD AX, BX‬ستكون النتيجة علي النحو التالي ‪:‬‬
‫‪1111‬‬ ‫‪1111‬‬ ‫‪1111‬‬ ‫‪1111‬‬
‫‪+‬‬ ‫‪0000‬‬ ‫‪0000‬‬ ‫‪0000‬‬ ‫‪0001‬‬
‫‪=1‬‬ ‫‪0000‬‬ ‫‪0000‬‬ ‫‪0000‬‬ ‫‪0000‬‬
‫وبالتالي يكو لدينا أحد احتمالين‬
‫إذا فسرنا هذه الرقام علي أنها أرقام بدون إشارة فإن‬ ‫‪-1‬‬
‫النتيجة الصحيحة هي الرقم ‪ 65536‬أي الرقم السداسي عشر‬
‫‪ 10000h‬ولكن هذه النتيجة ل يمكن تخزينها في المسجل ) أكبر‬
‫من أكبر رقم يمكن تخزينه ‪ ( 65535‬حيث سيتم فقد الرقم ‪1‬‬
‫وتخزين الرقم ‪ 0000h‬في المسجل ‪ AX‬وبالتالي فإن النتيجة التي‬
‫تم تسجيلها هي نتيجة خاطئة‪.‬‬
‫أما إذا فسرنا هذه الرقام علي أنها أرقام بإشارة فإن‬ ‫‪-2‬‬
‫الرقم الول ‪ FFFFh‬هوالرقم –‪ 1‬وعند جمع الرقم ‪ 1‬إليه فإن‬

‫ـــــــــــــــــــــــــــــــــــــــــــــــــــ‬
‫‪- 43 -‬‬ ‫‪SUST‬‬
‫الفصل الرابع ‪ :‬مسجل البيارق‬
‫ـــــــــــــــــــــــــــــــــــــــــــــــــــــــ‬

‫النتيجة هي الرقم ‪ 0‬وعلي هذا فإن النتيجة التي تم تخزينها‬


‫) الرقم ‪ (0‬صحيحة وعلي هذا لم يحدث فيضان بإشارة‪.‬‬

‫مثال آخر لفيضان بإشارة وليس بدون إشارة‪ ،‬افترض أن كل من‬


‫المسجلين ‪ AX‬و ‪ BX‬يحتويان علي العدد ‪ 7FFFh‬وتم تنفيذ المر ‪ADD‬‬
‫‪ AX,BX‬تكون النتيجة علي النحو التالي‪:‬‬
‫‪0111‬‬ ‫‪1111‬‬ ‫‪1111‬‬ ‫‪1111‬‬
‫‪+‬‬ ‫‪0111‬‬ ‫‪1111‬‬ ‫‪1111‬‬ ‫‪1111‬‬
‫‪1111‬‬ ‫‪1111‬‬ ‫‪1111‬‬ ‫‪1110‬‬ ‫=‬ ‫‪FFFEh‬‬

‫وفي هذه الحالة التفسير للرقم ‪ 7FFFh‬في حالة الرقام بإشارة أو‬
‫بدون إشارة هو تفسير واحد حيث أن الخانة ذات الوزن الكبر تساوي‬
‫‪ ( MSB = 0 ) 0‬وهو الرقم ‪ (7FFFh) 32767‬وعلي ذلك فإن نتيجة حاصل‬
‫الجمع يجب أن تكون واحدة في الحالتين وهي الرقم ‪ 65534‬وهذه‬
‫النتيجة ل يمكن تخزينها في حالة الرقام بإشارة حيث أن تفسير هذه‬
‫النتيجة في حالة الرقام بإشارة هو الرقم السالب ) ‪( 2-‬‬
‫وعلي ذلك فلدينا في هذا المثال فيضان بإشارة ول يوجد فيضان‬
‫بدون إشارة‬

‫كيف يقوم المعالج بتوضيح حدوث الفيضان ؟‬


‫يقوم المعالج برفع بيرق الفيضان ‪ OF=1‬إذا حدث فيضان بإشارة‬
‫ورفع بيرق المحمول إذا حدث فيضان بدون إشارة ‪CF=1‬‬
‫وتصبح وظيفة البرنامج التأكد من حدوث أي من أنواع‬
‫الفيضانات التي ذكرناها واتخاذ الجراءات المناسبة‪ .‬وإذا تم‬
‫تجاهل هذه البيارق وحدث فيضان فقد تكون النتيجة غير‬
‫صحيحة‪.‬‬
‫وعلي هذا فإن المعالج ل يفرق بين الرقام بإشارة أو بدون‬
‫إشارة فهو فقط يقوم برفع البيارق لبيان حدوث أي من‬
‫الفيضان بإشارة أو بدون إشارة‪ .‬فإذا كنا في البرنامج نتعامل‬
‫مع الرقام علي أنها بدون إشارة فإننا نهتم ببيرق المحمول‬
‫فقط ‪ CF‬ونتجاهل بيرق الفيضان ‪ .OF‬أما إذا كنا نتعامل مع‬
‫الرقام بإشارة فإن بيرق الفيضان ‪ OF‬هو الذي يهمنا‪.‬‬
‫كيف يقوم المعالج بتحديد حدوث الفيضان ؟‬
‫كثير من الوامر تؤدي إلي حدوث فيضان وسنناقش هنا أوامر‬
‫الجمع والطرح للتبسيط‬

‫الفيضان بدون إشارة‬


‫‪Unsigned overflow‬‬
‫في حالة الجمع يحدث فيضان بدون إشارة إذا كان هناك‬
‫محمول من الخانة ذات الوزن الكبر ‪ MSB‬حيث يعني هذا أن‬
‫النتيجة أكبر من أن يتم تخزينها في المسجل المستودع ) أي‬
‫أن النتيجة أكبر من أكبر رقم يمكن تخزينه وهو الرقم ‪ FFFFh‬في‬
‫ـــــــــــــــــــــــــــــــــــــــــــــــــــ‬
‫‪- 44 -‬‬ ‫‪SUST‬‬
‫الفصل الرابع ‪ :‬مسجل البيارق‬
‫ـــــــــــــــــــــــــــــــــــــــــــــــــــــــ‬

‫في حالة أن‬ ‫حالة أن يكون المستودع به ‪ 16‬خانة ثنائية أو‬


‫‪FFh‬‬
‫يكون المستودع به ‪ 8‬خانات ثنائية (‪.‬‬
‫في حالة الطرح يحدث الفيضان في حالة الستلف للخانة ذات‬
‫الوزن الكبر حيث يعني هذا ان النتيجة أقل من الصفر ) رقم‬
‫سالب (‪.‬‬
‫الفيضان بإشارة ‪Signed Overflow‬‬
‫في حالة جمع أرقام بنفس الشارة يحدث الفيضان في حالة أن‬
‫تكون إشارة حاصل الجمع مختلفة عن إشارة الرقمين‪ .‬كما نجد‬
‫أنه في حالة طرح رقمين بإشارة مختلفة فإن العملية تشابه‬
‫عملية الجمع لرقمين بإشارة واحدة حيث أن‬
‫‪A–(-B)=A+B‬‬ ‫‪,‬‬ ‫‪-A – ( +B ) = -A -B‬‬
‫ويحدث الفيضان بإشارة إذا اختلفت إشارة النتيجة عن الشارة‬
‫المتوقعة كما في حالة عملية الجمع‬
‫أما في حالة جمع رقمين بإشارتين مختلفتين فإن حدوث‬
‫الفيضان مستحيل حيث أن العملية ‪ (A+-(B‬هي عبارة عن ‪A-B‬‬
‫وحيث أن الرقام ‪ A‬و ‪ B‬أرقام صغيرة أمكن تمثيلها فإن الفرق‬
‫بينهما هو أيضا ً رقم صغير يمكن تمثيله ‪ .‬وبالمثل فإن عملية‬
‫الطرح لرقمين بإشارتين مختلفتين لن تعطي أي فيضان‪.‬‬
‫وعموما ً فإن المعالج يقوم برفع بيرق الفيضان كالتي ‪ :‬إذا كان‬
‫المحمول إلي الخانة ذات الوزن الكبر ‪ MSB‬والمحمول من‬
‫الخانة ذات الوزن الكبر مختلفان ) ويعني هذا أنه يوجد محمول‬
‫إليها ول يوجد محمول منها أو ل يوجد محمول إليها ولكن يوجد‬
‫محمول منها (‪ .‬في هذه الحالة يتم رفع بيرق الفيضان ) أنظر‬
‫المثلة لحقا ً (‪.‬‬

‫كيف تؤثر العمليات علي البيارق‪:‬‬


‫عندما يقوم المعالج بتنفيذ أي أمر يتم رفع البيارق المناسبة‬
‫لتوضيح النتيجة ‪ .‬وعموما ً هناك أوامر ل تؤثر في كل البيارق‬
‫وإنما تؤثر في بعضها فقط إذ قد تترك كل البيارق دون تأثير ‪.‬‬
‫وعموما ً فإن عملية تفرع البرنامج باستخدام أوامر التفرع ‪JUMP‬‬
‫‪ INSTRUCTIONS‬تعتمد عمليا ً علي قيم البيارق المختلفة كما‬
‫سنري فيما بعد ‪.‬‬
‫فشي هشذا الجشزء سنوضشح تشأثير البيشارق فشي حالشة تنفيشذ بعشض‬
‫الوامر التي ناقشناها وتعاملنا معها في الفصل السابق ‪:‬‬

‫البيارق المتأثرة‬ ‫المر‬


‫ل تتأثر أي من البيارق‬ ‫‪MOV / XCHG‬‬

‫تتأثر كل البيارق‬ ‫‪ADD / SUB‬‬

‫ـــــــــــــــــــــــــــــــــــــــــــــــــــ‬
‫‪- 45 -‬‬ ‫‪SUST‬‬
‫الفصل الرابع ‪ :‬مسجل البيارق‬
‫ـــــــــــــــــــــــــــــــــــــــــــــــــــــــ‬

‫تتأثر كل البيارق عدا بيرق المحمول )‪(CF‬‬ ‫‪INC / DEC‬‬

‫تتأثر البيارق ) ‪ CF=1‬إل إذا كانت النتيجة تساوي ‪، 0‬‬ ‫‪NEG‬‬


‫‪ 0F=1‬إذا كان المعامل هو الرقم ‪ 800H‬في حالة‬
‫‪ WORD‬أو ‪ 80h‬في حالة المعامل ‪( Byte‬‬
‫لتوضيح تأثر البيارق بتنفيذ العمليات سنقوم بعمل بعض المثلة‬
‫في كل مثال سنوضح المر ومحتوي المعاملت ‪ operands‬وحساب‬
‫وتوقع قيم البيارق المختلفة ‪) 0f,sf,zf,pf,cf‬سنتجاهل بيرق‬
‫المحمول المساعد ‪ AF‬لنه في الحالة ذات الرقام من النوع‬
‫‪ BCD‬فقط (‪.‬‬
‫مثال ‪:1‬‬
‫نفذ المر ‪ ADD AX,BX‬حيث يحتوي المسجل ‪ AX‬علي الرقم‬
‫‪FFFFh‬والمسجل ‪ BX‬علي‬
‫الرقم ‪FFFFh‬‬
‫الحل ‪:‬‬
‫‪FFFFh‬‬
‫‪FFFFh+‬‬
‫‪1FFFEh‬‬
‫يتم تخزين الرقم ‪ (0FFFEh) 1110 1111 1111 1111‬في المسجل‬
‫‪ AX‬وعلي هذا تكون البيارق علي النحو التالي‪:‬‬
‫بيرق الشارة ‪ : SF‬يساوي ‪ 1‬لن قيمة الخانة ذات الوزن العلى‬
‫‪ MSB‬تساوي ‪. 1‬‬
‫بيرق خانة التطابق ‪ : PF‬يساوي ‪ 0‬لن لدينا عدد ‪ 7‬خانات )عدد‬
‫فردي( تحتوي علي ‪ 1‬في النصف الدنى ‪LOW BYTE‬‬
‫في النتيجة ‪.‬‬
‫يساوي ‪ 0‬لن النتيجة ل تساوي صفر ‪.‬‬ ‫بيرق الصفر ‪: ZF‬‬
‫بيرق المحمول ‪ : CF‬يساوي ‪ 1‬لن هناك محمول في الخانة ذات‬
‫الوزن الكبر ‪ MSB‬في عملية‬
‫الجمع ‪.‬‬
‫بيرق الفيضان ‪ : OF‬يساوي صفر لن إشارة النتيجة هي نفس‬
‫إشارة الرقام التي تم جمعها‬
‫) المحمول إلي الخانة ‪ MSB‬ل يختلف عن المحمول‬
‫من الخانة ‪.( MSB‬‬
‫مثال ‪: 2‬‬
‫نفذ المر ‪ ADD AL,BL‬حيث يحتوي ‪ AL‬علي الرقم ‪ 80h‬و ‪ BL‬علي‬
‫الرقم ‪80h‬‬

‫الحل ‪:‬‬
‫‪80h‬‬
‫‪80h+‬‬
‫‪100h‬‬
‫‪00h‬‬ ‫الرقم‬ ‫‪ AL‬علي‬ ‫يحتوي المسجل‬
‫ـــــــــــــــــــــــــــــــــــــــــــــــــــ‬
‫‪- 46 -‬‬ ‫‪SUST‬‬
‫الفصل الرابع ‪ :‬مسجل البيارق‬
‫ـــــــــــــــــــــــــــــــــــــــــــــــــــــــ‬

‫‪ SF=0‬لن الخانة ‪ MSB‬تحتوي علي ‪0‬‬ ‫الشارة ‪SF :‬‬ ‫بيرق‬


‫‪ PF=1‬لنه لدينا عدد ‪ 0‬خانة تحتوي علي‬ ‫خانة التطابق ‪PF:‬‬ ‫بيرق‬
‫‪ 1‬ويعتبر الصفر عدد زوجي‬ ‫الرقم‬
‫‪ ZF=1‬لن النتيجة تساوي ‪0‬‬ ‫الصفر ‪ZF :‬‬ ‫بيرق‬
‫المحمول ‪ CF=1 CF :‬لن هناك محمول إلى الخانة ذات الوزن‬ ‫بيرق‬
‫الكبر ‪MSB‬‬
‫بيرق الفيضان ‪ OF=1 OF :‬لن الرقام المجموعة سالبة بينما‬
‫النتيجة موجبة ) المحمول إلي الخانة‬
‫‪ MSB‬ل يساوي المحمول منها (‪.‬‬
‫مثال ‪:3‬‬
‫نفذ المر ‪ SUB AX,BX‬إذا كان المسجل ‪ AX‬يحتوي علي الرقم‬
‫‪ 8000h‬والمسجل‬
‫‪ BX‬يحتوي علي الرقم ‪0001h‬‬
‫الحل ‪:‬‬
‫‪8000h‬‬
‫‪-0001h‬‬
‫‪7FFFh = 0111 1111 1111 1111‬‬
‫)آخر خانة في ‪(MSB‬‬ ‫‪ SF=0‬لن خانة ‪MSB=0‬‬ ‫الشارة ‪SF :‬‬
‫بيرق‬
‫لن الخانة الصغري من النتيجة بها‬ ‫‪PF=1‬‬ ‫بيرق خانة التطابق ‪PF:‬‬
‫‪ 8‬خانات )عدد زوجي( بها "‪"1‬‬
‫‪ ZF=0‬لن النتيجة لتساوي ‪0‬‬ ‫بيرق الصفر ‪ZF :‬‬
‫بيرق المحمول ‪ CF=0 CF :‬لننا قمنا بطرح عدد صغير بدون إشارة‬
‫من عدد أكبر منه‬
‫بيرق الفيضان ‪ OF=1 OF :‬في حالة الرقام بإشارة فإننا نطرح رقم‬
‫موجب من رقم سالب ‪ .‬وهي‬
‫مثل عملية جمع رقمين سالبين‪ .‬ولن النتيجة‬
‫أصبحت موجبة )إشارة النتيجة خطأ( ‪.‬‬
‫مثال ‪:4‬‬
‫نفذ المر ‪ INC AL‬حيث ‪ AL‬يحتوي علي الرقم ‪FFh‬‬
‫الحل ‪:‬‬
‫‪FFh‬‬
‫‪+‬‬ ‫‪1h‬‬
‫‪100h‬‬
‫‪.‬بعد تنفيذ هذه العملية‬ ‫‪ 100h‬في المسجل ‪AL‬‬ ‫يتم تخزين الرقم‬
‫نجد أن‬

‫‪MSB=0‬‬ ‫لن‬ ‫بيرق الشارة‬


‫‪SF=0‬‬ ‫‪SF :‬‬
‫‪ PF=1‬لوجود ‪ 8‬خانات تحتوي علي “‪”1‬‬ ‫بيرق خانة التطابق ‪PF:‬‬
‫في البايت الدنى من النتيجة‬
‫‪ ZF=1‬لن النتيجة تساوي صفر‬ ‫بيرق الصفر ‪ZF :‬‬
‫بيرق المحمول ‪ : CF‬ل يتأثر بالمر ‪ INC‬بالرغم من حدوث فائض‪.‬‬

‫ـــــــــــــــــــــــــــــــــــــــــــــــــــ‬
‫‪- 47 -‬‬ ‫‪SUST‬‬
‫الفصل الرابع ‪ :‬مسجل البيارق‬
‫ـــــــــــــــــــــــــــــــــــــــــــــــــــــــ‬

‫وذلك لننا نجمع رقم سالب إلي رقم‬ ‫‪OF=0‬‬ ‫‪OF :‬‬‫بيرق الفيضان‬
‫موجب ) المحمول إلي‬
‫يساوي المحمول منها (‪.‬‬ ‫‪MSB‬‬ ‫الخانة‬

‫مثال ‪:5‬‬
‫نفذ المر‬
‫‪MOV AX,-5‬‬
‫يتم وضع الرقم –‪ (FFFBh) 5‬في المسجل ‪ AX‬ول تتأثر أي من البيارق‬
‫بالمر ‪. MOV‬‬
‫مثال ‪:6‬‬
‫نفذ المر ‪ NEG AX‬حيث يحتوي المسجل ‪ AX‬علي الرقم ‪8000h‬‬
‫‪8000h = 1000 0000 0000 0000‬‬
‫‪COMPLEMENT = 1000 0000 0000 0000‬‬
‫‪1000 0000 0000 0000‬‬
‫‪SF=1‬‬ ‫بيرق الشارة ‪SF :‬‬
‫‪PF=1‬‬ ‫بيرق خانة التطابق ‪PF:‬‬
‫‪ZF=0‬‬ ‫بيرق الصفر ‪ZF :‬‬
‫بيرق المحمول ‪ CF=1 CF :‬لنه في حالة تغيير الشارة فإن ‪CF =1‬‬
‫دائما ً إل إذا كان الرقم‬
‫يساوي صفر ‪.‬‬
‫بيرق الفيضان ‪ OF=1 OF :‬لننا عند تنفيذ المر ‪ NEG‬نتوقع تغيير‬
‫إشارته وفي هذه الحالة لم‬
‫تتغير الشارة ‪.‬‬
‫برنامج ‪: DEBUG‬‬
‫يمكن باستخدام برنامج ‪ DEBUG‬متابعة تنفيذ البرنامج خطوة_خطوة‬
‫وإظهار النتيجة وتأثر المسجلت بعد كل خطوة كما يمكن كتابة‬
‫برنامج بلغة التجميع حيث يقوم بتحويله إلي لغة اللة مباشرة‬
‫وتخزينها في الذاكرة‬
‫ولستعمال برنامج الش ‪ DEBUG‬نقوم بكتابة برنامج بلغة التجميع‬
‫وتجهيزه حتى نحصل علي الملف القابل للتنفيذ ‪ EXCUTABLE FILE‬بعد‬
‫ذلك يمكننا تحميل البرنامج بواسطة المر‬
‫‪C:\DOS\DEBUG TEST.EXE‬‬

‫يقوم البرنامج بالرد بالشارة "‪ "-‬دليل علي أنه في حالة انتظار لحد‬
‫الوامر وهنا توضيح لبعض الوامر الهامة ‪-:‬‬
‫‪ .1‬المر ‪ R‬وهو يوضح محتويات المسجلت ‪ .‬ولوضع قيمة محددة‬
‫في أحد المسجلت يتم كتابة المر ‪ R‬متبوعا ً بإسم المسجل )مثل ُ ‪R‬‬
‫‪.(IP‬‬
‫‪ .2‬المر ‪ (T (TRACE‬وهو يؤدي إلي تنفيذ الخطوة الحالية فقط من‬
‫البرنامج ‪.‬‬
‫‪ .3‬المر ‪ ( G ( GO‬يؤدي إلي تنفيذ البرنامج ‪.‬‬
‫‪ .4‬المر ‪ (Q (QUIT‬يؤدي إلي الخروج من البرنامج ‪.‬‬

‫ـــــــــــــــــــــــــــــــــــــــــــــــــــ‬
‫‪- 48 -‬‬ ‫‪SUST‬‬
‫الفصل الرابع ‪ :‬مسجل البيارق‬
‫ـــــــــــــــــــــــــــــــــــــــــــــــــــــــ‬

‫المر ‪ A ASSEMBLE‬يتيح فرصة كتابة برنامج ‪.‬‬ ‫‪.5‬‬


‫المر ‪ U‬لرؤية جزء من الذاكرة ‪.‬‬ ‫‪.6‬‬
‫المر ‪ D DUMB‬يؤدي إلي إظهار جزء من الذاكرة ‪.‬‬ ‫‪.7‬‬

‫دعنا نتابع تنفيذ البرنامج التالي‪:‬‬ ‫‪Debug‬‬ ‫لتجربة برنامج‬


‫‪MODEL SMALL‬‬
‫‪.STACK 100H‬‬
‫‪.CODE‬‬
‫‪MAIN PROC‬‬
‫‪MOV AX ,‬‬ ‫‪4000H‬‬ ‫‪;ax = 4000h‬‬
‫‪ADD AX ,‬‬ ‫‪AX‬‬ ‫‪;ax = 8000h‬‬
‫‪SUB AX ,‬‬ ‫‪0FFFFH‬‬ ‫‪;ax = 8001h‬‬
‫‪NEG AX‬‬ ‫‪;ax = 7fffh‬‬
‫‪INC AX‬‬ ‫‪;ax = 8000h‬‬
‫‪MOV AH ,‬‬ ‫‪4CH‬‬
‫‪INT 21H‬‬ ‫‪;DOS exit‬‬
‫‪MAIN ENDP‬‬
‫‪END MAIN‬‬

‫بعد كتابة البرنامج السابق وليكن اسمه ‪ test.asm‬وتوليد الملف القابل‬


‫للتنفيذ ‪ Executable file‬والذي سيحمل السم ‪ Test.exe‬يتم نداء برنامج ‪Debug‬‬
‫وتحميل البرنامج وذلك بتنفيذ المر التالي من محث الش ‪DOS:‬‬
‫‪c:\asm> DEBUG TEST.EXE‬‬
‫يقوم البرنامج بالتحميل وإظهار المؤشر "‪ "-‬والذي تشير للستعداد‬
‫لتلقي الوامر‪.‬‬
‫نبدأ بتجربة المر ‪ R‬وذلك لظهار محتويات المسجلت المختلفة‬
‫وتكون المخرجات علي الصورة التالية‪:‬‬
‫‪-R‬‬
‫‪AX=0000 BX=0000 CX=001F DX=0000 SP=000A BP=0000 SI=0000 DI=0000‬‬
‫‪DS=0ED5 ES=0ED5 SS=0EE5 CS=EE6 IP=0000 NV UP DI PL NZ NA PO NC‬‬
‫‪0EE6:0000‬‬ ‫‪B80040 MOV AX , 4000‬‬
‫يقوم البرنامج بإظهار محتويات المسجلت المختلفة وفي‬
‫السطر الثالث يوضح عنوان المر التالي )المطلوب تنفيذه ‪-‬‬
‫لحظ قيمة العنوان ومحتويات المسجلين ‪ ( CS:IP‬متبوعا ً بكود‬
‫اللة للمر ‪ Machine Code‬وهو الرقم ‪ B80040‬وبعد ذلك نجد المر‬
‫مكتوبا ً بلغة التجميع‪.‬‬
‫عند تشغيل البرنامج ستجد أرقام مختلفة عن الرقام الموضحة‬
‫في هذا المثال وبالذات محتويات المسجلت المختلفة‪.‬‬
‫في نهاية السطر الثاني يوجد عدد ‪ 8‬أزواج حروف عل الصورة‬
‫‪ NV UP DI PL NZ NA PO NC‬توضح محتويات البيارق المختلفة وذلك‬
‫حسب الجدول التالي‪:‬‬

‫في حالة عدم رفع‬ ‫في حالة رفع‬ ‫البيرق‬


‫البيرق ‪Clear‬‬ ‫البيرق ‪Set‬‬
‫)‪NC (No Carry‬‬ ‫)‪CY (CarrY‬‬ ‫)‪CF (CarryFlag‬‬

‫ـــــــــــــــــــــــــــــــــــــــــــــــــــ‬
‫‪- 49 -‬‬ ‫‪SUST‬‬
‫ مسجل البيارق‬: ‫الفصل الرابع‬
‫ـــــــــــــــــــــــــــــــــــــــــــــــــــــــ‬

PO (Parity Odd) PE (Parity Even) PF (Parity Flag)


NA (No Auxiliary carry) AC (Auxiliary Carry) AF (Auxiliary Flag)
NZ (NonZero) ZR (ZeRo) ZF (Zero Flag)
PL (Plus) NG (NeGative) SF (Sign Flag)
NV (No oVerflow) OV (OVerflow) OF (Overflow Flag)
Control Flags ‫التحكم‬ ‫بيارق‬
UP (UP) DN (DowN) DF (Direction Flag)
DI (Disable Interrupt) EI (Enable Interrupt) IF ( Interrupt Flag )

‫للتنفيذ خطوة خطوة‬ Trace ‫أي‬


‫لبداية تشغيل البرنامج نصدر المر‬
T
: ‫فيكون التسلسل التالي للوامر‬
‫في البداية كانت المسجلت علي النحو التالي )سنكرر الشاشة‬
‫السابقة حتى نتابع التنفيذ بالتفصيل‬

-R
AX=0000 BX=0000 CX=001F DX=0000 SP=000A BP=0000 SI=0000 DI=0000
DS=0ED5 ES=0ED5 SS=0EE5 CS=EE6 IP=0000 NV UP DI PL NZ NA PO NC
0EE6:0000 B80040 MOV AX , 4000
MOV AX , 4000h ‫ المر الول‬:‫ثم نبدأ التنفيذ‬
-T
AX=4000 BX=0000 CX=001F DX=0000 SP=000A BP=0000 SI=0000 DI=0000
DS=0ED5 ES=0ED5 SS=0EE5 CS=EE6 IP=0003 NV UP DI PL NZ NA PO NC
0EE6:0003 03C0 ADD AX , AX ‫في المسجل‬
AX ‫التنفيذ يضع‬
4000h
‫ ولم يتم تغيير‬4000H ‫ أصبح به الرقم‬AX ‫لحظ أن المسجل‬
ADD AX,AX ‫محتويات البيارق وأن المر التالي أصبح المر‬
-T
AX=8000 BX=0000 CX=001F DX=0000 SP=000A BP=0000 SI=0000 DI=0000
DS=0ED5 ES=0ED5 SS=0EE5 CS=EE6 IP=0005 OV UP DI NG NZ NA PE NC
‫السابقة أثرت‬
0EE6:0005 ‫النتيجة‬
2DFFFF ‫وأن‬
SUB AX 8000H ‫ أصبح به الرقم‬AX ‫المسجل‬
, FFFF ‫لحظ أن‬
‫في البيارق حيث تم رفع بيرق الفيضان ليشير إلي حدوث فيضان‬
‫بإشارة وبيرق الشارة ليشير إلي أن النتيجة سالبة وكذلك بيرق‬
‫( تحتوي علي عدد‬AL ‫ )أي‬AX ‫التطابق لن الخانة الصغر من المسجل‬
‫ والن نتابع تنفيذ البرنامج حيث‬. 1 ‫زوجي من الخانات التي بها الرقم‬
SUB AX,FFFFh ‫المر التالي هو المر‬
-T
AX=8001 BX=0000 CX=001F DX=0000 SP=000A BP=0000 SI=0000 DI=0000
DS=0ED5 ES=0ED5 SS=0EE5 CS=EE6 IP=0008 NV UP DI NG NZ AC PO CY
0EE6:0008 F7D8 NEG AX
-T
AX=7FFF BX=0000 CX=001F DX=0000 SP=000A BP=0000 SI=0000 DI=0000
DS=0ED5 ES=0ED5 SS=0EE5 CS=EE6 IP=000A NV UP DI PL NZ AC PE CY
0EE6:000A 40 INC AX
-T
AX=8000 BX=0000 CX=001F DX=0000 SP=000A BP=0000 SI=0000 DI=0000
DS=0ED5 ES=0ED5 SS=0EE5 CS=EE6 IP=000B OV UP DI NG NZ AC PE CY
0EE6:000B B44C MOV AH , 4C

-G
PROGRAM TERMINATED NORMALLY
-Q
C:\> ‫ـــــــــــــــــــــــــــــــــــــــــــــــــــ‬
- 50 - SUST
‫الفصل الرابع ‪ :‬مسجل البيارق‬
‫ـــــــــــــــــــــــــــــــــــــــــــــــــــــــ‬

‫تمارين ‪:‬‬
‫وضع محتويات المسجل المستودع ‪ DESTINATION REG‬وكذلك قيم‬
‫البيارق بعد تنفيذ كل من الوامر التالية ‪.‬‬
‫‪ ADD AX,BX .1‬حيث يحتوي المسجل ‪ AX‬علي الرقم ‪7FFFh‬‬
‫والمسجل ‪ BX‬علي ‪.0001h‬‬
‫‪ SUB AL,B .2‬حيث ‪ AL=01h‬و ‪BL=FFh‬‬
‫‪ DEC AL .3‬حيث ‪AL=00h‬‬
‫‪ NEG AL .4‬حيث ‪AL=7F‬‬
‫‪ XCHG AX,BX .5‬حيث ‪ AX=1ABCh‬و ‪. BX=712h‬‬
‫‪ ADD AL,BL .6‬حيث ‪ AL=80h‬و ‪. BL=FFh‬‬
‫‪ SUB AX,BX .7‬حيث ‪ AX=0000h‬و ‪. BX=8000h‬‬
‫‪ NEG AX .8‬حيث ‪. AX=0001h‬‬

‫‪-2‬أفترض ان المسجلين ‪ BX AX‬يحتويان علي أرقام موجبة ‪ .‬وتم تنفيذ‬


‫المر ‪ ADD AX,BX‬وضح أنه يوجد محمول إلي الخانة ‪ MSB‬ول يوجد‬
‫محمول منها وذلك فقط في حالة حدوث فيضان بإشارة ‪.‬‬
‫أفترض ان المسجلين ‪ BX AX‬يحتويان علي أرقام سالبة ‪ .‬وتم تنفيذ‬
‫المر ‪ ADD AX,BX‬وضح أنه يوجد محمول من الخانة ‪ MSB‬ول يوجد‬
‫محمول إليها وذلك فقط في حالة حدوث فيضان بإشارة ‪.‬‬

‫‪ -3‬أفترض أن المر ‪ ADD AX,BX‬تم تنفيذه إذا كانت محتويات المسجل‬


‫‪ AX‬هي الرقم الول بينما المسجل ‪ BX‬به الرقم التالي ‪ .‬وضح‬
‫محتويات المسجل ‪ AX‬في كل من الحالت التية موضحا ُ حدوث‬
‫فيضان بإشارة أو بدون إشارة ‪.‬‬
‫هش‪6389h .‬‬ ‫د‪7132h .‬‬ ‫ج‪E1E4h .‬‬ ‫ب‪FE12h.‬‬ ‫أ‪512Ch .‬‬
‫‪+ 1176h‬‬ ‫‪7000h+‬‬ ‫‪DAB3h+‬‬ ‫‪1ACBh+‬‬ ‫‪4185h+‬‬
‫‪ -4‬أفترض أن المر ‪ SUB AX,BX‬تم تنفيذه إذا كانت محتويات المسجل‬
‫‪ AX‬هي الرقم الول بينما المسجل ‪ BX‬به الرقم التالي ‪ .‬وضح‬
‫محتويات المسجل ‪ AX‬في كل من الحالت التية موضحا ُ حدوث‬
‫فيضان بإشارة أو بدون إشارة ‪.‬‬
‫هش‬ ‫د‪0002h .‬‬ ‫ج‪19BCh .‬‬ ‫ب‪81Feh .‬‬ ‫‪2143h‬‬ ‫أ‪.‬‬
‫‪88CDh‬‬
‫‪71ABh‬‬ ‫‪FE0Fh -81Feh -1986h‬‬ ‫‪1986h-‬‬

‫ـــــــــــــــــــــــــــــــــــــــــــــــــــ‬
‫‪- 51 -‬‬ ‫‪SUST‬‬

You might also like