سؤال

أحيانا أكتب وظائف التجميع قصيرة جدا مثل

function SeniorBit(Value: LongWord): Integer;
asm
        OR    EAX,EAX
        JZ    @@Done
        BSR   EAX,EAX
        INC   EAX
@@Done:
end;

يبدو أن أفضل المرشحين للتسخين:

function SeniorBit(Value: LongWord): Integer; inline;

لكن مترجم دلفي لا يسمح بذلك. لماذا ا؟


محدث:

بفضل ldsandon، هناك مقيد عمره 5.5 سنة تقرير عن مراقبة الجودة. وبعد يتتغل التقرير بعض المقترحات (مثل تمديد توجيه ASM) بتبسيط ASM Intining للمترجم. أفضل أن أقدم التوجيه "العاري" على مستوى الإجراء / الوظيفة التي تقول إلى المحول البرمجي أنه لا يتعين عليه إنشاء إطار مكدس للإجراءات ويجب الحفاظ عليها اختياريا ما يجب الحفاظ على السجلات (بين EAX، EDX و EDX و ECX).

إذا كانت المهمة العامة ذات الإجراءات الشريرة الفعالة مع رمز Basm صعبة (وقد تكون UNNENNESSENED) هي فكرة جيدة هي تمكين الشفاء من أهم الحالات (مثل الوظيفة المجردة باستخدام استخدام التسجيل المعلن بشكل صريح).

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

المحلول

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

نصائح أخرى

لا يمكنك ضم رمز التجميع المصمم باليد.

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

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