8

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

例如。使用xmm0循环增量计数器释放ecx寄存器来做其他事情。

4

3 回答 3

3

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

FPU 和 MMX 寄存器使用起来有些尴尬,因为它们只能从它们自己和内存中加载,并且只能存储到它们自己和内存中。您不能在它们和通用寄存器之间自由移动数据,也没有指令能够同时对两种寄存器进行操作。

如果七个通用寄存器不够用,请使用本地/堆栈变量。例如,您可以直接减少内存中的计数器变量,也可以直接将其与常量或其他寄存器进行比较。很有可能,这不会比以奇怪的方式使用 FPU 或 MMX 寄存器更慢(可能更快)。

于 2013-02-23T06:17:55.373 回答
1

您多久需要一次完整的 32 位寄存器?对于小型计数器之类的东西,请随意使用字节大小的四分之一通用寄存器:AH/AL、BH/BL、CH/CL、DH/DL。通过一些按位技巧,您还可以使用通用寄存器的高 16 位作为字大小变量的中间存储。

在实模式下(读作:DOS下),还可以使用段寄存器ES、FS、GS进行中间值存储。但是,在保护模式操作系统(Windows、Linux、*nix)下,代码会崩溃。

于 2013-02-25T02:40:19.027 回答
-2

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

于 2013-02-23T05:57:25.960 回答