跳转到 C 中的函数,而不是调用,而不使用堆栈(回调函数)



我在 C 中有一个中断,它将调用"回调"函数。CallBack 只有一行可执行代码,它调用 YetAnotherFunction。

而不是让 CallBack 使用正常的 C 调用约定(它将返回地址推送到堆栈上,然后跳转到 YetAnotherFunction(,有没有办法我可以在没有推送的情况下跳转到 YetAnotherFunction?

中断、回调和 YetOtherFunction 位于单独的文件中,并在链接时放入可执行文件中。

推理。。。

我有一个中断,每秒被调用一百次。它反过来每秒调用 YetAnotherFunction 4 次。

我想使中断更具通用性,因此我想创建一个通用的 CallBack 函数。在一个项目中,CallBack将调用YetAnotherFunction。在其他项目中,它将简单地返回而不做任何工作。

这是因为我想将中断例程放在我的通用库中,并且回调在每个项目中都是唯一的。

目前,在 CallBack 中,我使用 C 结构来调用 YetAnotherFunction,但我突然想到会将返回地址推送到堆栈上,并且在从 YetAnotherFunction 返回时需要第二次"反弹"。虽然这并不多,但它冒犯了我的强迫症。

有没有办法,从回调中,直接跳转到YetAnotherFunction,而无需将地址推送到堆栈中?这样,当从 YetAnotherFunction 返回时,它会直接返回到中断调用方。

谢谢你的帮助,马克。

PS,我必须将 CallBack 或 YetOtherFunction 声明为中断吗?从中断处理程序中调用函数时,我应该考虑任何隐藏的"陷阱"吗?

另外,我可能错误地使用了术语回调,但我想你明白了。

谢谢。

只要写好的C代码。

int second(int x);
int first(int x)
{
return second(x);
}

任何受人尊敬的编译器都会检测到尾部调用,如果启用了适当的优化,则会发出"跳转"指令而不是调用。 例如

first:
jmp second

https://godbolt.org/z/9s3iPt

最新更新