2012-10-02 28 views
9

Bazı C programlarının sökülmesiyle oluşturulan bazı montajlara bakıyorum ve sık sık tekrar gördüğüm tek bir optimizasyonla karıştırıldım.Neden GCC çıkarma için "alt" yerine "lea" yayar?

Ben GCC derleyicisi üzerinde hiçbir optimizasyonunuz çıkarma için subl talimatı kullanır, ancak ben ne zaman optimizasyonlar derleyici yerine çıkarma bir leal talimatı kullanır (kesin olmak üzere -O3) açık, aşağıda örnek:

olmadan optimizasyonları: optimizasyonlarla

83 e8 01  subl $0x1, %eax 

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

Bu yönergelerin her ikisi de 3 bayt uzunluğundadır, bu yüzden burada bir optimizasyon görmüyorum. Birisi bana yardım eder ve derleyicinin seçimini açıklamaya çalışır mı?

Herhangi bir yardım için teşekkür ederiz.

cevap

13

Bunu üreten orijinal C kodunu görmeden anlatmak zor.

Ama tahmin etmem gerekirse, leal, çıkarma işleminin kaynak kaydediciyi yok etmeden yerinde yapılmasına izin vermesidir.

Bu, ekstra bir yazma hareketi kaydedebilir.


ilk örneği:

83 e8 01  subl $0x1, %eax 

böylece, orjinal değeri yok %eax üzerine yazar.

İkinci örnek:

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

depolar %ebp içine %edi - 1. %edi, ileride kullanılmak üzere korunur.

+0

Bu bakış açısıyla değerlendirmedim, çünkü optimize edilmemiş sürüm yalnızca çıkarmalarda anlık değerler kullanıyor. Teşekkürler, bu çok yardımcı oldu. –

10

sub bunu yaparken lea öğesinin de bayrakları etkilemediğini unutmayın. Dolayısıyla, sonraki talimatlar çıkarma tarafından güncelleştirilmekte olan bayraklara bağlı değilse, o zaman bayrakları güncellemek daha verimli olacaktır.

+0

Eğer 'lea' bayrakları etkilemezse, o zaman nasıl 'sub' ile eşdeğerdir? Bayrakların 'sub' ile aynı etkiye sahip olması etkilenmez mi? – crisron

+1

@crisron eşdeğer değildir ve farklı amaçlara hizmet ederler. Yan etkilere ihtiyacınız yoksa/ihtiyacınız yoksa, lea kullanın, aksi halde kullanın –