assembly - 用于 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 个或更多寄存器,我可以自己完成,无需多保留和恢复(堆栈)
解决方案
从 Pentium-M 开始的 x86 CPU 有一个堆栈引擎来处理 RSP 更新,使 push/pop 像 mov store/load 一样是单uop。这就是 GCC 使用 push/pop 的原因,除非你使用-mtune=pentium3
什么。
推荐阅读
- android - Android - 使用 Google Scoped Storage API 访问本机 C/C++ 代码中的文件
- arrays - 在集合中的输入数组和数组列之间设置交集
- python - 由于缺少源代码,部分 numpy 和 scipy 将无法在 Windows 上安装
- heroku - Heroku 应用程序会进入睡眠状态,即使图标显示它不会
- r - 将几个班级合并为一个班级
- javascript - 嵌套动作使reducer状态与redux store不同?
- angular - SignalR 接收数据并显示消息?
- vhdl - VHDL - 高阻抗的使用
- sql - 在 ASP.NET GridView 中获取更新的 TextBox 值
- javascript - 克服 WebRTC 对某些 ISP 的阻塞