gpt4 book ai didi

assembly - x64 - 为什么仍然使用 'call' ?

转载 作者:行者123 更新时间:2023-12-02 22:13:26 27 4
gpt4 key购买 nike

例如,在最近的 Windows 二进制文件 (win 8.1 x64) 和使用 VC++“call”指令编译的程序中仍然存在。将返回地址存储到寄存器中不是一种更快更好的方法吗?与大多数参数相同,而不是仍然使用堆栈?

我的意思是:

功能:

func:

; do something

jmp r8

它的实例:

lea r8, [rip + tmp_1 - tmp_0] ; or rip + 'jmp func' size

tmp_0:

jmp func

tmp_1:

; rest of code

最佳答案

现代 x86 微架构有多种方式通过堆栈进行几乎免费的调用:
1. 专用堆栈引擎,在 OoO 执行期间保持堆栈指针与堆栈操作同步。
2. 硬件返回堆栈,保存返回地址以便快速访问。

而且,整个架构与 MIPS 等不同。 MIPS 和大多数其他 RISC 都是加载存储的,这意味着它们必须将返回地址存储在寄存器中,否则调用/返回将必须是加载/存储操作,搞乱了指令集的正交性。

x86 是一种寄存器内存架构,并且针对这些访问进行了优化,特别是具有微操作融合等现代微架构功能,弥补了寄存器数量相对较少。最后,这只会加速专门在寄存器上运行的叶函数。这种工作负载大部分可以内联,将函数调用成本降低到零。
底线:不值得。

关于assembly - x64 - 为什么仍然使用 'call' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27974214/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com