1. تمهيد
المكدس : أو ما يشبه القارورة، حيث يعمل على مبدأ: أول قيمة أدخلت فيه هي آخر قيمة يتم إخراجها منه.
مثال عملي :
نريد إدخال القيم التالية : 1 و 5 و 3 و 4 واحدا تلو الآخر وحسب هذا الترتيب، إذن لدينا أربع مراحل وهي :
الحالة الأولى: حالة الإدخال
المرحلة الأولى | المرحلة الثانية | المرحلة الثالثة | المرحلة الرابعة | ||||||||||||||||
إدخال 1
|
إدخال 5
|
إدخال 3
|
إدخال 4
|
الحالة الثانية: حالة الإخراج
المرحلة الأولى | المرحلة الثانية | المرحلة الثالثة | المرحلة الرابعة | ||||||||||||||||
إخراج 4
|
إخراج 3
|
إخراج 5
|
إخراج 1
|
خلاصة : إذا أدخلنا القيم 1 5 3 4 سنخرج القيم 4 3 5 1
2. الأدوات التي تتحكم في المكدس
المكدس بالنسبة للمجمع هو منطقة في الذاكرة يقوم بتخزين القيم فيها ثم يخرجها في الترتيب المعاكس التي تم الإدخال بها.
وهناك أدوات للإدخال وهي : push و pusha و pushad و pushf
وهناك أدوات للإخراج وهي : pop و popa و popad و popf
2.1 الأداتين push و pop
push : تقوم بإدخال ربع (ثمنين أو 16 زوج)
pop : تقوم بإخراج ربع (ثمنين أو 16 زوج)
يعني أن هاتين الأداتين تقومان بإدخال وإخراج القيم كـ ax و bx و ...
مثال: تبديل قيمتي خزانين.
mov ax,30 ;ax=30 |
2.2 الأداتين pusha و popa
pusha : تقوم بإدخال جميع الخزانات التي سعتها 16 زوج (ax و bx و cx .....)
popa : تقوم بإخراج جميع الخزانات التي سعتها 16 زوج (ax و bx و cx .....)
ملاحظة : تستعملان هاتين الأداتين في حفظ قيم الخزانات ثم إرجاعها لها.
مثال:
mov ax,30 ;ax=30 |
2.3 الأداتين pusha و popa
pushad : تقوم بإدخال جميع الخزانات التي سعتها 32 زوج (eax و ebx و ecx .....)
popad : تقوم بإخراج جميع الخزانات التي سعتها 32 زوج (eax و ebx و ecx .....)
ملاحظة : تستعملان هاتين الأداتين في حفظ قيم الخزانات ثم إرجاعها لها.
2.4 الأداتين pushf و popf
pushf : تقوم بإدخال جميع قيم الأعلام (flags)
popf : تقوم بإخراج جميع قيم الأعلام (flags)
ملاحظة : تستعملان هاتين الأداتين في حفظ قيم الأعلام ثم إرجاعها لها.
مثال:
pushf ;حفظ قيم الأعلام |
3. التحكم في المكدس (تغيير وقراءة ...)
3.1 المكدس والخزانات المؤشرة : SP و BP
كما قلنا سابقا أن المكدس عبارة عن منطقة في الذاكرة يتم حجزها من طرف المستعمل أو من طرف المترجم كـ NASM.
ولكي تملئ المكدس فهو لا يقبل إلا أن تدخل إليه متغيرا أو خزان حجمه هو ربع أي ثمنين (مثلا AX و BX و ...).
أي أنك لو أدخلت قيمة معينة فهي توضع في خانة حجمها هو ربع أي ثمنين.
حسنا، لنعتبر أن الخزانات AX=16 و BX=120 و CX=150 و DX=78 ، ونريد أن نقوم بتخزينها في المكدس.
أولا وقبل كل شيء ، يكون المكدس في البداية فارغا .
كما أن الخزان SP المسمى بمؤشر المكدس له دور فعال في مراقبة تحركات المكدس ، وعندما يكون المكدس فارغا يكون SP يحمل عنوان آخر خانة في المكدس.
الحالة 1 | الحالة 2 | الحالة 3 | الحالة 4 | الحالة 5 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
المكدس فارغ | إدخال AX | إدخال BX | إدخال CX | إدخال DX | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
الآن المكدس في الحالة 5 :
مثال 1 : نريد تغيير قيمة الخانة ذات العنوان 0014 بالقيمة 105.
حسنا كيف يتم ذلك ؟
كما رأينا، أن مؤشر المكدس SP يراقب عملية الإدخال حيث كلما أدخلنا قيمة يتناقص SP بـ 2 (SP=SP-2) (لأن حجم كل خانة يساوي ثمنين).
أما عملية التغيير أو قراءة خانة من خانات المكدس فيراقبها أو يتحكم فيها مؤشر القاعدة BP. فكيف يتم ذلك؟
أولا SP يحمل عنوان آخر قيمة تم إدخالها، وبالتالي يمكننا أن نعطي لـ BP العنوان الذي يحمله SP.
ونكتب إذن : MOV BP,SP
ملاحظة : لا تنس كذلك كما تطرقنا في فقرة العنونة أنه لتغيير محتوى متغير يحمل عنوان يجب أن نضعه بين معقوفتين [ ].
وبالتالي نكتب:
|
ملاحظة : لماذا لم نكتب مباشرة MOV word [SP],105 ، يجب أن تتذكر أن SP ليس بقاعدة (انظر تمارين الفقرة 9)
ولماذا كلمة word التي تعني ربعا أي ثمنين بالذات: أولا لأنه يجب إعطاء حجم التحويل (انظرالفقرة 9) ولأن كل خانة من خانات المكدس حجمها يساوي ربعا. يمكن كتابة MOV word [BP],105 بالشكل التالي : mov dx,105 mov [BP],dx |
أصبح المكدس بالشكل التالي:
16 | 001A | |
120 | 0018 | |
150 | 0016 | |
SP=0014 | 105 | 0014 |
0012 |
مثال 2 : نريد تغيير قيمة الخانة ذات العنوان 0018 بالقيمة 325.
أولا SP يحمل عنوان آخر قيمة تم إدخالها، وبالتالي يمكننا أن نعطي لـ BP العنوان الذي يحمله SP.
ونكتب إذن : MOV BP,SP
إذن أصبح BP يحمل العنوان 0014، كما أن الخانة ذات العنوان 0018 تبعد عن الخانة ذات العنوان 0014 بخانتين أي ما يعادل 4 أثمان.
بكل اختصار لاحظ أن (4=0014-0018).
وبالتالي نكتب:
push ax |
أصبح المكدس بالشكل التالي:
16 | 001A | |
325 | 0018 | |
150 | 0016 | |
SP=0014 | 105 | 0014 |
0012 |
تمارين تطبيقية
التمرين 10.1
قم بإبدال قيمتي خزانين
-
بدون استعمال أدوات المكدس
-
باستعمال أدوات المكدس
التمرين 10.2
قم بإبدال قيم أربع خزانات على هذا المنوال :
ax = 20 | بعد عملية الإبدال | ax = 89 |
bx = 10 | bx = 56 | |
cx =56 | cx =10 | |
dx = 89 | dx = 20 |
-
بدون استعمال أدوات المكدس
-
باستعمال أدوات المكدس
التمرين 10.3
قم بإدخال 4 أعداد إلى المكدس ، قم بحساب حاصل مجموعها ، حيث تكون النتيجة في أول خانة للمكدس.
بعد ذلك قم بوضع محتوى الخانة الأولى في الخزان CX.
التمرين 10.4
قم بإدخال 7 أعداد إلى المكدس ، قم بحساب مجموعها، حيث تكون النتيجة في الخانة الوسطى للمكدس.
بعد ذلك قم بوضع محتوى الخانة الوسطى في الخزان BX.