ARM Function Calls and Stacks - CS 301 U of R

Test Testington
22 Mar 202112:01

Summary

TLDRفي هذا المعمل، يتم استكشاف كيفية تنفيذ استدعاءات الدوال في لغة التجميع ARM، حيث يتم استخدام تعليمات الفرع والارتباط (BL) لحفظ عنوان العودة في السجل R14. يتم التعامل مع دوال معلمات متعددة من خلال سجلات R0 إلى R3، بينما يتم تخزين المتغيرات في السجلات الأخرى مثل R4 إلى R11. يتم شرح استخدام الذاكرة المكدسة (Stack) لحفظ قيم السجلات المؤقتة. يتناول المعمل تطبيقات عملية مثل حساب العوامل باستخدام الاستدعاءات المتكررة (التكرار) وفحص الحروف المتحركة في نص باستخدام دوال فرعية. الهدف هو تعزيز الفهم لكيفية إدارة البيانات وتنسيق الوظائف داخل بيئة التجميع ARM.

Takeaways

  • 😀 الموضوع الرئيسي لهذا المختبر هو استدعاء الدوال في لغة التجميع ARM.
  • 😀 في معمارية ARM، يتم حفظ عنوان العودة في السجل R14 باستخدام تعليمات 'BL' (Branch and Link).
  • 😀 عند استدعاء دالة باستخدام 'BL subroutine_name'، يتم حفظ العنوان في السجل R14 ويتم الرجوع إلى السطر التالي عند الانتهاء باستخدام 'MOV PC, LR'.
  • 😀 يتم استخدام سجلات R0 إلى R3 لتمرير المعاملات (حتى 4 معاملات) إلى الدوال في ARM.
  • 😀 السجلات R4 إلى R11 مخصصة لتخزين القيم المتغيرة، ويمكن أن تُستخدم في مكالمات دوال متعددة بنفس المعاملات والنتائج.
  • 😀 تستخدم معمارية ARM مكدساً (stack) لحفظ معلومات الدوال، حيث يتم دفع القيم أو إزالتها من المكدس باستخدام تعليمات 'PUSH' و 'POP'.
  • 😀 مكدس ARM مرن ويمكن تنفيذه بطرق مختلفة اعتمادًا على احتياجات البرمجيات، ويمكن أن ينمو المكدس في اتجاهين: صاعد (ascending) أو هابط (descending).
  • 😀 يتم تنفيذ المكدس في ARM باستخدام مسجل يُسمى 'Stack Pointer' (SP) الذي يشير إلى أعلى المكدس.
  • 😀 يمكن تنفيذ استدعاء دالة باستخدام المكدس عن طريق دفع عنوان العودة إلى المكدس ثم القفز إلى عنوان الدالة باستخدام التعليمات 'BL'.
  • 😀 في المثال المعروض، يتم حفظ قيمة السجل R5 في المكدس داخل الدالة ثم يتم استعادتها عند الانتهاء منها، مما يوضح كيفية الحفاظ على القيم عبر استدعاءات متعددة.
  • 😀 في الواجبات، يتعين على الطلاب تحسين الكود السابق باستخدام دوال مخصصة للتحقق من الحروف المتحركة (vowels) وحساب التكرار في السلسلة النصية، وكذلك كتابة دالة لحساب القيم العاملة (Factorial) باستخدام استدعاء ذاتي (Recursion).

Q & A

  • ما هي وظيفة تعليمات Branch and Link (BL) في بيئة ARM؟

    -تعليمات Branch and Link (BL) في بيئة ARM تحفظ عنوان العودة في السجل r14 (سجل الارتباط) وتقوم بالقفز إلى العنوان المستهدف. بعد الانتهاء من تنفيذ الوظيفة الفرعية، يتم استخدام تعليمات العودة (مثل move pclr) للرجوع إلى العنوان الذي يلي استدعاء الوظيفة.

  • كيف يتم استخدام السجلات r0 إلى r3 في بيئة ARM؟

    -السجلات r0 إلى r3 تُستخدم لتمرير ما يصل إلى أربعة معلمات إلى الوظائف المعرّفة من قبل المستخدم في بيئة ARM.

  • ما هو الفرق بين stack تصاعدي و stack تنازلي في ARM؟

    -الـ stack التصاعدي يزداد مؤشره نحو العناوين الأعلى عندما تُضاف البيانات، بينما في الـ stack التنازلي يزداد المؤشر نحو العناوين الأدنى عند إضافة البيانات.

  • ما هو الـ stack pointer في ARM؟

    -الـ stack pointer في ARM هو السجل الذي يشير إلى أعلى نقطة في الـ stack في الذاكرة. يتم استخدامه لإضافة أو إزالة البيانات من الـ stack وفقًا لنوع الـ stack (تصاعدي أو تنازلي).

  • كيف يتم تنفيذ استدعاء دالة باستخدام الـ stack؟

    -يتم تنفيذ استدعاء الدالة عن طريق دفع عنوان العودة إلى الـ stack، ثم القفز إلى عنوان الوظيفة الفرعية. بعد الانتهاء من الوظيفة، يتم إخراج (pop) البيانات من الـ stack لاستعادة عنوان العودة وتنفيذ التعليمات التي تلي استدعاء الوظيفة.

  • ما هي الوظائف المستخدمة للتعامل مع الـ stack في ARM؟

    -تستخدم تعليمات مثل LDR و STR لتحميل وتخزين البيانات في الـ stack، حيث يُمكن استخدام هذه التعليمات لتنفيذ عمليات push و pop حسب نوع الـ stack.

  • ما هي أنواع الـ stacks التي يمكن أن توجد في ARM؟

    -هناك أربعة أنواع من الـ stacks: stack تصاعدي فارغ، stack تصاعدي مملوء، stack تنازلي فارغ، و stack تنازلي مملوء.

  • كيف يعمل الاستدعاء الذاتي (Recursion) في دالة حساب العامل؟

    -في دالة حساب العامل، يتم استدعاء الوظيفة نفسها مع معلمات مختلفة حتى يتم الوصول إلى الحالة الأساسية حيث يتم إرجاع النتيجة دون استدعاء إضافي. هذه الحالة الأساسية هي العامل 0 الذي يُساوي 1.

  • ما هو الهدف من استخدام الـ stack في دالة مثل function1؟

    -الـ stack يُستخدم في دالة مثل function1 لحفظ القيم الأصلية للسجلات قبل تعديلها، وبالتالي يمكن استعادتها بعد الانتهاء من الوظيفة، مما يسمح بالحفاظ على القيم الأصلية للسجلات عند الحاجة.

  • ما هو المطلوب منك في مهمة الأسبوع؟

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

Outlines

plate

هذا القسم متوفر فقط للمشتركين. يرجى الترقية للوصول إلى هذه الميزة.

قم بالترقية الآن

Mindmap

plate

هذا القسم متوفر فقط للمشتركين. يرجى الترقية للوصول إلى هذه الميزة.

قم بالترقية الآن

Keywords

plate

هذا القسم متوفر فقط للمشتركين. يرجى الترقية للوصول إلى هذه الميزة.

قم بالترقية الآن

Highlights

plate

هذا القسم متوفر فقط للمشتركين. يرجى الترقية للوصول إلى هذه الميزة.

قم بالترقية الآن

Transcripts

plate

هذا القسم متوفر فقط للمشتركين. يرجى الترقية للوصول إلى هذه الميزة.

قم بالترقية الآن
Rate This

5.0 / 5 (0 votes)

الوسوم ذات الصلة
ARM Assemblyاستدعاء دواللغة التجميعالمكدسالبرمجة المدمجةدوال المستخدمالتعليم الهندسيتعلم البرمجةمعالج ARMدوال عودية