fluoroscopy - c-arm جهاز



ARM: سجل الارتباط ومؤشر الإطار (1)

أحاول فهم كيفية عمل سجل الارتباط ومؤشر الإطار في ARM. لقد كنت في موقعين ، وأردت تأكيد فهمي.

لنفترض أن لدي الشفرة التالية:

int foo(void)
{
    // ..
    bar();
    // (A)
    // ..
}

int bar(void)
{
    // (B)
    int b1;
    // ..
    // (C)
    baz();
    // (D)
}

int baz(void)
{
    // (E)
    int a;
    int b;
    // (F)
}

وأنا أدعو فو (). هل يحتوي سجل الارتباط على عنوان الرمز عند النقطة (A) ويحتوي مؤشر الإطار على العنوان بالرمز عند النقطة (B)؟ ويمكن أن يكون مؤشر المكدس في أي مكان داخل bar () ، بعد أن تم الإعلان عن جميع السكان المحليين؟

[تحرير] إضافة وظيفة أخرى استدعاء baz ()


بعض اصطلاحات استدعاء السجل تعتمد على ABI (Application Binary Interface). مطلوب FP في معيار APCS وليس في AAPCS الأحدث (2003). بالنسبة لـ AAPCS (دول مجلس التعاون الخليجي 5.0+) ، لا يجب استخدام FP لكن يمكن بالتأكيد أن يكون ؛ يتم تصحيح معلومات التصحيح مع استخدام مؤشر الرصة والإطار لتتبع الكومة ورمز الفك مع AAPCS . إذا كانت إحدى الوظائف static ، فلن يحتاج المترجم بالفعل إلى الالتزام بأي اتفاقيات.

عموما جميع سجلات ARM هي غرض عام . إن lr (سجل الارتباط ، أيضا R14) والكمبيوتر (عداد البرنامج أيضا R15) هي خاصة وتكرس في مجموعة التعليمات. أنت على صواب أن يشير lr إلى A. وترتبط pc و lr . واحد هو "أين أنت" والآخر هو "أين كنت". هم الجانب رمز وظيفة.

عادة ، لدينا sp (مؤشر مكدس ، R13) و fp ( مؤشر الإطار ، R11). هذان يرتبطان أيضا. يقوم تخطيط Microsoft هذا بعمل جيد يصف الأشياء. يتم استخدام المكدس لتخزين البيانات المؤقتة أو السكان المحليين في وظيفتك . يتم تخزين أي متغيرات في foo() bar() هنا ، على المكدس أو في السجلات المتوفرة. fp بتتبع المتغيرات من وظيفة لأداء وظيفة. هو إطار إطار أو صورة في بنية تخزين العناصر لهذه الوظيفة. يحدد ABI تخطيطًا لهذا الإطار . عادة يتم حفظ lr والسجلات الأخرى هنا خلف الكواليس بواسطة المترجم بالإضافة إلى القيمة السابقة لـ fp . هذا يجعل قائمة مرتبطة من إطارات المكدس وإذا كنت تريد يمكنك تتبع كل طريقة العودة إلى main() . الجذر هو fp ، والذي يشير إلى إطار كدسة واحد (مثل struct ) مع متغير واحد في struct يكون fp السابق. يمكنك الذهاب على طول القائمة حتى الصيغة النهائية التي عادة ما تكون NULL .

لذا فإن sp هو المكان الذي توجد فيه المكدس و fp حيث كانت المكدس ، تشبه إلى حد كبير pc و lr . يتم تخزين كل lr القديم (تسجيل الارتباط) في fp (مؤشر الإطار) القديم. تعتبر sp و fp جانبًا من البيانات للوظائف.

النقطة B هي pc النشط و sp . النقطة A هي في الواقع fp و lr ؛ إلا إذا كنت تستدعي وظيفة أخرى وبعد ذلك قد يستعد المحول البرمجي لإعداد fp للإشارة إلى البيانات في B.

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

; Prologue - setup
mov     ip, sp                 ; get a copy of sp.
stmdb   sp!, {fp, ip, lr, pc}  ; Save the frame on the stack. See Addendum
sub     fp, ip, #4             ; Set the new frame pointer.
    ...
; Maybe other functions called here.
; Older caller return lr stored in stack frame. bl baz ... ; Epilogue - return ldm sp, {fp, sp, lr} ; restore stack, frame pointer and old link. ... ; maybe more stuff here. bx lr ; return.
هذا هو ما سيبدو foo() . إذا لم تقم باستدعاء bar() ، يقوم المحول البرمجي بإجراء تحسين للأوراق وليس بحاجة إلى حفظ الإطار ؛ مطلوب فقط bx lr . على الأرجح هذا ربما السبب في الخلط بينك وبين الأمثلة على شبكة الإنترنت. انها ليست دائما هي نفسها.

يجب أن يكون الإلقاء ،

  1. وترتبط pc و lr رمز السجل. واحد هو "أين أنت" ، والآخر هو "أين كنت".
  2. sp و fp هي سجلات البيانات المحلية ذات الصلة.
    أحدهما "أين توجد بيانات محلية" ، والآخر هو "أين توجد البيانات المحلية الأخيرة".
  3. العمل معا جنبا إلى جنب مع تمرير المعلمة لإنشاء آلية وظيفة .
  4. من الصعب وصف حالة عامة لأننا نريد أن يكون المجمّعون سريعًا قدر الإمكان ، لذلك يستخدمون كل خدعة ممكنة.

هذه المفاهيم عامة لجميع وحدات المعالجة المركزية واللغات المجمعة ، على الرغم من أن التفاصيل يمكن أن تختلف. يعتبر استخدام تسجيل الارتباط ومؤشر الإطار جزءًا من مقدمة الدالة وخاتمة ، وإذا كنت تفهم كل شيء ، فأنت تعرف كيف يعمل تجاوز سعة مكدس الذاكرة الاحتياطية على ARM.

انظر أيضا: ARM استدعاء الاتفاقية .
MSDN ARM stack article
جامعة كامبريدج APCS نظرة عامة
المدرج ARM تتبع بلوق
رابط أبل ABI

تخطيط الإطار الأساسي هو ،

  • fp [-0] pc محفوظ ، حيث قمنا بتخزين هذا الإطار.
  • fp [-1] lr المحفوظة ، عنوان المرسل لهذه الوظيفة.
  • fp [-2] السابقة sp ، قبل أن تأكل هذه الوظيفة كدسة.
  • fp [-3] السابقة fp ، آخر إطار كدسة .
  • العديد من السجلات الاختيارية ...

قد يستخدم ABI قيمًا أخرى ، ولكن ما سبق يعتبر نموذجيًا لمعظم الإعدادات.

إضافة: هذا ليس خطأ في المجمع ؛ هذا طبيعي. يوجد تفسير في سؤال مدرج ARM ولدت .





arm