IA32-x86使用专用寄存器作为通用寄存器

时间:2014-09-24 19:12:08

标签: assembly x86-64 ia-32

我正在启动汇编程序编程,我正在编写一些算法,并且通用寄存器的数量还不够

有没有办法在asm中使用特殊寄存器(eip,eflags)作为通用寄存器?

我只需要进行一些操作但是所有通用寄存器都已被占用,我不喜欢在内存中存储会降低算法性能的值。

有可能吗?

5 个答案:

答案 0 :(得分:2)

明智地重复使用已经可用的通用寄存器可能是您最好的选择。仔细考虑你的算法。

重新调整EIP是不可能的,并且使用EFLAGS作为其他东西,尽管可能,只是有太多的副作用通常是有用的。

最好是使用内存实际计算算法。您可能会发现,由于缓存,访问速度并不像您想象的那么慢。

另一个选择是使用数学协处理器的寄存器作为存储的小型私有堆栈,但这也可能不如仅仅使用内存那么令人满意。

答案 1 :(得分:2)

简短回答:不可以。这些寄存器并不是要明确写出来的。

您必须重写算法,更好地分配寄存器,处理智能地将寄存器溢出/重新加载到内存以最小化性能影响,或者,如果可能,使用XMM寄存器将INT寄存器移入/移出,或者执行所有在XMM方面的指令链。另一个选择是使用64位来利用可用的额外寄存器。

答案 2 :(得分:0)

简短的回答是否定的。

如果你正在运行一个程序,使用eip作为通用寄存器肯定是不可能的,就好像你“写”到eip一样,你的程序将跳转到该地址的运行指令(大致),这可能不起作用....至于EFLAGS,它有许多位可以保留或控制你不想改变的各种东西,这意味着它不会作为通用寄存器工作。由于您似乎打算不使用内存来保留值,因此您可以使用esp和ebp(如果您完全使用堆栈,请小心)。除此之外,我认为你使用的大多数寄存器都需要权限级别0来写入和再次,如果你将它们用作通用寄存器,则很可能会产生负面影响。

可能有一些非常特殊的寄存器是特定于您的处理器的,但如果您要使用它们,代码将无法在处理器之间移植。

答案 3 :(得分:0)

我记得我使用调试寄存器dr0到dr3来存储数据。但我不确定它们的使用速度有多快。也许在CPU内部重命名寄存器(用于构建微操作)也可以使其具有高性能。

答案 4 :(得分:0)

寄存器文件是一种小型存储,仅对一条指令提供支持,并且用于中间计算。而且,如果您想广泛使用寄存器,那将扼杀诸如寄存器之类的快速存储的目的。

另一方面,为您要使用的内存层次结构的第二级构建了CACHE。因此,您需要设计一种可以充分利用这些CACHE支持的数据局部性的算法。对于重用指令的指令,有单独的缓存,例如在循环中,这些缓存非常有效地实现。

即使如此,如果要大量使用寄存器,那么智能编译器是另一种选择,在这种情况下,将使用智能寄存器分配技术。最近的混合技术使用离线机器学习算法来构建启发式函数(在运行时使用),该启发式函数确定并在不同的分配方法之间进行切换,这些分配方法根据代码行为将表现更好。希望对您有所帮助。问候