大多数汇编程序都使用4个通用寄存器eax ebx ecx edx
,但我发现通常我需要使用4个以上的寄存器来轻松完成我的任务,而不必push
和{{1从堆栈到很多。由于我的程序无意使用FPU或MMX寄存器进行浮点计算或“预期用途”,在程序中使用这些额外的寄存器是否可以接受?
EG。使用pop
为循环增量计数器释放xmm0
寄存器以执行其他操作。
答案 0 :(得分:3)
为什么四个?您可以使用以下所有内容:eax
,ebx
,ecx
,edx
,esi
,edi
和ebp
。那是七点。或者这还不够?
FPU和MMX寄存器使用起来有些尴尬,因为它们只能从自身和内存中加载,只能存储到自身和内存中。您不能在它们和通用寄存器之间自由移动数据,也不能同时在两种寄存器上操作指令。
如果七个通用寄存器不够,请使用本地/堆栈上的变量。例如,您可以直接在内存中递减计数器变量,也可以直接将其与常量或其他寄存器进行比较。有可能,这比以奇怪的方式使用FPU或MMX寄存器要慢(可能,更快)。
答案 1 :(得分:0)
您多久需要一个完整的32位寄存器?对于像小型计数器这样的东西,可以随意使用字节大小的通用寄存器:AH / AL,BH / BL,CH / CL,DH / DL。通过一些按位技巧,您还可以使用通用寄存器的高16位作为字大小变量的中间存储。
在实模式下(读取:在DOS下),您还可以使用段寄存器ES,FS和GS进行中间值存储。在受保护模式的操作系统(Windows,Linux,* nix)下,代码会崩溃。
答案 2 :(得分:-2)
Weel当然还有SI和DI,并且在x64上你有额外的寄存器,但是你可以使用FP寄存器来实现你想要的任何东西。