سؤال

عند تضمين رمز التجميع في برنامج C / C ++، يمكنك تجنب سجلات التشطيب عن طريق حفظها بتعليمات الدفع (أو حدد قائمة Clobber من التحويل البرمجي يدعمه).

إذا كنت تشمل التجميع وترغب في تجنب النفقات العامة لدفع السجلات المتجمعة وتفرقعها، فهل هناك طريقة لترك دول مجلس التعاون الخليجي تختار السجلات لك (مثل تلك التي تعرف أنها لا تملك معلومات مفيدة فيها).

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

المحلول

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

asm("your assembly instructions"
      : output1("=a"),  // I want output1 in the eax register
        output2("=r"),  // output2 can be in any general-purpose register
        output3("=q"),  // output3 can be in eax, ebx, ecx, or edx
        output4("=A")   // output4 can be in eax or edx
      : /* inputs */
      : /* clobbered registers */
   );

نصائح أخرى

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

تتمثل ميزة في ذلك، ثم يمكنك تمرير متغير C عادي في جوهري، ودع المترجم يعتني بتحميله على السجل ويقوم بجدولة العمليات الأخرى حولها. علي سبيل المثال،

struct TwoVectors
{
   __m128 a; __m128b;
}

// adds two vectors A += B using the native SSE opcode
inline void SimdADD( TwoVectors *v ) 
{
   v->a = _mm_add_ps( v->a , v->b ); // compiles directly to ADDSS opcode
}

حسنا، لذلك لا يمكنني ترك تعليق أعلاه، لكنني متأكد من أن بناء الجملة الصحيح (مختلفا عن ذلك الموضح أعلاه) هو:

asm ( "your assembly instructions"
    : "=a"(output1),
      "=r"(output2),
      "=q"(output3),
      "=A"(output4)
    : /* inputs */
    : /* clobbered registers */
);

على الرغم من أنه يمكنك ترك تخصيص سجلات الإدخال والإخراج إلى المحول البرمجي، فلا توجد طريقة واضحة لمغادرة تخصيص سجلات خدش / درجة الحرارة (أي استخدام للقيم المتوسطة ولكن ليس إدخال أو إخراج) إلى المحول البرمجي. تاريخيا، أنا فقط أدرجتهم بشكل صريح في قائمة CLOBBER (على سبيل المثال "٪ xmm1"، "٪ RCX")، لكنني أعتقد الآن أنه قد يكون من الأفضل سردها كإخراج من أجل السماح للمترجم باختيارها. لا أعرف أي مصدر يعالج هذه المسألة بشكل نهائي.

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