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