1

我想減少(手動)來自Linux彙編文件的指令數量。這基本上是通過在抽象語法樹中搜索預定義的減少來完成的。減少指令的彙編數量

例如:

pushl <reg1> 
popl <reg1> 

會,因爲它沒有任何意義被刪除。

或者:

pushl <something1> 
popl <something2> 

將變爲:

movl <something1>, <something2> 

我在尋找涉及的指令數是固定的優化項目。我不想搜索動態範圍的指令。

你能否建議其他類似的模式,可以用更少的指令來代替?

後來編輯:發現了,多虧了理查德·彭寧頓,那我要的是窺孔優化。

所以我把這個問題改爲:關於Linux彙編代碼上窺孔優化的建議。

+0

動機是什麼?我不是說這是一個糟糕的問題,只是......很奇怪。 – jprete 2009-11-28 15:51:21

+0

我想減小輸出文件的大小 – 2009-11-28 16:21:38

+0

並非操作系統與窺孔優化無關。如果它適用於linux代碼,它也可以在windows或mac os上運行。你需要區分的是架構。 – hirschhornsalz 2009-11-29 19:14:22

回答

3

編譯器已經做了這樣的優化。此外,它不是簡單的決定做出這樣的優化,這是因爲:

push reg1 
pop reg1 

內存位置仍留下REG1的值[SP-NN(其中nn字節=大小REG1的)。因此,雖然sp已經過去了,但是之後的代碼可以假設[sp-nn]包含reg1的值。

這同樣適用於其他的優化,以及:

push some1 
pop some2 

而這通常只發射時,有沒有相應的movl some1, some2指令。

如果您試圖優化高級編譯器生成的代碼,編譯器通常會考慮大部分這些情況。如果您試圖優化本地編寫的彙編代碼,那麼彙編程序員應該編寫更好的代碼。

我建議您優化編譯器,而不是優化的彙編代碼,它會爲你提供一個更好的框架來處理代碼的意圖和寄存器使用等

+0

好點,你必須非常小心。 – Krystian 2009-11-28 16:05:54

+0

難道你不認爲這些優化可能適用於簡單輸入嗎?對於「movl」優化,我假定some2是一個寄存器或一個內存引用 – 2009-11-28 16:24:25

+0

我的意思是你可以實現的優化範圍很可能已經由成熟的編譯器實現了。是的,這也包括窺視孔優化。即使省略了編譯器以優化某些內容,您也應該以編譯器爲目標來添加優化,而不是彙編代碼,以避免潛在的不需要的副作用。 – 2009-11-28 17:26:56

1

要獲得有關你的詳細信息正在嘗試做,你可能想要尋找「窺視孔優化」。

+0

這是一個很好的起點! – 2009-11-28 16:23:14

0
pushl <something1> 
popl <something2> 

替換

mov <something1>, <something2> 

實際上增加了我的計劃的規模。奇怪的!

您能否提供一些其他可能的窺孔優化?