mips汇编实现setjmp和longjmp函数,以及测试用例
时间: 2023-05-31 20:06:18 浏览: 61
以下是MIPS汇编实现setjmp和longjmp函数的代码:
```assembly
# setjmp function
# Arguments: $a0 - pointer to jmp_buf
# Returns: 0 (for the initial call), or 1 if returning from longjmp
setjmp:
addi $sp, $sp, -32 # allocate space on the stack
sw $ra, 28($sp) # save return address
sw $fp, 24($sp) # save frame pointer
add $fp, $sp, 32 # set new frame pointer
sw $a0, 0($fp) # save jmp_buf pointer
sw $a1, 4($fp) # save return value
li $v0, 0 # set return value to 0
jr $ra # return to caller
# longjmp function
# Arguments: $a0 - pointer to jmp_buf, $a1 - return value
# Returns: Does not return
longjmp:
lw $fp, 24($sp) # restore frame pointer
lw $ra, 28($sp) # restore return address
addi $sp, $sp, 32 # deallocate stack space
lw $t0, 0($fp) # load jmp_buf pointer
lw $t1, 4($fp) # load return value
sw $a1, 0($t0) # store return value in jmp_buf
addi $v0, $zero, 1 # set return value to 1
jr $t1 # jump to saved return address
# test case
main:
addi $sp, $sp, -32 # allocate space on the stack
sw $ra, 28($sp) # save return address
sw $fp, 24($sp) # save frame pointer
add $fp, $sp, 32 # set new frame pointer
# setjmp call
la $a0, jmp_buf # load jmp_buf pointer
jal setjmp # call setjmp
move $t0, $v0 # save return value
li $v0, 10 # set $v0 to 10
sw $v0, 0($t0) # store $v0 in jmp_buf
# longjmp call
la $a0, jmp_buf # load jmp_buf pointer
lw $a1,