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

mctunoxg  于 2023-05-07  发布在  其他
关注(0)|答案(3)|浏览(251)

大多数汇编程序使用4个通用寄存器eaxebxecxedx,但我发现我经常需要使用4个以上的寄存器来轻松完成任务,而不必从堆栈中调用太多的pushpop。由于我的程序无意使用FPU或MMX寄存器进行浮点计算或它们的“预期用途”,在您的程序中使用这些额外的寄存器是否可以接受?
例如,使用mm0作为循环递增计数器,释放ecx寄存器来做其他事情。

kgqe7b3p

kgqe7b3p1#

为什么是四个?你可以使用所有这些:eaxebxecxedxesiediebp。七个了或者这还不够?
FPU和MMX寄存器的使用有些不便,因为它们只能从自身和内存加载,并且只能存储到自身和内存中。您不能在它们和通用寄存器之间自由移动数据,也没有能够同时在两种寄存器上操作的指令。
如果7个通用寄存器还不够,可以使用本地/栈上变量。例如,您可以直接递减内存中的计数器变量,也可以直接将其与常量或其他寄存器进行比较。很有可能,这不会比以奇怪的方式使用FPU或MMX寄存器慢(可能更快)。

j0pj023g

j0pj023g2#

多久需要一个寄存器的32位数据?对于像小计数器这样的东西,可以随意使用字节大小的通用寄存器:AH/AL、BH/BL、CH/CL、DH/DL。通过一些按位技巧,您还可以使用通用寄存器的高16位作为字长变量的中间存储。
在真实的模式下(读取:在DOS下),也可以使用段寄存器ES、FS和GS来存储中间值。但是,在保护模式操作系统(Windows、Linux、*nix)下,代码会崩溃。

gpfsuwkq

gpfsuwkq3#

当然也有SI和DI,在x64上还有额外的寄存器,但你可以使用FP寄存器来做任何你想要的事情。

相关问题