簡體   English   中英

使用 FPU 和 MMX 寄存器作為“通用寄存器”

[英]Using FPU and MMX registers as “general registers”

大多數匯編程序使用 4 個通用寄存器eax ebx ecx edx但我發現我經常需要使用 4 個以上的寄存器來輕松完成我的任務,而不必從堆棧中pushpop太多。 由於我的程序無意使用 FPU 或 MMX 寄存器進行浮點計算或其“預期用途”,在您的程序中使用這些額外的寄存器是否可以接受?

例如。 使用xmm0作為循環增量計數器釋放ecx寄存器來做其他事情。

為什么是四個? 您可以使用所有這些: eaxebxecxedxesiediebp 那是七。 或者這還不夠?

FPU 和 MMX 寄存器使用起來有些笨拙,因為它們只能從自身和內存中加載,並且只能存儲到自身和內存中。 您不能在它們和通用寄存器之間自由移動數據,也沒有能夠同時對兩種寄存器進行操作的指令。

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

您多久需要一個完整的 32 位寄存器? 對於小計數器之類的東西,可以隨意使用字節大小的四分之一通用寄存器:AH/AL、BH/BL、CH/CL、DH/DL。 通過一些按位技巧,您還可以使用通用寄存器的高 16 位作為字大小變量的中間存儲。

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

好吧,當然也有 SI 和 DI,在 x64 上你有額外的寄存器,但你可以根據需要使用 FP 寄存器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM