2个或更多寄存器的汇编推入或保留堆栈

问题描述 投票:0回答:1

我想在函数中使用'rbx'和'rcx'寄存器,在使用它们之前,我想保存它们。由于它是2个寄存器,我想知道哪种方法更好? push一对一或reserve stack(16字节),然后将每个值复制到堆栈中,然后...

Way1:

FUNC:
        push rbx
        push rcx

        ...
        ...

        pop rbx
        pop rcx

Way2:

   sub    rsp, 16
   mov    QWORD [rsp], rbx
   mov    QWORD [rsp+8], rcx

   ...
   ...

   mov    rbx, QWORD [rsp]
   mov    rcx, QWORD [rsp+8]
   add    rsp, 16

第二种方式具有更多的源代码(大小),但是我在谈论CYCLE。当我只想使用一个寄存器时,很明显我必须使用push,但是对于2个或更多这样的寄存器我应该怎么做?一张一张地推入他们或堆叠储备,然后...?

我听说推送是:1-备用堆栈2-将寄存器值复制到保留的堆栈中

并且还会弹出:1-将值复制到寄存器中2-恢复堆栈

因此,对于2个或更多寄存器,我可以自行完成而无需多次保留和还原(堆栈)

assembly x86-64 callstack micro-optimization
1个回答
2
投票

x86 CPU自奔腾M以来就具有堆栈引擎,该堆栈引擎可以处理RSP更新,从而使推/弹出式单向运算像mov存储/加载一样。这就是为什么除非您使用-mtune=pentium3或类似的东西,否则GCC使用推/弹出的原因。

© www.soinside.com 2019 - 2024. All rights reserved.