mips汇编指令setjmp和longjmp实现,以及测试函数
时间: 2023-05-31 14:06:14 浏览: 108
MIPS汇编指令setjmp和longjmp的实现:
setjmp:
```assembly
setjmp:
addi $sp, $sp, -8 # 保存栈指针
sw $fp, 4($sp) # 保存帧指针
sw $ra, 0($sp) # 保存返回地址
move $v0, $sp # 将栈指针存入v0,作为跳转点
jr $ra # 返回
```
longjmp:
```assembly
longjmp:
move $sp, $a0 # 恢复栈指针
lw $fp, 4($sp) # 恢复帧指针
lw $ra, 0($sp) # 恢复返回地址
addi $sp, $sp, 8 # 恢复栈指针
jr $ra # 跳转回调用点
```
测试函数:
```c
#include <setjmp.h>
#include <stdio.h>
jmp_buf buf;
void func() {
printf("enter func\n");
longjmp(buf, 1);
printf("exit func\n");
}
int main() {
if (setjmp(buf) == 0) {
printf("enter main\n");
func();
} else {
printf("return from longjmp\n");
}
printf("exit main\n");
return 0;
}
```
输出:
```
enter main
enter func
return from longjmp
exit main
```
阅读全文