2012-10-02 34 views
9

我正在查看一些通過反彙編一些C程序生成的程序集,我很困惑我經常重複的單個優化。爲什麼GCC發射「lea」而不是「sub」進行減法?

當我對GCC編譯器沒有優化使用subl指令減法,但是當我有優化接通(-O3要準確)編譯器使用一個leal指令而不是減法,例如下面:

沒有優化:

83 e8 01  subl $0x1, %eax 

與優化

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

這兩個指令都是3個字節長,所以我在這裏沒有看到優化。有人可以幫我解釋一下編譯器的選擇嗎?

任何幫助,將不勝感激。

回答

13

很難說沒有看到產生這個的原始C代碼。

但是如果我不得不猜測,這是因爲leal允許在不破壞源寄存器的情況下進行相減。

這可以節省一個額外的註冊移動。


第一個例子:

83 e8 01  subl $0x1, %eax 

覆蓋%eax從而破壞了原來的值。

第二個例子:

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

存儲%edi - 1%ebp%edi保留以供將來使用。

+0

我沒有從這個角度考慮它,因爲非優化版本只使用減法中的立即值。謝謝,這非常有幫助。 –

10

請記住,lea不會影響標誌,sub會。因此,如果隨後的指令不依賴於減法更新的標誌,那麼而不是更新標誌也會更有效。

+0

如果'lea'不影響標誌,那麼它如何等同於'sub'?它應該不會影響標誌與'sub'具有相同的效果嗎? – crisron

+1

@crisron他們是不相同的,服務於不同的目的。如果您不想/需要副作用,請使用lea,否則使用sub –

相關問題