大多数汇编程序都使用4个通用寄存器eax
、ebx
、ecx
和edx
,但我发现经常需要使用4个以上的寄存器才能轻松完成任务,而不必过多地使用堆栈中的push
和pop
。由于我的程序无意使用FPU或MMX寄存器进行浮点计算;预期用途";,在你的程序中使用这些额外的寄存器被认为是可以接受的吗?
例如。使用CCD_ 7作为循环增量计数器,释放CCD_。
为什么是四个?您可以使用所有这些:eax
、ebx
、ecx
、edx
、esi
、edi
和ebp
。一共七个。还是这还不够?
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寄存器用于任何您想要的用途。