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

1. تمهيد

المكدس : أو ما يشبه القارورة، حيث يعمل على مبدأ: أول قيمة أدخلت فيه هي آخر قيمة يتم إخراجها منه.

مثال عملي :

 نريد إدخال القيم التالية : 1 و 5 و 3 و 4 واحدا تلو الآخر وحسب هذا الترتيب، إذن لدينا أربع مراحل وهي :

الحالة الأولى: حالة الإدخال

المرحلة الأولى المرحلة الثانية المرحلة الثالثة المرحلة الرابعة
إدخال 1
 
 
 
1
إدخال 5
 
 
5
1
إدخال 3
 
3
5
1
إدخال 4
4
3
5
1

الحالة الثانية: حالة الإخراج

المرحلة الأولى المرحلة الثانية المرحلة الثالثة المرحلة الرابعة
إخراج 4
 
3
5
1
إخراج 3
 
 
5
1
إخراج 5
 
 
 
1
إخراج 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
mov bx,40   ;bx=40
push ax        ;ax إدخال
push bx        ;bx إدخال

pop ax         ;ax=bx=40
pop bx         ;bx=ax=30

2.2 الأداتين pusha  و popa

pusha : تقوم بإدخال جميع الخزانات التي سعتها 16 زوج (ax و bx و cx .....)

popa : تقوم بإخراج  جميع الخزانات التي سعتها 16 زوج (ax و bx و cx .....)

ملاحظة : تستعملان هاتين الأداتين في حفظ قيم الخزانات ثم إرجاعها لها.

مثال:

mov ax,30   ;ax=30
mov bx,40   ;bx=40
mov cx,10   ;cx=10
mov dx,60   ;dx=60
pusha          ;حفظ قيم الخزانات
add bx,ax    ;bx=bx+ax=70
inc cx          ;cx=cx+1=11
sub dx,cx    ;dx=dx-cx=39
                    ;نستنتج من هذه العمليات
                    ;أن بعض الخزانات تم تغيير
                    ;محتواها
popa            ;هنا يتم إرجاع جميع القيم
                    ;للخزانات كما كانت في
                    ;الحالة الأولى أو البدئية
 

2.3 الأداتين pusha  و popa

pushad : تقوم بإدخال جميع الخزانات التي سعتها 32 زوج (eax و ebx و ecx .....)

popad : تقوم بإخراج  جميع الخزانات التي سعتها 32 زوج (eax و ebx و ecx .....)

ملاحظة : تستعملان هاتين الأداتين في حفظ قيم الخزانات ثم إرجاعها لها.

 

2.4 الأداتين pushf  و popf

pushf : تقوم بإدخال جميع قيم الأعلام (flags)

popf : تقوم بإخراج  جميع  قيم الأعلام (flags)

ملاحظة : تستعملان هاتين الأداتين في حفظ قيم الأعلام ثم إرجاعها لها.

مثال:

pushf          ;حفظ قيم الأعلام
CLC           ;CF = 0
STD           ;DF = 1
CLI            ;IF = 0
                    ;نستنتج من هذه العمليات
                    ;أن بعض الأعلام
تم تغيير
                    ;محتواها
popf            ;هنا يتم إرجاع جميع القيم
                    ;للأعلام كما كانت في
                    ;الحالة الأولى أو البدئية 


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
  عنوان
الخانة
           001A
    0018
    0016
    0014
    0012
  عنوان
الخانة
SP=001A 16  001A
    0018
    0016
    0014
    0012
  عنوان
الخانة
  16 001A
SP=0018 120 0018
    0016
    0014
    0012
  عنوان
الخانة
  16 001A
  120 0018
SP=0016 150 0016
    0014
    0012
  عنوان
الخانة
  16 001A
  120 0018
  150 0016
SP=0014 78 0014
        0012

الآن المكدس في الحالة 5 :

مثال 1 : نريد تغيير قيمة الخانة ذات العنوان 0014  بالقيمة 105.

حسنا كيف يتم ذلك ؟

كما رأينا، أن مؤشر المكدس SP يراقب عملية الإدخال حيث كلما أدخلنا قيمة يتناقص SP بـ 2  (SP=SP-2) (لأن حجم كل خانة يساوي ثمنين).

أما عملية التغيير أو قراءة خانة من خانات المكدس فيراقبها أو يتحكم فيها مؤشر القاعدة BP. فكيف يتم ذلك؟

أولا SP يحمل عنوان آخر قيمة تم إدخالها، وبالتالي يمكننا أن نعطي لـ BP العنوان الذي يحمله SP.

ونكتب إذن :  MOV  BP,SP

ملاحظة : لا تنس كذلك كما تطرقنا في فقرة العنونة أنه لتغيير محتوى متغير يحمل عنوان يجب أن نضعه بين معقوفتين [ ].

وبالتالي نكتب:

push ax
push bx
push cx
push dx


MOV
 BP,SP
MOV
word [BP],105

 

 ملاحظة : لماذا لم نكتب مباشرة 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
push bx
push cx
push dx


MOV
 BP,SP
MOV
word [BP],105
MOV
word [BP
+4],325

أصبح المكدس بالشكل التالي:

  16 001A
  325 0018
  150 0016
SP=0014 105 0014
        0012

 


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


التمرين 10.1

قم بإبدال قيمتي خزانين

  1. بدون استعمال أدوات المكدس

  2.  باستعمال  أدوات المكدس


التمرين 10.2

قم بإبدال قيم أربع خزانات على هذا المنوال :

ax = 20 بعد عملية الإبدال ax = 89
bx = 10 bx = 56
cx =56 cx =10
dx = 89 dx = 20
  1. بدون استعمال أدوات المكدس

  2.  باستعمال  أدوات المكدس


التمرين 10.3

قم بإدخال 4 أعداد إلى المكدس ، قم بحساب حاصل مجموعها ، حيث تكون النتيجة في أول خانة للمكدس.

بعد ذلك قم بوضع محتوى الخانة الأولى في الخزان CX.


التمرين 10.4

قم بإدخال 7 أعداد إلى المكدس ، قم بحساب مجموعها، حيث تكون النتيجة في الخانة الوسطى للمكدس.

بعد ذلك قم بوضع محتوى الخانة الوسطى في الخزان BX.


 

أضف تعليقا


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

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