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

时间:2013-02-23 05:40:33

标签: assembly x86 cpu-registers

大多数汇编程序都使用4个通用寄存器eax ebx ecx edx,但我发现通常我需要使用4个以上的寄存器来轻松完成我的任务,而不必push和{{1从堆栈到很多。由于我的程序无意使用FPU或MMX寄存器进行浮点计算或“预期用途”,在程序中使用这些额外的寄存器是否可以接受?

EG。使用pop为循环增量计数器释放xmm0寄存器以执行其他操作。

3 个答案:

答案 0 :(得分:3)

为什么四个?您可以使用以下所有内容:eaxebxecxedxesiediebp。那是七点。或者这还不够?

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寄存器来实现你想要的任何东西。