سيغوين دول مجلس التعاون الخليجي - خطأ تعدين الذهب حرفيا:

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

  •  06-07-2019
  •  | 
  •  

سؤال

ولدي مشروع مكتوب في C الذي أصلا كان يجري على لينكس، ولكن الآن يجب أن يتم على ويندوز. جزء من قانون يتضمن هذا الخط في عدة أماكن

asm("movl temp, %esp");

ولكن هذا يؤدي إلى "إشارة غير محددة إلى 'درجة الحرارة` "خطأ.

وهذا لا يوجد لديه مشكلة تجميع على لينكس باستخدام مترجم دول مجلس التعاون الخليجي 4.3.2 (اختبار على جهاز آخر)، والذي هو نسخة لدي على Cygwin. هل هناك طريقة أخرى لإنجاز ما يقوم به هذا الخط؟

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

المحلول

وتحتاج إلى تغيير إصدار سيغوين من

asm("movl temp, %esp");

إلى

asm("movl _temp, %esp");

نعم، انها نفس المجمع والمجمع ولكن تم إعدادها بشكل مختلف من أجل التوافق مع النظام المضيف.

ويمكنك عزل رمز التي تعتمد على نظام التقديم من قبل ببساطة نقول دول مجلس التعاون الخليجي اسم محدد لاستخدام:

int *temp asm("localname");
...
__asm__("movl localname,%esp");

وهذا يجنب ل#if من نوع ويزيل OS الاعتماد المضيفة ولكنها تضيف تبعية مترجم. يتحدث ملحقات مترجم، فإن بعض الناس يكتب (انظر info as) شيئا مثل:

#ifdef __GNUC__
    __asm__("movl %[newbase],%%esp"
                :
                : [newbase] "r,m" (temp)
                : "%esp");
#else
#error haven't written this yet
#endif

والفكرة هنا هي أن بناء الجملة هذا يسمح للمترجم لمساعدتك على الخروج، من خلال إيجاد temp، حتى لو كان الكذب في سجل أو يستغرق بضع تعليمات لتحميل، وأيضا لتجنب التعارض مع لكم، والحالة كان باستخدام السجل كنت مضروب. فإنه يحتاج هذا لأنه لم يتم تحليل ل__asm__() سهل بأي شكل من الأشكال من قبل المجمع.

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

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