如果您正在编写程序集,那么将值分配给哪些寄存器是否重要?比方说,您将累积/中间值存储在%ebx中,而不是%eax,而%eax通常用于此目的。这是不好的做法吗?它会影响性能吗?
换句话说,你能把它们当作存储空间来对待吗?还是你应该坚持将它们用于特定的目的?
发布于 2020-01-23 02:45:58
首先,您必须使用支持您想要使用的指令的寄存器。x86上的许多指令(以及其他的体系结构,尽管不是这样)对如何支持寄存器有一些限制。
以某些双寄存器乘法和除法指令为例,它特别涉及到eax和edx的特定用途。
接下来,您要使用高效的寄存器,即寄存器:
编码更短的
。
发布于 2020-01-22 22:40:23
任何只有您的代码正在运行的地方,您都可以使用您想要的任何寄存器来实现您想要的任何目的。然而,有两个主要的时候,前提是错误的:
您的调用约定还将允许函数在不保存的情况下销毁某些寄存器:易失寄存器和非易失寄存器。例如,通常情况下,标志、EAX、ECX和EDX在32位x86调用约定中是不稳定的,而其余的整数寄存器则通过call保存到符合ABI的函数中。有关系统调用和用户空间函数调用约定,请参见What are the calling conventions for UNIX & Linux system calls on i386 and x86-64 .。
发布于 2020-01-23 00:39:02
如果您正在编写程序集,那么您分配值的寄存器重要吗?
对于80x86;使用哪些寄存器/s可能重要的情况包括:
当分段不完全相同时,
mov [ds:bp], ...与mov [bx],... )。mov [di+si], ...)的限制而无法编码的地址计算,该字段与32/64位代码基本无关,任何reg都可以是基或(ESP/RSP除外)索引.。
避免64位代码中REX前缀的mov r8d,1) (例如mov ebx,1 vs. mov ebx,1)
说,您将累积/中间值存储在%ebx中,而不是%eax,而%eax通常用于此目的。这是不好的做法吗?它会影响性能吗?
一般来说,这并不重要(这并不是一种糟糕的实践,也不会影响性能);但是,这可能取决于周围的代码(以后如何使用该值),并且可能会提高性能或降低性能。
更具体地说,即使所有寄存器都是相同的,最优寄存器分配也很难实现(NP完全问题);而80x86 (在某些情况下,所有寄存器都不是相同的)使得实现最优寄存器分配更加困难。(并将寄存器分配与指令调度联系起来,就像以不同的顺序执行操作,以便在特定指令需要的情况下,将数据的移动降到/退出寄存器中。)
https://stackoverflow.com/questions/59869218
复制相似问题