الجزء الثاني:
تحتوي لغة التجميع على مجموعة من التعليمات المخصصة للقيام بالعمليات الحسابية الضرورية من جمع وطرح وضرب وقسمة. وبما أن جهاز الحاسوب يقوم بأداء هذه العمليات على الأعداد الممثلة بأحد طرق تمثيل البيانات الرقمية داخل الحاسوب فبإمكانه تنفيذ العمليات الحسابية على الأرقام الثنائية بإشارة وبدون إشارة وعلى الأرقام الممثلة بالنظام العشري الثنائي المضغوط (Packed BCD) وغير المضغوط (Unpacked BCD) والفرق بين النظامين المضغوط وغير المضغوط هو أن تمثيل الرقم في النظام المضغوط يحتاج إلى 4 ثنائيات بينما تمثيله في النظام غير المضغوط يحتاج إلى 8 ثنائيات.
يحدد طول الأرقام الثنائية المستعملة في التعليمات الحسابية بـ 8 أو 16 ثنائية. لذا تتطلب معالجة الأعداد التي يزيد طولها عن ذلك معاملة خاصة عن طريق مجموعة من التعليمات بدل تعليمة واحدة.
وتجدر الإشارة إلى أنه يمكن للمعالج معالجة بيانات رقمية غير ممثلة بالنظام الثنائي وهذا يتطلب تنفيذ بعض تعليمات التعديل على النتائج لتعديلها وتحويلها إلى قيم سليمة بالنظام المعني।تذكر دائماً عزيزي الدارس، أن المعالج الميكروي لا يميز ما إذا كانت البيانات المشمولة في عملية حسابية تمثل بيانات ثنائية مع إشارة أو بدون إشارة أو بيانات ممثلة بالنظام الثنائي المضغوط أو غير المضغوط. فالمعالج في جميع الأحوال يتعامل مع جميع المعاملات الحسابية على أنها قيم ثنائية. ويمكن تقسيم التعليمات الحسابية إلى خمس مجموعات رئيسة تتكون كل مجموعة من عدد من التعليمات وهذه المجموعات هي:
- تعليمات الإضافة (الجمع) Addition Instructions
- تعليمات الطرح Subtraction Instructions
- تعليمات القسمة Division Instructions
- تعليمات مد خانة الإشارة Sign_Extension ईन्स्त्रुक्तिओन्सتعليمات الإضافة ((Addition Instructions
يوجد خمس تعليمات ضمن هذه المجموعة وهي كما يأتي :
1) تعليمة الإضافة ADD
والصيغة العامة لهذه التعليمة هي: ADD dest, source
حيث أن source: يمثل حقل بيانات المعامل الأول (معامل المصدر)
dest: يمثل حقل المعامل الثاني للعملية والمستقبل للنتيجة.
وتعمل هذه التعليمة على إضافة محتويات الحقل Source إلى محتويات الحقل dest ومن ثم تخزين الناتج في dest أي أن: dest = dest + source
ويمكن تمثيل تنفيذ التعليمة بالعلاقة :القيمة المخزنة في حقل مستقبل البيانات بعد تنفيذ التعليمة = القيمة المخزنة في حقل مستقبل البيانات قبل تنفيذ التعليمة + القيمة المخزنة في حقل بيانات المصدر।
ومن استخدامات هذه التعليمة انه يمكن إضافة محتويات مسجل إلى مسجل آخر أو إلى محتويات موقع في الذاكرة شريطة أن يكون المعاملين من نفس الطول (بايت أو كلمة)، كذلك يمكن إضافة قيمة فورية إلى مسجل أو موقع في الذاكرة والأمثلة الآتية، توضح ذلك:
ADD AL, Mem_Byte ;
ADD Mem_word, AX ;
ADD BL, 20 ADD AX, BX ;
وتجدر الإشارة إلى أنه من غير الجائز إضافة موقع في الذاكرة إلى آخر مباشرة. ويمكن عمل ذلك عن طريق استخدام مسجل وسيط من مسجلات عامة الغرض. كذلك من غير الجائز استعمال قيمة فورية في حقل مستقبل البيانات।
2) تعليمة الإضافة مع الحمل (ADC (ADD carry with
الصيغة العامة لهذه التعليمة هي: ADC dest, source
ويشبه عمل هذه التعليمة عمل التعليمة ADD مع الفارق الوحيد أنه أثناء عملية جمع محتوى حقل المصدر ومحتوى حقل مستقبل البيانات يضاف إلى ذلك قيمة راية الحمل (Carry Flag) أي أنه يمكن تمثيل عمل هذه التعليمة كما يلي:
القيمة المخزنة في حقل مستقبل البيانات بعد إتمام العملية = القيمة المخزنة فيه قبل بدء التنفيذ + القيمة المخزنة في حقل المصدر (source) + (القيمة المخزنة في راية الحمل CF)
أي أن: dest = dest + source + CF
ولتوضيح مبدأ الحمل نفرض أننا نود إضافة العدد 250 إلى العدد 20 كما يلي:
يمثل العدد 250 بالنظام الثنائي على الشكل 11111010
كذلك يمثل العدد 20 بالنظام الثنائي على الشكل: 00010100 +
يكون حاصل مجموع العددين هو 10(270) = 100001110
ولتمثيل النتيجة تمثيلاً صحيحاً نحتاج إلى 9 خانات ثنائية. أما إذا كنا نستخدم مسجلاً أو موقعاً في الذاكرة مكون من 8 خانات فإن الخانات الثمانية الأولى إبتداءً من أقصى اليمين (0 0 0 0 1 1 1 0 في هذا المثال) سيتم تخزينها في حقل مستقبل البيانات وأن الخانة التاسعة من النتيجة (القيمة 1 في هذا المثال) سيتم تخزينها في راية الحمل. لذلك إذا أخذنا القيمة المخزنة في موقع الذاكرة أو المسجل لوحدها فهي تمثل العدد 14 وليس العدد 270 من الممكن استخدام التعليمة ADC مع التعليمة ADD لجمع عددين طول كل منهما 32 ثنائية।لو فرضنا على سبيل المثال أن العدد الأول مخزن في المسجلين CX وDX والعدد الثاني في المسجلين AX وBX، يمكن إضافة محتوى المسجلين CX وDX إلى محتوى المسجلين AX وBX وتخزين الناتج في المسجلين AX وBX على النحو التالي:
AX, CX ADD
BX, DX ADC
فالتعليمة الأولى تعمل على إضافة محتوى المسجل CX إلى محتوى المسجل AX وفي حال وجود حمل (باليد) في ناتج هذه العملية يتم أخذه بعين الاعتبار في التعليمة الثانية أي:
ADC BX, DX
والتي يؤدي تنفيذها إلى إضافة محتوى المسجل DX إلى محتوى المسجل BX مضافاً إلى ذلك قيمة راية الحمل الناتجة عن التعليمة ADD السابقة।
3) تعليمة تعديل الآسكي للجمع (AAA (ASCII Adjust for Addition
الصيغة العامة لهذه التعليمة هي: AAA.
حيث تستخدم بدون معاملات وتأتي بعد تعليمات الجمع مباشرة. وتعمل هذه التعليمة على تعديل القيمة المخزنة في المسجل AL عند جمع الأعداد الممثلة بالنظام العشري الثنائي غير المضغوط، أما طريقة عمل هذه التعليمة فيمكن تلخيصها بالآتي:
تفحص هذه التعليمة النصف الأيمن من المسجل AL، فإذ احتوى على رقم يتراوح بين 0 و9 تتم عملية تصفير النصف الأيسر من AL ووضع الرايات AF وCF في حالة الصفر. أما إذا كان النصف الأيمن من المسجل AL يحتوي على قيمة أكبر من 9، أو كانت الراية AF في حالة "1" فهذا يعني أن محتوى النصف الأيمن من المسجل AL لا يحتوي رقماً ممثلاً بالنظام العشري الثنائي.
لذلك يتم تحويل هذه القيمة المخزنة في AL إلى قيمة عشرية ثنائية غير مضغوطة. ويتم ذلك حسب الخطوات التالية نتيجة تنفيذ التعليمة AAA بعد العملية الحسابية
يضاف الرقم 6 إلى محتوى المسجل AL
يضاف الرقم 1 إلى محتوى المسجل AH
يصفر النصف الأيسر من المسجل AL
توضع الرايات CF و AF في حالة "1"
مثال
قيمة محتوى المسجل (AX في النظام السادس عشري) بعد تنفيذ التعليمات الآتية:
MOV AX, 4567H
MOV AH, 0
ADD AX, 48H
AAA
الحل:
بعد تنفيذ التعليمة الأولى، أي: MOV AX, 4567H تصبح محتويات السجل AX مساوية 4567H أي
أما تنفيذ التعليمة الثانية أي MOV AH, 0 يؤدي إلى تصفير المسجل AH وتصبح محتويات المسجل AX كما هو مبين:
أما تنفيذ التعليمة الثالثة فيؤدي إلى جمع القيمة 16(48) إلى القيمة 16(67) وتخزين الناتج في المسجل AX بحيث تصبح محتويات المسجل AX تساوي القيمة 16(AF) كما هو مبين:
(67)16
+ (48)16
(AF)16
يلاحظ أن هذه القيمة أكثر من 9 لذلك عند تنفيذ التعليمة AAA تنفذ الخطوات الآتية:
- يضاف الرقم 6 إلى محتوى المسجل AL. حيث يصبح محتواه مساوياً للقيمة 16(B5) نتيجة لذلك.
- يضاف الرقم 1 إلى المسجل AH علماً أن محتواه قبل هذه الإضافة يساوي 0، بذلك يصبح المسجل AX حتى هذه اللحظة يحتوي على القيم:
- يصفر النصف الأيسر من المسجل AL، وبذلك يصبح محتوى المسجل AX النهائي على النحو:
- توضع الرايات CF وAF في حالة "1"
لاحظ عزيزي الدارس أن القيمة 05 في المسجل AL هي نتيجة لجمع الخانة الاولى من العددين: 67 و484) تعليمة التعديل العشري للجمع (DAA (Decimal Adjust for Addition
الصيغة العامة لهذه التعليمة هي: DAA
وهي تحتاج إلى معاملات وطريقة عملها يشبه إلى حد كبير عمل تعليمة AAA إلا أن هذه التعليمة تعالج جميع القيمة المخزنة في المسجل AL وليس الرقم السادس عشري الأول فقط. لذلك فإن هذه التعليمة ضرورية عند جمع رقمين ممثلين بالنظام العشري الثنائي المضغوط وذلك لتعديل النتيجة كي تصبح هذه النتيجة أيضاً سليمة حسب هذه الطريقة للتنفيذ. ويؤدي تنفيذ هذه التعليمة إلى الخطوات التالية وحسب الترتيب.
- إذا كانت قيمة النصف الأيمن في المسجل AL أكبر من 9 أو كانت الراية AF في الحالة "1" يضاف الرقم 6 إلى النصف الأيمن من المسجل AL وتوضع الراية AF في الحالة "1" وإلا فيترك النصف الأيمن للعدد كما هو. من ثم يتم فحص النصف الأيسر من AL.
- إذا كانت القيمة المخزنة في النصف الأيسر من المسجل AL أكبر من 9 أو كانت الراية CF في الحالة «1» تتم إضافة الرقم 60H إلى المسجل AL وتوضع الراية CF في الحالة "1".
مثال
جمع العددين 36 و54 باستخدام النظام العشري الثنائي المضغوط يجب ادخال هذين العددين إلى الحاسوب ممثلين بالنظام السادس عشري. أي أن 10(36) تعامل علي أنها 16(36) وكذلك 10(54) تعامل على أنها 16(54) عند إدخالها
إلى جهاز الحاسوب. لذلك فإن عملية الجمع تتم باستخدام تعليمة ADD على النحو الآتي :
MOV AL, 36H
ADD AL, 54H
وتنفيذ هاتين التعليمتين يؤدي إلى الحصول على النتيجة الثنائية 10001010 والتي تمثل العدد 16(8A) على النحو الآتي:
الرقم 10(36) ممثلاً بالنظام العشري المضغوط 00110110
الرقم 10(54) ممثلاً بالنظام العشري المضغوط 01010100 +
_________________
النتيجة
10001010
إلا أننا نعلم أن A ليست من ضمن الأرقام العشرية الثنائية وهي أكبر من 9 لذلك يؤدي تنفيذ التعليمة DAA إلى إضافة الرقم 6 إلى المسجل AL للحصول على العدد العشري الثنائي المضغوط 2(10010000) والذي يمثل الرقم العشري الثنائي المضغوط 90 على النحو الآتي:
0 1 0 1 0 0 0 1
0 1 1 0 0 0 0 0
__________________
0 0 0 0 1 0 0 1
وأخيراً توضع الراية AF في الحالة "1"5) تعليمة الزيادة بواحد (INC (Increment
تستخدم هذه التعليمة عند الحاجة لإضافة القيمة 1 إلى محتوى أحد المسجلات أو مواقع الذاكرة والصيغة العامة لهذه التعليمة هي:
INC destination
حيث أن:- Destination تمثل مسجلاً أو موقعاً في الذاكرة بطول 8 أو 16 ثنائية. وهذه التعليمة لا تؤثر على راية الحمل كما هو الحال مع تعليمتي ADC وADD تستخدم هذه التعليمة عند الحاجة لتعديل قيم العدادات (Counters) في جمل التكرار وكذلك لتعديل قيم مسجلات الفهرسة ومسجلات المؤشرات عند التعامل مع مجموعة من القيم المتجاورة في الذاكرة. وفيما يأتي بعض الأمثلة على هذه التعليمة: تؤدي هذه التعليمة إلى زيادة محتوى المسجل AX بالقيمة INC AX ; 1
وتؤدي هذه إلى زيادة محتوى موقع الذاكرة المعنون بالاسم Table بمقدار INC Table ; 1
ومن ميزات هذه التعليمة أن المعالج 8088 يحتاج لوقت أكثر عند استخدام هذه التعليمة مع مسجل طوله 8 ثنائيات منه عند استخدامها مع مسجل طوله 16 ثنائية. والسبب في ذلك أن مصممي هذا المعالج قد أخذوا بعين الاعتبار أن المبرمجين سوف يستعملون العدادات بطول 16 ثنائية أكثر من تلك التي طولها 8 ثنائيات. لذلك فإن المصممين قد صمموا تعليمة خاصة لهذا الغرض بطول بايت واحد لزيادة مسجل طوله 16 ثنائية.
تعليمات الطرح (Subtraction Instructions)
يقوم المعالج 8088 وأفراد عائلته بإجراء عمليات الطرح بواسطة وحدة الجمع (Adder) وذلك بجمع المطروح منه مع المكمل لاثنين للعدد الثاني (أي المطروح) حيث أن هذا المعالج لا يحتوي على وحدة داخلية خاصة بتعليمات الطرح.
فعلى سبيل المثال
فإن العملية الحسابية: A – B
يمكن تمثيلها على الشكل: (–B)
حيث تمثل القيمة (–B) باستخدام المكمل لأثنين وبذلك تحول عملية الطرح إلى عملية جمع. وفي مثل هذه الحالة فإنه يتم إهمال قيمة راية الحمل إذا ما زادت نتيجة عملية الإضافة على 8 خانات ثنائيةمثال
اطرح القيمة 7 من القيمة 10 باستخدام عملية الجمع والمكمل لأثنين و 8 مواقع ثنائية
الحل:
يمثل العدد 10 بالصيغة الثنائية: 0 1 0 1 0 0 0 0
ومن ثم يمثل العدد 7- بالصيغة الثنائية: 1 0 0 1 1 1 1 1 +
وبعد إجراء عملية الجمع نحصل على النتيجة: 1 1 0 0 0 0 0 0 1
حيث يتم إهمال الخانة التاسعة وتصبح النتيجة النهائية مساوية 10 (3).
تتكون تعليمات الطرح من 7 تعليمات سيتم معالجتها في البنود التالية:1) تعليمة الطرح (SUB (Subtract
الصيغة العامة لهذه التعليمة هي: SUB dest, source
حيث أن:
source: يمثل حقل العدد المطروح
dest: يمثل حقل العدد المطروح منه ويستخدم لتخزين ناتج العملية.
وتعمل هذه التعليمة على طرح المعامل source من العامل dest وتخزين النتيجة في dest أي أن:
(dest = (dest – source
باستخدام هذه التعليمة يمكن طرح القيمة المخزنة في مسجل من المسجلات أو قيمة فورية من مسجل آخر أو من موقع في الذاكرة. كذلك يمكن طرح قيمة مخزنة في موقع في الذاكرة في مسجل. ومن غير الجائز طرح موقع في الذاكر من موقع آخر مباشرة. كذلك من غير الجائز استعمال قيمة فورية مكان الحقل dest يمكن لاي من الحقلين source و dest أن يتكون من 8 ثنائيات أو من 16 ثنائية.
والأمثلة الآتية تبين استعمال هذه التعليمة: تعني هذه التعليمة طرح قيمة المسجل AX من نفسه، وتخزين الناتج
SUB AX, AX;
أي القيمة 0 في المسجل AX وهذه من الطرق المتبعة لتصفير المسجل هذه التعليمة مثال على طرح موقع ذاكرة من مسجل
SUB AX, Mem_word;
وهذه مثال على طرح قيمة فورية من مسجل ;SUB AL, 20
2) تعليمة الطرح مع الاستعارة (SBB (Subtract with borrow
تؤدي هذه التعليمة عملاً مشابهاً لعمل التعليمة SUB مع الفارق البسيط وهو أن هذه التعليمة تأخذ بعين الاعتبار راية الحمل أثناء عملية الطرح. والصيغة العامة لهذه التعليمة هي:
SBB Dest, source
حيث أن source وdest كما في التعليمة SUB.
والمقصود بهذه التعليمة هو أن:
قيمة dest بعد إجراء العملية = قيمة dest قبل إجراء العملية - قيمة source - قيمة راية الحمل أي أن:
dest = dest - source - CF
يمكن استخدام التعليمة SBB مع التعليمة SUB لطرح عدد مكون من 32 ثنائية مخزن في مسجلين طول كل منهما 16 ثنائية من عدد آخر مماثل له في الطول ومخزن في مسجلين آخرين
مثال
افرض أن عدداً مكون من 32 خانة ثنائية حيث أن النصف الأيمن من هذه الخانات مخزن في المسجل CX والنصف الأيسر مخزن في المسجل DX والمطلوب هو طرح هذا العدد من عدد آخر مخزن نصف ثنائياته الأيمن في المسجل AX والنصف الأيسر في المسجل BX وتخزين الناتج في المسجلين AX وBX.
الحل:
يمكن ذلك عن طريق استخدام التعليمتين :
SUB AX, CX
SBB BX, DX
فالتعليمة الأولى تعمل على طرح محتوى المسجل CX من محتوى المسجل AX وتخزين الناتج في المسجل AX وفي حال وجود استقراض ناتج عن هذه العملية توضع راية الحمل CF في الحالة "1" حيث تأخذ هذه القيمة بعين الاعتبار في التعليمة الثانية:
SBB BX, DX
والتي تؤدي إلى طرح محتوى المسجل DX مضافاً إليه قيمة راية الحمل من محتوى المسجل BX وبذلك يتم المطلوب. تجدر الإشارة على أنه ما ينطبق من قواعد على تعليمة SUB تنطبق أيضاً على تعليمة SBB أما بالنسبة للرايات فإن قيم رايات الإشارة (SF) والفيض (OF) ذات أهمية عند طرح أرقام مع الإشارة فقط وكذلك فإن قيمة AF هي ذات أهمية عند طرح أعداد بالنظام العشري الثنائي فقط.
3) تعليمة التعديل الآسكي للطرح (ASS (Ascii Adjust for Subtraction
يأتي موقع هذه التعليمة في الغالب بعد التعليمتين SUB وSBB في برنامج لغة أسمبلي وذلك لتحويل القيمة المخزنة في المسجل AL من الصيغة الثنائية إلى النظام العشري الثنائي. والخطوات التي تتم نتيجة لتنفيذ هذه التعليمة تعتمد على القيمة المخزنة في النصف الأيمن من المسجل AL، حيث تفحص التعليمة AAS النصف الأيمن من المسجل AL فإذا كانت قيمة محتوياته تتراوح بين 0 و9 تؤدي هذه التعليمة إلى تصفير النصف الأيسر من المسجل AL ووضع الرايات CF وAF في حالة " 0" أما إذا كان النصف الأيمن من ثنائيات المسجل AL يحتوي على قيمة أكبر من (9 وهو أكبر رقم بالنظام العشري الثنائي يمكن تمثيله في 4 ثنائيات) أو كانت قيمة الراية AF تساوي "1" تنفذ الخطوات الآتية:
- يطرح الرقم 6 من محتوى المسجل AL.
- يطرح الرقم 1 من المسجل AH.
- توضع الرايات CF وAF في حالة "1".
- يصفر النصف الأيسر من المسجل AL.
- بذلك يصبح المسجل AL محتوياً على رقم عشري ثنائي غير مضغوط، والصيغة العامة لهذه التعليمة هي: AAS.
حيث أن المعامل يأخذ ضمناً على أنه المسجل AL.
مثال
بين بالتفصيل نتيجة تنفيذ التعليمات التالية إذا كانت كل من الرايات CF وAF في الحالة "0" وقيمة AH تساوي:
16(2B)
MOV AL, 55H
MOV BL, 26H
SUB AL, BL
الحل:
4) تعليمة التعديل العشري للطرح (DAS (Decimal Adjust for Substraction
الصيغة العامة لهذه التعليمة هي: DAS
أي أن التعليمة تكتب بدون معاملات حيث أنها ضمناً تعمل على محتوى المسجل AL. وتعالج هذه التعليمة الرقمين المخزنين في المسجل AL بدلاً من رقم واحد كما هو الحال مع التعليمة السابقة. وتلي هذه التعليمة تعليمة SUB أو تعليمة SBB في برنامج لغة أسمبلي. أما بالنسبة لأداء هذه التعليمة فيمكن تلخيصه بالآتي:
تقوم هذه التعليمة بفحص محتويات المسجل AL وبناءً عليه:
* إذا كان محتوى النصف الأيمن من المسجل AL يحمل قيمة أكبر من 9 أو كانت الراية AF في الحالة "1" يطرح الرقم 6 من المسجل AL وتوضع الراية AF في الحالة "1".
مثال
إذا علمت أن محتوي المسجل AL هو 55H ومحتوى المسجل BL هو 26H بين محتوى المسجل AL وقيم الرايات CF وAF بعد تنفيذ التعليمتين:
SUB AL,BL
DAS
الحل:
تمثل 16(55) بالمكمل لاثنين على الشكل: 1 0 1 0 1 0 1 0
وتمثل 16(26) بالمكمل لاثنين على الشكل: 0 1 0 1 1 0 1 1 +
1 1 1 1 0 1 0 0
حيث تكون نتيجة الإضافة مساوية للقيمة 2F بالنظام السادس عشري ويلاحظ من هذه النتيجة أن النصف الأيمن من محتوى المسجل AL هو F أي رقماً ليس من ضمن الأرقام العشرية الثنائية. لذلك يتم طرح الرقم 6 من محتوى المسجل AL للحصول على النتيجة الصحيحة أي 29 بالنظام العشري الثنائي والتي ستخزن في المسجل AL واخبرا توضع الراية AF في حالة "1".
لاحظ عزيزي الدارس أن التعليمتين DAA وDAS لا تؤثران على محتوى المسجل AH كما هو الحال مع التعليمتين AAA وAAS كذلك فإن راية الحمل المساعد AF توضع في الحالة "1" إذا كان هناك حمل من الرقم الأول إلى الرقم الثاني أو استعارة من الرقم الثاني إلى الرقم الأول. وبالنسبة للراية CF فإنها توضع في الحالة "1" إذا كان هناك حمل من الرقم الثاني في المسجل AL إلى بايت آخر، أو هناك استعارة من بايت آخر إلى هذا الرقم.
5) تعليمة النقص بواحد (DEC (Decrement
الصيغة العامة لهذه التعليمة هي:
DEC dest
حيث يمثل dest اسم مسجل أو عنوان موقع في الذاكرة مكون من 8 أو 16 خانة ثنائية. وتعمل هذه التعليمة على إنقاص محتوى المسجل أو موقع الذاكرة المقصود بالقيمة 1 وليس لهذه التعليمة أي تأثير على الرايات. كما هو الحال مع تعليمة INC فإن إنقاص محتوى مسجل طوله 16 ثنائية يستغرق وقتاً أقل من الوقت اللازم لإنقاص محتوى مسجل طوله 8 ثنائيات، كذلك فإن طول التعليمة اللازمة لإنقاص محتوى مسجل طوله 16 ثنائية أقل من طول التعليمة اللازمة لإنقاص محتوى مسجل طوله 8 ثنائيات وذلك لنفس الأسباب التي ذكرناها بخصوص التعليمة INC.
وفيما يأتي بعض الأمثلة على هذه التعليمة:
هذه التعليمة تنقص محتويات المسجل AL بمقدار DEC AL; 1
هذه التعليمة تنقص محتويات المسجل CX بمقدار DEC CX; 1
هذه التعليمة تنقص محتوى موقع الذاكرة Mem_byte بمقدار DEC Mem_Byte ; 1
6) تعليمة العكس (NEG (Negate
تستخدم هذه التعليمة لإيجاد المكمل لاثنين لمعامل معين والذي يمكن أن يكون اسم مسجل أو موقع من مواقع الذاكرة بطول 8 أو 16 خانة ثنائية. والصيغة العامة لهذه التعليمة هي:
NEG dest
حيث يمثل dest اسم أحد المسجلات أو موقع من مواقع الذاكرة. ويمكن لهذا المسجل أو موقع الذاكرة أن يكون بطول 8 ثنائيات أو 16 ثنائية. وتعمل التعليمة على إيجاد المكمل لاثنين للمعامل وتخزين الناتج فيه. لذلك يستخدم dest على أنه مصدر البيانات ومستقبل النتيجة. وبالنسبة لتأثير هذه التعليمة على مسجل الرايات فهو مماثل للتعليمة SUB. كما تعلم عزيزي الدارس فإنه من غير الممكن طرح مسجل أو مكان في الذاكرة من قيمة فورية في تعليمة SUB فعلى سبيل المثال تعتبر التعليمة التالية غير صحيحة:
SUB 200, AL
لأنه من غير الممكن لمعامل مستقبل النتيجة في هذه التعليمة أن يكون قيمة فورية.
لذلك يمكن عمل ذلك باستخدام التعليمتين:
NEG AL
ADD AL, 200
مثال
المسجل BL بالنظام السادس عشري بعد تنفيذ التعليمتين :
MOV AL, 45H
NEG AL
الحل:
يؤدي تنفيذ التعليمة الأولى إلى تخزين القيمة 45H أي 01000101 في المسجل AL. ويؤدي تنفيذ التعليمة الثانية إلى إيجاد المكمل لاثنين لمحتوى المسجل AL. لذلك يؤدي تنفيذ هذه التعليمة إلى الحصول على المكمل لاثنين للعدد 16(45) وهو 16(BB) والذي يمثل بالنمط الثنائي 10111011 وتخزينه في المسجل AL. تؤثر هذه التعليمة على الرايات CF، SF،PF، ZF، OF إذ توضع الرايات CF وSF في الحالة "1" إذا كان المعامل موجباً ولا يساوي الصفر وإلا توضع الرايات CF وSF في الحالة "0" وبالنسبة للراية PF فتوضع في الحالة "1" إذا كان عدد الآحاد في النتيجة موجباً وإلا فتوضع في الحالة "0" والراية ZF توضع في الحالة "1" إذا كان المعامل يساوي "0" وإلا توضع الراية ZF في الحالة "0" أخيراً بالنسبة للراية OF فتوضع في الحالة "1" إذا كانت قيمة المعامل (80H إذا كان من النوع) Byte أو 8000H (إذا كان معرفاً في النوع Word) وإلا توضع هذه الراية في الحالة "0".
7) تعليمة المقارنة (CMP (Compare destination to source
الصيغة العامة لهذه التعليمة هي: CMP dest, source
حيث يمثل كل من source وdest أسماء مسجلات أو مواقع في الذاكرة طولها إما 8 ثنائيات أو 16 ثنائية. ومن غير الجائز مقارنة موقع ذاكرة مع موقع ذاكرة في نفس التعليمة. ويؤدي تنفيذ هذه التعليمة إلى طرح قيمة source في قيمة dest دون التأثير على المعامل dest وذلك خلافاً لتعليمة SUB التي يؤدي تنفيذها إلى تخزين نتيجة الطرح في المعامل dest.
قد تسأل عزيزي الدارس ما الفائدة إذاً من هذه التعليمة؟
والجواب على ذلك هو أنها تؤثر على قيم الرايات CF، AF، OF، PF، SF وZF حيث تستخدم هذه الرايات عند تنفيذ إحدى تعليمات نقل التحكم والتي سنتطرق إليها في ثنايا هذه الوحدة. لذلك نجد أن معظم تعليمات نقل التحكم المشروط تأتي بعد تنفيذ التعليمة CMP بسبب أن تعليمات نقل التحكم تعمل على حالة الرايات، وأن تنفيذ التعليمة CMP يؤثر على حالة هذه الرايات فقط. والجدول التالي اضغط هنا يبين تأثير تعليمة CMP على الرايات.
ملاحظة: D تمثل قيمة غير مهمة (Don’t Care)
1/ 0 تعني أن قيمة الراية يمكن أن تكون في الحالة "0" أو "1" حسب قيم المعاملات