سؤال

أنا نشرت هذا Q إلى منتدى Ti's 28xx DSP لكن لم تسمع استجابة وأحسب ربما قد يعرف شخص ما هنا.


أعرف كيفية كتابة الوظائف في التجميع بحيث تكون C-Callable؛ إذا كان الاسم C-Callable هو foo() ثم يتم تسمية وظيفة التجميع _foo().

ماذا لو كنت أريد استخدام C ++ وتحسين طريقة الفصل في التجميع؟ كيف يمكنني فعل ذلك؟ أفترض أن القضايا الرئيسية الوحيدة هي:

  • تسمية
  • الوصول إلى مؤشر "هذا"
  • الوصول إلى أعضاء الفصل من قبل معرفة بطريقة أو بأخرى

وإذا كنت لا أريد أن تقلق بشأن آخرين، فربما سأكتب وظيفة عضوا ثابتا وقم بذلك:

class MyClass
{
  int x;
  static int _doSomething(int u); // implement this in assembly
public:
  inline void doSomething() { x = _doSomething(x); } 
  // lightweight C++ wrapper to handle the class member / "this" pointer stuff
};
هل كانت مفيدة؟

المحلول

ال this يتم تمرير المؤشر كوسيطة إضافية لهذه الوظيفة، باستخدام اتفاقية الاتصال القياسية على منصتك. على جميع المنصات التي أنا على دراية بها، يتم تمرير الوسيطة الأولى، لكنني لا أفعل الكثير من الترميز C ++، لذلك لست متأكدا مما إذا كان هذا مضمونا من قبل المعيار. يمكنك دائما تفكيك بعض التعليمات البرمجية C ++ على منصيتك للتأكيد.

تسمية رمز C ++ أكثر إيلاما إلى حد ما مما كانت عليه في C، وتختلف من برنامج التحويل البرمجي إلى التحويل البرمجي. أفترض أنه يمكنك معرفة اسم الرمز المناسب للاستخدام من خلال تفكيك تعريف وظيفة مترجمة، فقط تأكد من أن: الوظيفة عضوا في الفصل الأيمن، ولديه الرقم الصحيح ونوع الوسائط.

ما لم تكن بحاجة حقا إلى إعادة إنتاج وظيفة C ++ في الموقع، فربما ستجعل فقط وظيفة C القياسية والقيام بالمعتاد extern "C" { ... } حول إعلانها.

نصائح أخرى

هل لديك برنامج التحويل البرمجي الخاص بك لديه بناء جملة التجميع المضمنة؟ إذا كان لديك ذلك، فقد يكون الأمر أسهل خيارا، ويمكنك ترك برنامج التحويل البرمجي يتعامل مع تسمية الوظائف وقطع بناء الجملة.

بالتناوب، اقتراح ستيفن لكتابة طريقة C ++ كغلاف مانح حول مكالمة وظيفة C "البسيطة" هي فكرة جيدة. (ربما تريد أن تجعلها مجرد وظيفة عادية، وليس وظيفة عضوا ثابتة كما في مشاركتك، للحصول على واجهة C بسيطة لذلك.)

أود أن أجد العلم الذي تعتمد على المترجم واكتب التجميع داخل وظيفة C ++. عادة ما توجد طرق للإشارة إلى المتغيرات المحلية من داخل قسم التجميع.

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