我想在函数中使用'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个或更多寄存器,我可以自行完成而无需多次保留和还原(堆栈)
x86 CPU自奔腾M以来就具有堆栈引擎,该堆栈引擎可以处理RSP更新,从而使推/弹出式单向运算像mov存储/加载一样。这就是为什么除非您使用-mtune=pentium3
或类似的东西,否则GCC使用推/弹出的原因。