使用尽可能少的寄存器通常是个好主意吗?

Oni*_*zou 1 x86 assembly x86-64

这是我的代码.

我在x86程序集中编写程序,计算四个等级的平均值.我目前使用的4个寄存器(RAX,RBX,RCXRDX)举行四个等级,这在我的声明.data部分.我也有quot,rem,total,并ans全部初始化为0.

我的一般方法是将四个寄存器一起添加并将总数存储在total变量中.我原本只打算保持总RAX,可是转念一想将其存储在一个变量,这样我可以重用RAXRDX.

这是一个好主意还是我为自己生成更多代码?我重置RAXRDX注册为0,以便我可以将它们用于我的除法计算(总计/ 4).我正在关注的书正在使用RAXRDX注册,所以我认为这就是我应该做的.

代码未完成,因此忽略IDIV了最后一行.

segment .data
    a       dq  100
    b       dq  57
    c       dq  74
    d       dq  23
    quot    dq  0
    rem     dq  0
    total   dq  0
    ans     dq  0

segment .text
    global main

main:
    mov rax, [a]
    mov rbx, [b]
    mov rcx, [c]
    mov rdx, [d]

    add rax, rbx
    add rcx, rdx
    add rax, rcx
    mov [total], rax
    mov rax, 0
    mov rdx, 0
    mov rax, [total]
    mov rdx, 0
Run Code Online (Sandbox Code Playgroud)

cod*_*eim 5

没有对错,除非你人为地将自己限制在比可用的更少的寄存器上,否则你将添加操作码并使代码膨胀.仅使用编码操作所需的寄存器数量.

但是,如果需求发生变化并且您必须处理100个等级,请考虑将会发生什么.或者1000.或者N ..这可能激发你以不同的方式实现你的逻辑.也许考虑使用堆栈来存储成绩?

PS:从架构的角度来看,这里主要关注的是平衡溢出/恢复寄存器的缓存和操作码开销.这个决定在这里并不适用,因为你泄漏的任何数量的寄存器(手工编码)都应该在L1缓存中.实际上,当你的实现用完了寄存器而你开始不得不添加溢出操作码时.