لماذا تصدر دول مجلس التعاون الخليجي "lea" بدلاً من "sub" للطرح؟
-
12-12-2019 - |
سؤال
إنني ألقي نظرة على بعض عمليات التجميع التي تم إنشاؤها عن طريق تفكيك بعض برامج لغة 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
يفعل.لذلك إذا كانت التعليمات التالية لا تعتمد على العلامات التي يتم تحديثها عن طريق الطرح ثم لا سيكون تحديث الأعلام أكثر كفاءة أيضًا.