2013-02-23 111 views
7

大多數彙編程序都使用4個通用寄存器eax ebx ecx edx,但我發現很多時候我需要使用4個以上的寄存器來輕鬆完成我的任務,而無需使用pushpop從堆棧到很多。由於我的程序無意使用FPU或MMX寄存器進行浮點計算或其「預期用途」,因此在程序中使用這些額外寄存器是否可接受?使用FPU和MMX寄存器作爲「通用寄存器」

例如,使用xmm0作爲循環增量計數器,釋放ecx寄存器以執行其他操作。

+0

你可以做任何你想做的事情。如果你發現使用xmm寄存器的速度比溢出速度快,那就去做吧。 – Mysticial 2013-02-23 05:42:55

+2

@Mysticial很少有人告訴我「我可以做任何我想做的」與編程有關。我把它挖掘:) – user99545 2013-02-23 05:50:25

+1

x86_64有8個額外的寄存器供一般使用。 – 2013-02-23 05:58:32

回答

3

爲什麼四個?您可以使用所有這些:eax,ebx,ecx,edx,esi, ediebp。那是七。或者這還不夠嗎?

由於FPU和MMX寄存器只能從它們自己和內存加載並存儲到自己和內存中,所以它們的工作方式有些尷尬。您不能在它們和通用寄存器之間自由移動數據,也不能在同時在兩種寄存器上操作指令。

如果七個通用寄存器不夠用,請使用本地/堆棧變量。例如,您可以直接在內存中減少計數器變量,也可以直接將其與常量或其他寄存器進行比較。很有可能,這將不會比以奇怪方式使用FPU或MMX寄存器更慢(可能更快)。

+0

否,七個寄存器不如使用全部寄存器快。 MMX寄存器可能非常有用。 – 2013-02-23 06:44:59

+0

@BenVoigt詳細說明? – 2013-02-23 06:45:48

-2

當然還有SI和DI,在x64上你有額外的寄存器,但是你可以使用任何你想要的FP寄存器。

0

你多久需要一個寄存器的全32位?對於像小計數器這樣的東西,可以隨意使用字節大小的通用寄存器:AH/AL,BH/BL,CH/CL,DH/DL。通過一些按位欺騙,您還可以使用通用寄存器的高16位作爲字大小變量的中間存儲器。

在實模式下(讀取:在DOS下),還可以使用段寄存器ES,FS和GS進行中間值存儲。但是,在受保護的操作系統(Windows,Linux,* nix)下,代碼會崩潰。