gpt4 book ai didi

c++ - 跳转/尾调用到另一个函数

转载 作者:行者123 更新时间:2023-11-30 02:17:54 28 4
gpt4 key购买 nike

我有两个函数,在 C++ 中看起来像这样:

void f1(...);
void f2(...);

我可以更改 f1 的主体,但是 f2 是在另一个我无法更改的库中定义的。我绝对必须(尾部)在f1 中调用f2,并且我必须将提供给f1 的所有参数传递给f2,但据我所知,这在纯 C 或 C++ 中是不可能的。不幸的是,除了接受 va_listf2 别无选择。对 f2 的调用发生在函数的最后,因此我需要某种形式的尾调用。

我决定用汇编弹出当前函数的栈帧,然后跳转到f2(它实际上是作为一个函数指针接收的,并且在一个变量中,所以这就是我首先存储它的原因在寄存器中):

__asm {
mov eax, f2
leave
jmp eax
}

在 MSVC++ 中,在 Debug 中,它一开始似乎可以工作,但它以某种方式与其他函数的返回值混淆,有时会崩溃。在 Release 中,它总是崩溃。

这个汇编代码是否不正确,或者编译器的一些优化以某种方式破坏了这个代码?

最佳答案

编译器不会在您挖掘时做出任何保证。蹦床功能可能有效,但您必须在它们之间保存状态,并进行大量挖掘。

这是一个框架,但您需要了解很多有关调用约定、类方法调用等的知识.../

* argn, ..., arg0, retaddr */
trampoline:
push < all volatile regs >
call <get thread local storage >
copy < volatile regs and ret addr > to < local storage >
pop < volatile regs >
remove ret addr
call f2
call < get thread local storage >
restore < volatile regs and ret addr>
jmp f1
ret

关于c++ - 跳转/尾调用到另一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53068142/

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