هل أفهم المكدس بشكل صحيح في هذا Y86 الجمعية الرمز ؟

StackOverflow https://stackoverflow.com/questions/1023208

  •  06-07-2019
  •  | 
  •  

سؤال

لقد خلق هذا بسيط لا طائل من الجمعية (Y86) رمز أن أرى ما إذا كنت أفهم كل ما يحدث في المكدس عندما التعليمات الدعوة ، pushl, popl و ret تستخدم.

كما قلت, هذا الرمز لا معنى لها ، انها مجرد اختبار/أغراض التعلم.على الرغم من أن جميع عناوين الذاكرة تم بشكل صحيح (الأمل) محسوبة وليست عشوائية.

الجمعية البرمجية التالية:

     | .pos 0
0x00 |   irmovl Stack, %esp
0x06 |   rrmovl %esp, %ebp
0x08 |   irmovl $5, %eax
0x0E |   call func
0x13 |   halt
0x14 | func:
0x14 |   pushl %ebp
0x16 |   rrmovl %esp, %ebp
0x18 |   pushl %eax
0x1A |   popl %eax
0x1C |   popl %ebp
0x1E |   ret
     | .pos 50
0x32 | Stack: .long 0

وفيما يلي أفضل رسم كومة وشرح ما كل خطوة (تعليمات) لا مع المكدس.يرجى ملاحظة أن كنت SP و بي أن أشير إلى %esp و %ebp على التوالي لأنها تستخدم الكثير و يجعلها أسهل في القراءة.

ما أريد معرفته هو إذا حصلت على كل شيء أعلاه صحيح أو إذا فاتني شيء.من فضلك لا تتردد في نسخ/لصق ما تريد و إصلاح بعض خطوة(s) في الجواب.

نلاحظ أيضا أن فهمي هذا مهم جدا لدي امتحان يوم الاثنين والتي لا تحتاج إلى أن تكون مستعدة وأود أفضل إجابة يمكن أن تعطي لي.اعتمادا على إجابات ربما (أو لا) هل لديك بعض الأسئلة ذات الصلة التي يجب العناية في قسم التعليقات.

- INSTRUCTION: irmovl Stack, %esp
- INSTRUCTION: rrmovl %esp, %ebp
  1) Point %esp (SP) and %ebp (BP) to Stack

     |  ...  |
0x2E |-------|
     |       |
0x32 |-------| <--- SP & BP

- INSTRUCTION: irmovl $5, %eax
  1) Sets %eax = 5

- INSTRUCTION: call func
  1) Decrements SP by 4 (0x32 -> 0x2E)
  2) Saves return address (0x13) in memory location pointed by SP (0x2E)
  3) Jumps to "func" memory address (0x14)

     |  ...  |
0x2A |-------|
     | 0x13  |
0x2E |-------| <--- SP
     |       |
0x32 |-------| <--- BP

- INSTRUCTION: pushl %ebp
  1) Decrements SP by 4 (0x2E -> 0x2A)
  2) Saves BP value (0x32) in memory location pointed by SP (0x2A)

     |  ...  |
0x26 |-------|
     | 0x32  |
0x2A |-------| <--- SP
     | 0x13  |
0x2E |-------|
     |       |
0x32 |-------| <--- BP

- INSTRUCTION: rrmovl %esp, %ebp
  1) Sets BP = SP (0x32 -> 0x2A)

     |  ...  |
0x26 |-------|
     | 0x32  |
0x2A |-------| <--- SP & BP
     | 0x13  |
0x2E |-------|
     |       |
0x32 |-------|

- INSTRUCTION: pushl %eax
  1) Decrements SP by 4 (0x2A -> 0x26)
  2) Saves %eax value (5) in memory location pointed by SP (0x26)

     |  ...  |
0x22 |-------|
     |   5   |
0x26 |-------| <--- SP
     | 0x32  |
0x2A |-------| <--- BP
     | 0x13  |
0x2E |-------|
     |       |
0x32 |-------|

- INSTRUCTION: popl %eax
  1) Saves value (5) in memory location pointed by SP (0x26) in %eax
  2) Increments SP by 4 (0x26 -> 0x2A)

     |  ...  |
0x22 |-------|
     |   5   |
0x26 |-------|
     | 0x32  |
0x2A |-------| <--- SP & BP
     | 0x13  |
0x2E |-------|
     |       |
0x32 |-------|

- INSTRUCTION: popl %ebp
  1) Saves value (0x32) in memory location pointed by SP (0x2A) in %ebp
  2) Increments SP by 4 (0x2A -> 0x2E)

     |  ...  |
0x22 |-------|
     |   5   |
0x26 |-------|
     | 0x32  |
0x2A |-------|
     | 0x13  |
0x2E |-------| <--- SP
     |       |
0x32 |-------| <--- BP

- INSTRUCTION: ret
  1) Jumps to memory address (0x13) in memory location pointed by SP (0x2E)
  2) Increments SP by 4 (0x2E -> 0x32)
هل كانت مفيدة؟

المحلول

وبقدر ما استطيع ان اقول كنت قد حصلت عليه كل الحق.

ونقطة واحدة طفيفة يمكنني جعل هو أنه ربما أكثر سهولة لكتابة عناوين أعلى قيمة في هذه العناوين. وهذا هو:

0x2E |-------|
     | 0x13  |
0x32 |-------|

والسبب هو أن نطاق العناوين التي تغطي قيمة (0x2E، 0x2F، 0x30، 0x31) يذهب نحو 0x32 عنوان المقبل.

وبطبيعة الحال، قد ترغب في استخدام التدوين المتوقع من قبل المدرس عند القيام الامتحان.

نصائح أخرى

لك الحق.

ما تقومون به هو ممارسة وظيفة الاتصال باستخدام معيار المتصل المستدعى الاتفاقيات ، وخلق إطار المستدعى.ثم إجراء دفعة بسيطة و البوب من التسجيل قبل أن يعود إلى المتصل.هذا هو الصحيح تماما و فهمك هو الصحيح (انظر http://y86tutoring.wordpress.com/2012/10/31/functioning-stacks/ لمزيد من التفاصيل)

كل شيء يبدو جيدا.اقتراح الوحيد هو أنك لا تحتاج إلى تعريف 0x0000 كلمة على المكدس.ببساطة تحديد كومة التسمية قد فعلت ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top