سؤال

نحن نعمل على لعبة نظام التشغيل باعتبارها مهمة للحصول على الدرجة.لدي بعض المشاكل مع كتابة نواة الذعر وظيفة.

يجب حفظ جميع سجلات المكالمات بعض printf مثل وظيفة, ثم طباعة حفظ السجلات و وقف المعالجة المركزية.الآن هو تعريف الماكرو:

#define panic(...) \
    do{ \
        asm volatile("SAVE_REGISTERS %1\n\t" : "m="(_panic_context)); \
        _panic_printk(&_panic_context, __VA_ARGS__); \
    while(0)

_panic_context هو عالمي متغير يحتوي على حفظ سجلات الموضوع و المزيد من الاشياء.المشكلة هي مع SAVE_REGISTERS.بل هو الكلي المحدد في مكان ما في المجمع رأس الملف ، ولكن لا أعرف كيفية إدراجه.بسيطة #تدرج في ملف الواضح لا يعمل.لقد حاولت البحث في قوقل و كتابة مضحك يائسة الاشياء (مثل #تدرج في المجمع السلاسل :-) ) لكن دون فائدة.هل لديك أي فكرة عن كيفية حل هذا ؟

نحن نستخدم دول مجلس التعاون الخليجي وتجميع على MIPS (تشغيل في جهاز محاكاة :-) )

تحرير:SAVE_REGISTERS تعريف .macro SAVE_REGISTERS....لا يمكن أن يكون في C ماكرو, لأنه في الجمعية وحدات.أنا لا يمكن أن تجعل .S الملف مع ذلك ، لأن الذعر يجب أن يكون variadic.أو على الأقل لم أستطع الخروج مع أي طريقة أخرى للقيام بذلك.

هل كانت مفيدة؟

المحلول

وأعتقد أنك سوء فهم كيفية عمل وحدات الماكرو. الحصول على توسيع أنها قبل أن يحدث أي تجميع الآخرين. لا يمكنك استخدام asm لتنبعث بعض التعليمات البرمجية التي تحتوي على ماكرو للن يتم توسيع هذا الماكرو.

وبدلا من ذلك يمكنك محاولة تحديد SAVE_REGISTERS كما ماكرو C الذي يستخدم عبارة asm لبناء رمز التجميع الخاص بك:

#define SAVE_REGISTERS(x) \
   asm volatile ("movx ax, %1", ...);

وبعد ذلك يمكنك القيام به

#define panic(...) \
do { \
    SAVE_REGISTERS(_panic_context); \
    _panic_printk(&_panic_context, __VA_ARGS__); \
} while(0);

نصائح أخرى

ليس لدي MIPS النظام حول الكذب ، ولكن على x86 loonix مربع حاولت #include واكتشفت أن # هو التعليق حرف ، لذلك حاولت .include و التي عملت في أقرب وقت كما كنت نقلت اسم الملف: .include "something.i".

الآن, إذا كان لديك رأس الملفات و منظم البنية التحتية للمجمع رمز يجب أن نتساءل لماذا تريد أن تفعل هذا مع مضمنة asm في المقام الأول, على الرغم من.لماذا لا تكون حقيقية .s أو .S ملف يشمل المجمع رأس الملف ، وجعلها من الدرجة الأولى وحدة في النظام الخاص بك ؟

رأيت روائع الصغيرة القيام به مع asm حتى في المشاريع التي سبق locore.S في Makefile, اذهب الرقم...

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