使用 FPU 和 MMX 寄存器作为"general registers"



大多数汇编程序都使用4个通用寄存器eaxebxecxedx,但我发现经常需要使用4个以上的寄存器才能轻松完成任务,而不必过多地使用堆栈中的pushpop。由于我的程序无意使用FPU或MMX寄存器进行浮点计算;预期用途";,在你的程序中使用这些额外的寄存器被认为是可以接受的吗?

例如。使用CCD_ 7作为循环增量计数器,释放CCD_。

为什么是四个?您可以使用所有这些: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寄存器用于任何您想要的用途。

最新更新