例如,在最近的 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 是加载存储,这意味着它们必须将返回地址存储在寄存器中,否则 call/return 将必须是加载/存储操作,从而破坏指令集的正交性。 x86 是寄存器内存架构,并针对这些访问进行了优化,特别是具有微操作融合等现代微架构功能,弥补了相对较少的寄存器数量。
最后,这只会加速专门在寄存器上运行的叶函数。这种工作负载大多可以内联,从而将函数调用成本降低到零。
底线:不值得。

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

10-11 10:24