أنت هنا:برمجها»المجمع NASM»الدرس 7: الأدوات الشرطية
الدرس 7: الأدوات الشرطية الدرس 7: الأدوات الشرطية
قيم الموضوع
(1 تصويت)
 
 سنرى في هذا الدرس كيف يمكن إستعمال الأدوات الشرطية وهي إذا كانت....فإن....وإلا....
1. تمهيد

إن كنت ممن درس اللغة C فإنك تعرف الأدوات  if...else و switch .

إن كنت ممن درس اللغة Pascal  فإنك تعرف الأدوات if...then....else  و case...of .

إن كنت ممن درس اللغة Basic فإنك تعرف الأدوات if...then...else  و select case .

إن كنت ممن لم يدرس شيئا من هذا كله فربما تعرف المنطق أو الخوارزم يعني : إذا كانت....فإن....وإلا

بالنسبة لجميع المجمعات ومنها NASM توجد أكثر من أداة شرط واحدة ، وكل أداة تخص معالجة محددة، فمثلا:

- توجد عدة أدوات لمقارنة عددين سالبين.

- توجد عدة أدوات لمقارنة عددين موجبين.

- توجد عدة أدوات لمقارنة عددين أحدهما سالب ولآخر موجب.

-وهكذا ....

لكن قبل التطرق لكل أداة وكيفية استخدامها، يجب أولا معرفة خزان الأعلام أو الإشارات (Flags).


2.  خزان الأعلام أو الإشارات (Flags)

 

2.1. تعريف

 خزان الإشارات : يحتوي على 32 زوج ، أهمها 16 زوجا الأولى (أي من الزوج 0 ...... الزوج 15)، وكل زوج يحمل اسما معينا ويتم التحكم فيه عن طريق عدة أوامر. ويعمل هذا الخزان بمراقبة جميع العمليات الحسابية والمنطقية التي يقوم بها عقل الحاسوب.

<--  8 أزواج  -->

<--  8 أزواج  -->

<--  8 أزواج  -->

<--  8 أزواج  -->

0 .........................7

8 ..........................15

16 ...........................23

24 ........................31

0 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
CF 1 PF 0 AF 0 ZF SF TF IF DF OF IOPL NT 0 RF VM AC 0 0 0 0 0 0 0 0 0 0 0 0 0
FLAGS  
EFLAGS

ملاحظة : كل زوج من هذه الأزواج يقبل قيمتين فقط وهما 0 أو 1 ، إلا الجزء IOPL  فهو يقبل أربع قيم وهي :00 أو 01 أو 10 أو 11 (بالنظام التنائي).ويطلق عليها عموما الاسم : علم

 

2.2. تعريف لبعض أعلام  خزان الإشارات


العلم CF (ويسمى علم المحتفظ به (Carry))

تغييره يدويا:

الأمر CLC يمكن من وضع القيمة 0  في CF أي تصبح CF=0.

الأمر STC يمكن من وضع القيمة 1  في CF أي تصبح CF=1.

تغييره عمليا:

لنفترض أن الخزان AL (ذي 8 أزواج) يحتوي على القيمة : 10100001 أي 161 بالنظام العشري.

1 0 0 0 0 1 0 1

نريده أن يصبح كالتالي :

0 1 0 0 0 0 1 0

نلاحظ بأنه لدينا إزاحة إلى اليسار برتبة واحدة أدت إلى خروج القيمة 1 من اليسار مع دخول القيمة 0  من اليمين.

إذن السؤال الذي يطرح نفسه : أين ذهبت القيمة 1 ؟

الجواب : لقد وضعت في CF ، وبالتالي أصبح CF = 1.

هذه العملية يقوم بها الأمر SAL ،

مثال في المجمع :

 نضع في CF القيمة 0 ;               clc

 يعني إزاحة باتجاه اليسار برتبة واحدة ;      sal  al , 1

  يعني إزاحة باتجاه اليسار برتبتين ;     sal  al , 2

خلاصة القول أن مثل هذه العمليات وغيرها تؤدي إلى تغيير العلم CF .

ملاحظة : الأمر SAR عكس  الأمر SAL وسنتطرق إليها إن شاء الله في  فقرة أخرى.
 

 العلم DF (ويسمى علم الاتجاه (Direction))

الأمر CLD يمكن من وضع القيمة 0  في DF أي تصبح DF=0.

الأمر STD يمكن من وضع القيمة 1  في DF أي تصبح DF=1.

 

العلم IF (ويسمى علم القواطع (interruption))

الأمر CLI يمكن من وضع القيمة 0  في IF أي تصبح IF=0.

الأمر STI يمكن من وضع القيمة 1  في IF أي تصبح IF=1.

 

العلم ZF (ويسمى علم الصفر (zero))

إذا كان ZF = 1 فإن نتيجة العملية منعدمة أو أن هناك تساو.

إذا كان ZF = 0 فإن نتيجة العملية غير منعدمة.

مثال على ذلك :

 0 = 3 - 3   تعطي نتيجة منعدمة أو هناك تساو  وبالتالي تصبح ZF = 1 .

 1 = 2 - 3   تعطي نتيجة غير منعدمة وبالتالي تصبح ZF = 0 .

 

العلم SF (ويسمى علم الإشارة (sign))

إذا كان SF = 1 فإن نتيجة العملية سالبة أو أن هناك عدد سالب .

إذا كان SF = 0 فإن نتيجة العملية موجبة أو أن هناك عدد موجب.

مثال على ذلك :

 1-= 4 - 3   تعطي نتيجة سالبة وبالتالي تصبح SF = 1 .

 1 = 2 - 3   تعطي نتيجة موجبة وبالتالي تصبح SF = 0 .

 

العلم OF (ويسمى علم التجاوز (overflow ))

إذا كان OF = 1 فإن هناك تجاوز.

إذا كان OF = 0 فإنه لم يحصل  تجاوز.

مثال على ذلك : نفترض أن BL ذي ثمان أزواج توجد فيه القيمة 11111111 أي 255 بالنظام العشري

نعتبر الأمر التالي:

             يعني bl = bl +1  تكافئ ;     inc  bl

إذن السؤال : ما هي قيمة bl الجديدة؟

من الزوج 0 ...............الزوج 7 الزوج 8    
1 1 1 1 1 1 1 1     bl
1 0 0 0 0 0 0 0   +  
0 0 0 0 0 0 0 0 1 = bl

بما أن bl تستوعب 8 أزواج فقط ، فإن النتيجة النهائية لـ bl هي القيمة 00000000  أي  0 بالنظام العشري

إذن السؤال الذي يطرح نفسه : أين ذهبت القيمة 1 التي تجاوزت سعة bl ؟

الجواب : لقد وضعت في OF ، وبالتالي أصبح OF = 1.

ملاحظة : إن لم يكن هناك تجاوز للسعة المسموح بها تكون OF = 0 .

العلم PF (ويسمى علم الزوجية (parite))

إذا كان PF = 1  فإن نتيجة العملية زوجية بعدد الأزواج التي تساوي 1.

إذا كان PF = 0  فإن نتيجة العملية فردية  بعدد الأزواج التي تساوي 1.

العلم AF (ويسمى علم المحتفظ به الثانوي (retenue auxiliaire))

شبيه بالعلم CF إلا أن عمله في نصف الثمن أي يراقب العمليات التي تجري على الأزواج في النصف الأول من الزوج 0......الزوج 3

عكس العلم CF الذي يراقب العمليات التي تجري على الخزانات ذات السعة 8 أزواج (ثمن) أو 16 زوج (ثمنين) أو 4 أثمان وهكذا...


العلم TF (ويسمى علم أ
خطاء التنفيذ (debug))

إذا كان TF = 1  فإن النتيجة هي أن هناك خطأ في التنفيذ.

إذا كان TF = 0  فإن النتيجة هي نجاح التنفيذ.


3. أدوات الشرط

 

3.1 أدوات الشرط لمقارنة عددين.

كلمة اقفزهي Jump باللغة الإنجليزية، حيث نلاحظ أن جميع هذه الأوامر تبدأ بالحرف j .

ملاحظة  تذكرها جيدا خصوصا عند التمارين: إن كان أحد العددين سالبا على الأقل تُعالَج العملية بـالأوامر السالبة.

لمعالجة الأعداد السالبة العملية    لمعالجة الأعداد الموجبة
 JG
 JNLE
 ( اقفز إن كان أكثر )
 (اقفز إن لم يكن أقل أو يساوي )
A > B
 JA
 JNBE
 ( اقفز إن كان أكبر )
 (اقفز إن لم يكن أصغر أو يساوي )
 JGE
 JNL
 (اقفز إن كان أكثر أو يساوي )
 (اقفز إن لم يكن أقل)
A >= B
 JAE
 JNB
 (اقفز إن كان أكبر أو يساوي )
 (اقفز إن لم يكن أصغر)
 JE
 JZ
 (اقفز إن كان  يساوي)
 (اقفز إن كانت النتيجة تساوي 0)
A = B
 JE
 JZ
 (اقفز إن كان  يساوي)
 (اقفز إن كانت النتيجة تساوي 0)
 JNE
 JNZ
 (اقفز إن لم يكن يساوي)
 (اقفز إن لم تكن النتيجة تساوي 0)
A <> B
 JNE
 JNZ
 (اقفز إن لم يكن يساوي)
 (اقفز إن لم تكن النتيجة تساوي 0)
 JNG
 JLE
 (اقفز إن لم يكن أكثر)
 (اقفز إن كان أقل أو يساوي)
A <= B
 JNA
 JBE
 (اقفز إن لم يكن أكبر)
 (اقفز إن كان أصغر أو يساوي)
 JNGE
 JL
 (اقفز إن لم يكن أكثر أو يساوي )
 (اقفز إن كان أقل)
A < B
 JNAE
 JB
 (اقفز إن لم يكن أكبر أو يساوي )
 (اقفز إن كان أصغر)

 

3.2 أدوات الشرط المرتبطة بخزان الأعلام (Flags).

 JC  CF=1  اقفز إن كان  )
CF = 1
 JNC  CF=0  اقفز إن كان  )
CF = 0
 JO  OF=1  اقفز إن كان  )
OF = 1
 JNO  OF=0  اقفز إن كان  )
OF = 0
 JS  SF=1  اقفز إن كان  )
SF = 1
 JNS  SF=0  اقفز إن كان  )
SF = 0
 JP
 JPE
 PF=1  اقفز إن كان  )
 (بالضبط  PF=1  اقفز إن كان  )
PF = 1
 JNP
 JPO
 PF=0  اقفز إن كان  )
 ( PF=0  اقفز إن كان )
PF = 0

3.3 أداة بدون شرط (jmp) والعلامات

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

هذه الأداة شبيهة بالأداة goto في C و Pascal.

العلامة: ترمز إلى مكان في المشروع ،وتستعمل غالبا للقفز إليها.

مثال :

mov ah,0eh
mov al,'A'
int    10h
jmp   fifi    ;fifi اذهب إلى
....
....
fifi :         ;عبارة عن علامة فقط  fifi
...
...


4. أمثلة

ملاحظة :

  • التعليقات باللغة العربية.

  • جميع أدوات الشرط (لمقارنة عددين أو المرتبطة بالأعلام ) تأتي  بعد الأمر CMP التي تعني قارن بين عددين

مثال :

CMP  AX,BX           ; قارن بين ax و bx

JA   ETIQUETTE    ; اذهب إلى etiquette إن كان ax أكبر من bx

4.1 المثال الأول : مقارنة عددين موجبين

نظرا لطوله المتوسط أنقر هنا.


4.2 المثال الثاني : نعم / لا

نظرا لطوله المتوسط أنقر هنا.


تمارين تطبيقية


التمرين 7.1

أنجز شفرة تقوم بمقارنة عددين سالبين.


التمرين 7.2

أنجز شفرة تقوم بمقارنة عددين أحدهما سالب والأخر موجب.


التمرين 7.3

أنجز شفرة تقوم بالتأكد من طبيعة عدد هل هو سالب أو موجب أو موجب وسالب في آن واحد (الصفر بطبيعة الحال).


التمرين 7.4

أنجز شفرة تقوم بإظهار محتويات الأعلام التي تم التطرق إليها في الدرس، قم بتغيير إحداها يدويا حتى تتأكد من النتائج المحصل عليها.

مثال :

Flags:
CF = 1
DF = 0
SF = 1
ZF = 0


التمرين 7.5

نعتبر الخزانات ax و bx وcx ، قم بإعطائها أعداد موجبة ثم حدد من بينها الخزان الذي يحمل أكبر قيمة.


التمرين 7.6

نعتبر الخزانات ax و bx وcx ، قم بإعطائها أعداد سالبة ثم حدد من بينها الخزان الذي يحمل أكبر قيمة.


التمرين 7.7

نعتبر الخزانات ax و bx وcx ، قم بإعطائها أعداد مختلفة ثم حدد من بينها الخزان الذي يحمل أكبر قيمة.


التمرين 7.8

نعتبر الخزانات al و bl وcl ، قم بإعطائها حروف معينة ثم قم بترتيبها وأظهر النتائج.

مثال :

 نفترض أن cl = 'b' و bl = 'a' و al = 'd'

يجب أن تصبح   cl = 'd' و bl = 'b' و al = 'a'

Etat initial :
al = 'd'
bl = 'a'
cl = 'b'

Etat final :
al = 'a'
bl = 'b'
cl = 'd'


التمرين 7.9

باعتمادك على نفس مبدأ التمرين السابق ودون إظهار النتائج على الشاشة قم بما يلي :

نعتبر الخزانات ax و bx وcx ، قم بإعطائها أعداد سالبة  ثم قم بترتيبها وأظهر النتائج.(لا تنس حالات التساوي)

مثال :

 نفترض أن cx = -30 و bx = -50 و ax = -10

يجب أن تصبح  cx = -10 و bx = -30 و ax = -50


التمرين 7.10

باعتمادك على نفس مبدأ التمرين السابق ودون إظهار النتائج على الشاشة قم بما يلي :

نعتبر الخزانات ax و bx وcx ، قم بإعطائها أعداد مختلفة  ثم قم بترتيبها وأظهر النتائج.(لا تنس حالات التساوي)

مثال :

 نفترض أن cx = 30 و bx = -50 و ax = 10

يجب أن تصبح  cx = 30 و bx = 10 و ax = -50


التمرين 7.11

نعتبر الخزانات ax و bx، قم بإعطائها أعداد مختلفة  ثم قم بعملية الجمع وأظهر إشارة النتيجة على الشاشة.

مثال :

 نفترض أن  bx = -50 و ax = 10

ولدينا :  ax = ax + bx = 10 + (-50) = -40

signe ==> ( - )


 

أضف تعليقا


إصنعها يريد أن يتأكد أنك لست روبوتا، لذلك أحسب ما يلي:

كود امني
تحديث