2017-05-29 66 views
1

我正在寫一些非常緊密的ASM代碼。是否可以消除這些冗餘尾隨零?

注意此組NASM產生的操作碼:

8AA4241C020000 mov ah,[esp+0x21c] 

而且類似:

051C020000 add eax,0x21c ; 4 extra 0's! 
8D84241C020000 lea eax,[esp+0x21c] ; Brutal! 

是否有你打算申請一個15位偏移到任何方式傳達給處理器32位寄存器,並讓它找出自己的0填充?

我一直在梳理https://c9x.me/x86/html/file_module_x86_id_176.html的一些指導。多餘的2字節在這裏或那裏真的會拯救我的生命!

也接受:

替代的方式來重寫語句來使其變小,最終什麼,我在這種情況下會爲是這樣的:

mov eax,[esp+0x21c] 
push eax 

如果有手有辦法編碼,使其超小,我很想看到技術。

+0

在那裏有一個LEA示例;) – baordog

+2

處理器手冊告訴您什麼是可用的。只有16位寄存器才支持16位偏移量。不確定你對手編碼的含義。這不像你可以做些什麼。 –

+0

您可以將寄存器的上半部分('xor ebx,ebx')清零,然後將您的16位值移入('mov bx,21c' - 注意:不要用'ebx')並根據需要使用('add eax, ebx')。 xor不是免費的,但是如果你多次使用這個技巧...... –

回答

0

是否有任何方式與處理器通信,您打算將15位偏移量應用於32位寄存器,並讓它找出自身的0填充?

號可用的指令編碼在英特爾手冊記錄(在線版本,其中各種可用的地方在線;看到標籤wiki鏈接)。對於MOV,偏移量大小與寄存器大小相匹配。當您將寫入16位寄存器時,處理器僅使用16位偏移量。無法獲得15位偏移量。

正如陳雷蒙德說,「它不喜歡你可以彌補[自己的自定義編碼]」。

在某些模式下,某些指令有一個符號擴展位。

當然,但我不明白這對你有何幫助。你的目標是減小指令的大小:增加一個額外的16位操作數大小前綴爲了改變偏移大小的解釋不會幫助你做到這一點。

一般而言,如果存在到相當於原來的指令編碼短的方式,彙編器將發射該編碼爲您服務。 當然 NASM會,其multi-pass optimization option(默認啓用)。

這裏額外的2個字節要麼就真的救了我的生活!

這不是地方,你可以有效地節省之一。按照David Wohlferd的建議,如果你反覆這樣做,你可以通過預先清除一個寄存器(XOR reg, reg; 2個字節),使用這個寄存器作爲reg寄存器的源寄存器來稍微壓縮代碼長度, (其中每個只有2個字節),然後將16位MOV寫入那些已經清除高位16位的寄存器中。

當處理具有大量寄存器的ISA時,在特定過程的上下文中專用一個來包含0是比較常見的做法。許多ISA通過具有專用的零寄存器來進一步實現這一目標。你也可以用x86來做到這一點,但考慮到寄存器限制了ISA,它通常是一種悲觀。但是,如果您的尺寸優化高於一切,它有時可能是有道理的。 (話又說回來,它可能不是,因爲它可能會迫使你溢出到內存,並且將由至少 2個字節爲每個存儲和加載臃腫的代碼。)

在現實中,我打賭有在你的代碼中有很多其他的地方,在這些地方你正在花費大量的指令大小,並且可以實現更大幅度的減少。如果您希望仔細查看代碼以減小尺寸,請考慮在Code Review上發佈問題(當然,假設您有工作代碼)。

我不確定在什麼情況下你會寫代碼,節省2個字節會很重要。也許你正在寫一個需要適合512字節的啓動加載器?在這種情況下,大多數人所做的就是編寫一個多級引導加載程序,其中第一級僅限於512字節,只是簡單地稱爲第二級,在這裏你沒有這種限制。

0

如果會有些寄存器與調零上24位,則例如(對於EAX零),可以剃2個字節關:

; additional 2 bytes ruining the saving, if you don't have zero reg. 
; b0 87     mov al,0x87 

; 5 byte fetch of value 
b0 87     mov al,0x87 
8a 24 84    mov ah,BYTE PTR [esp+eax*4] 

或者,如果你知道你有一些低的值104 ..540(只有一些適合的),其他一些寄存器,可以通過降低它的偏移一點,例如假設你知道ebx == 104

8a 64 9c 7c    mov ah,BYTE PTR [esp+ebx*4+(0x21C-104*4)] 

如果這是真實尺寸的挑戰,你必須發佈整個代碼,因爲可能(並且通常它們是)瘋狂的方式o以非常意想不到的和幾乎難以想象的方式節省大小。