【发布时间】:2021-03-10 12:32:36
【问题描述】:
我知道这是一个奇怪的问题,但有没有办法使用指针返回代码中的某个点?我想做的是模仿 MIPS 中 jal 指令的行为。
例如,如果我有一个返回 1 的函数 fun1(),另一个返回 2 的函数 fun2(),以及此处定义的 main():
1 main() {
2 int v = fun1(); // v = 1
3 if (v == 2) return 2;
4 v = fun2(); // v = 2
5 }
在第 4 行调用 fun2() 后,我是否可以通过在第 2 行保留指向 fun1 调用返回地址的指针来跳回第 3 行?
【问题讨论】:
-
使用 setjmp/longjmp
-
这可能是 XY 问题。可能你想要一个循环。
-
使用 GNU C 扩展来获取 goto 标签 (gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html) 的地址,是的,您可以使用 C 变量作为“链接寄存器”来模拟类似
jal的函数调用.但是不,您不能侵入编译器发出的 asm 并捕获返回地址。 IIRC,标准 MIPS 调用约定不要求函数通过将返回地址恢复到 LR 来返回。理论上,他们可以在将返回地址复制到该寄存器而不是$lr后返回jr $t9或其他任何内容。调用者不能假设任何关于 LR 的返回