寄存器是彙編代碼中存儲和處理數據的最強大的地方,但是與主存儲器相比,它的空間有限。因此,我認爲確定何時將數據移動到寄存器以及何時移出數據對優化彙編代碼非常重要,特別是在需要大量寄存器使用時。一個變量應該存儲在一個寄存器中多久?
因此,將數據存入寄存器之前需要多長時間才能將數據存入主存儲器供以後使用(在寄存器中處理後)?或者當我沒有更多的寄存器供我處理新數據時,是否將它們放入內存中? (我個人不認爲這是適當的:P)
考慮下面的代碼(1碼):
MOV EBX,SomeAddressForLaterUse
;...-imagine 37 lines of assembly code here
MOV ESI,SomeAddress
MOV EDI,EBX
MOV ECX,SIZE_IN_BYTES
REP MOVSB
現在考慮這個其他代碼(第二代碼);
MOV EBX,SomeAddressForLaterUse
PUSH EBX
;...-imagine 37 lines of assembly code here
MOV ESI,SomeAddress
POP EDI
MOV ECX,SIZE_IN_BYTES
REP MOVSB
上面,我覺得這是很明顯的是,第二碼具有優勢,節省多了一個寄存器中的37行的彙編代碼(除非這37行的彙編代碼不使用多少個寄存器)使用,但有時候在這兩種方法之間選擇是非常困惑的,例如,如果它是10行代碼而不是37代碼呢?
總而言之,在確定將數據從寄存器移開時是否存在某種規則?
你給了一個規則,並說你不喜歡它。你能指出這個規則有什麼不好的地方,在任何特定的時候它會給出不好的結果?一旦您發現該規則的具體問題,您就有了改進的基礎。 –
不確定你的問題有一個簡單的答案,但有一點需要注意:訪問大多數處理器的L1高速緩存通常可以在不到一個時鐘週期內完成,因此你可以將整個空間視爲寄存器。所以在現代CPU上這通常是32k或更多。此外,諸如算法選擇,cache-awarenss等問題通常會使您在指令級別從微優化中獲得的收益變得微不足道。這是什麼類型的項目? – QuadrupleA
@QuadrupleA:當然,但是CPU在單個時鐘週期內試圖退出多條指令,並且它們都不可能執行L1緩存訪問。 –