首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在编写程序集时,您使用哪个寄存器是否重要?

在编写程序集时,您使用哪个寄存器是否重要?
EN

Stack Overflow用户
提问于 2020-01-22 22:34:22
回答 4查看 2.1K关注 0票数 7

如果您正在编写程序集,那么将值分配给哪些寄存器是否重要?比方说,您将累积/中间值存储在%ebx中,而不是%eax,而%eax通常用于此目的。这是不好的做法吗?它会影响性能吗?

换句话说,你能把它们当作存储空间来对待吗?还是你应该坚持将它们用于特定的目的?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-01-23 02:45:58

首先,您必须使用支持您想要使用的指令的寄存器。x86上的许多指令(以及其他的体系结构,尽管不是这样)对如何支持寄存器有一些限制。

以某些双寄存器乘法和除法指令为例,它特别涉及到eax和edx的特定用途。

接下来,您要使用高效的寄存器,即寄存器:

编码更短的

  • (here是关于指令长度的x64的一个很好的讨论),. 短编码可以更好地使用缓存资源,这可以让更大的程序运行更多的here,这是因为调用约定,也就是说它们不会为它们的使用带来额外的(软件/调用-约定)开销--除非这种开销已经支付了!
  • 是正在产生的值的最终目的地:例如,如果第二个参数,然后,对应于要传递的第二个值的寄存器(同样根据调用约定). ,如果我们可以将该值放在正确的寄存器中(根据传递或返回值的需要),则可以放弃数据移动(也称为复制)指令。

票数 5
EN

Stack Overflow用户

发布于 2020-01-22 22:40:23

任何只有您的代码正在运行的地方,您都可以使用您想要的任何寄存器来实现您想要的任何目的。然而,有两个主要的时候,前提是错误的:

  1. 您需要使用堆栈指针来达到它的预期目的,或者当信号处理程序运行时,它们会破坏内存中实际上很重要的部分。

  1. 您的系统有一个调用约定。无论何时调用其他人的库函数(或相应的syscalls函数),都需要将参数放在他们想要的位置,并且不管您想要返回值在哪里,它们都会将返回值放在标准位置。

您的调用约定还将允许函数在不保存的情况下销毁某些寄存器:易失寄存器和非易失寄存器。例如,通常情况下,标志、EAX、ECX和EDX在32位x86调用约定中是不稳定的,而其余的整数寄存器则通过call保存到符合ABI的函数中。有关系统调用和用户空间函数调用约定,请参见What are the calling conventions for UNIX & Linux system calls on i386 and x86-64 .。

票数 5
EN

Stack Overflow用户

发布于 2020-01-23 00:39:02

如果您正在编写程序集,那么您分配值的寄存器重要吗?

对于80x86;使用哪些寄存器/s可能重要的情况包括:

  • 遵从其他人的调用约定(在右寄存器中传递值,通过选择“调用方保存”寄存器来避免堆栈对“调用方保存”的使用)

  • 使用具有隐含寄存器的指令(MUL、DIV、MOVSQ/D/W/B、STOSQ/D/W/B、XLATB、AAA、CWD、.-它们很多)

当分段不完全相同时,

  • 试图避免段寄存器前缀的开销(例如,mov [ds:bp], ...mov [bx],... )。

  • 避免了由于"MOD/RM“字段(例如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 (在某些情况下,所有寄存器都不是相同的)使得实现最优寄存器分配更加困难。(并将寄存器分配与指令调度联系起来,就像以不同的顺序执行操作,以便在特定指令需要的情况下,将数据的移动降到/退出寄存器中。)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59869218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档