我在 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