لماذا تصدر دول مجلس التعاون الخليجي "lea" بدلاً من "sub" للطرح؟

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

سؤال

إنني ألقي نظرة على بعض عمليات التجميع التي تم إنشاؤها عن طريق تفكيك بعض برامج لغة C، وأنا في حيرة من أمري بسبب التحسين الوحيد الذي أراه يتكرر بشكل متكرر.

عندما لا يكون لدي أي تحسينات على برنامج التحويل البرمجي لدول مجلس التعاون الخليجي يستخدم ملف subl تعليمات الطرح، ولكن عندما أقوم بتشغيل التحسينات (-O3 على وجه الدقة) يستخدم المترجم a leal التعليمات بدلا من الطرح، المثال أدناه:

بدون تحسينات:

83 e8 01     subl $0x1, %eax 

مع التحسينات

8d 6f ff     leal -0x1(%edi), %ebp 

يبلغ طول كل من هذه التعليمات 3 بايت، لذلك لا أرى أي تحسين هنا.هل يمكن لأي شخص مساعدتي ومحاولة شرح اختيار المترجم؟

سيكون موضع تقدير أي مساعدة.

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

المحلول

من الصعب معرفة ذلك دون رؤية كود C الأصلي الذي ينتج هذا.

ولكن إذا كان علي أن أخمن، فذلك لأن leal يسمح بإجراء الطرح خارج المكان دون تدمير السجل المصدر.

يمكن أن يوفر هذا حركة تسجيل إضافية.


المثال الأول:

83 e8 01     subl $0x1, %eax 

الكتابة فوق %eax وبالتالي تدمير القيمة الأصلية.

المثال الثاني :

8d 6f ff     leal -0x1(%edi), %ebp 

مخازن %edi - 1 داخل %ebp. %edi يتم الاحتفاظ بها للاستخدام في المستقبل.

نصائح أخرى

ضع في اعتبارك أيضًا ذلك lea لا يؤثر على الأعلام في حين sub يفعل.لذلك إذا كانت التعليمات التالية لا تعتمد على العلامات التي يتم تحديثها عن طريق الطرح ثم لا سيكون تحديث الأعلام أكثر كفاءة أيضًا.

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