首页 > 解决方案 > 用于 2 个或更多寄存器的程序集推送或保留堆栈

问题描述

我想在我的函数中使用' rbx '和' rcx '寄存器,在使用它们之前,我想保存它们。由于它是 2 个寄存器,我想知道哪种方式更好?将它们一一推送或保留堆栈(16 字节)并将每个值复制到堆栈中并...

方式1:

FUNC:
        push rbx
        push rcx

        ...
        ...

        pop rbx
        pop rcx

方式2:

   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 个或更多寄存器该怎么办?将它们一一推送或堆叠保留并...?

听说push是: 1-保留栈2-将寄存器值复制到保留栈中

而且 pop 是: 1 - 将值复制到寄存器 2 - 恢复堆栈

因此,对于 2 个或更多寄存器,我可以自己完成,无需多保留和恢复(堆栈)

标签: assemblyx86-64callstackmicro-optimization

解决方案


从 Pentium-M 开始的 x86 CPU 有一个堆栈引擎来处理 RSP 更新,使 push/pop 像 mov store/load 一样是单uop。这就是 GCC 使用 push/pop 的原因,除非你使用-mtune=pentium3什么。


推荐阅读