سؤال

وأنا جديدة إلى لغة التجميع. ويبدو أن دول مجلس التعاون الخليجي لايوجد _bittestandset وظيفة في intrin.h مثل MSVC يفعل، لذلك نفذت واحدة جديدة. هذا واحد يعمل بشكل جيد في لينكس، لكنه يذهب على نحو خاطئ مع مينغو في آلة winVista، رمز:

inline unsigned char _bittestandset(unsigned long * a, unsigned long b)
{
    __asm__ ( "bts %1, %[b]"
          : "=g"(*a)
          : [b]"Ir"(b), "g"(*a) );
    return 0;
}
هل كانت مفيدة؟

المحلول

هل يمكن أن تعطي بعض مزيد من التوضيح ما لا يعمل؟ ربما مثال بسيط للاستخدام أو نحو ذلك. انه من الصعب تخمين ما هو الخطأ مع رمز ..

والشيء الوحيد الذي يبدو جبني حتى الآن: يمكنك تنفيذ شفرة تشغيل بت اختبار ولكن تجاهل النتيجة. بت من اختبار (ومجموعة) ينتهي في العلم حمل بعد شفرة التشغيل.

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

وعلى خلاف ذلك - إذا كنت لا تحتاج إلى نتيجة - انها أرخص بكثير لتحل محل التعليمات BTS مع ثلاثة أكواد العمليات المجمع أبسط:

شيء على طول هذه الخطوط:

  ; bit-index in cl
  ; Value in ebx
  ; eax used as a temporary (trashed)
  mov eax, 1
  shl eax, cl
  or  ebx, eax

وبما أنني لم يكن لديك مينغو مع الإصدار المحدد الخاص بك يعمل على تجميع إخراج testcase بسيط يمكن أن تعطينا بعض فكرة ما يحدث خطأ.

نصائح أخرى

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

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