I/O系统调用需要退出
I/O System Call needs exit
如果我执行 i/o 个或更多系统调用,当我完成时我应该执行退出调用(代码 10)还是不需要?
我举个例子:
.data
input_message: .asciiz "\nEnter an integer: "
.text
.globl main
main:
li $v0, 4
la $a0, input_message
syscall
addi $v0, $zero, 5
syscall
add $t0, $zero, $v0
addi $t0, $t0, 1
addi $v0, $zero, 1
add $a0, $zero, $t0
syscall
[***]
jr $ra
我应该在 [***]
位置添加一个退出调用,像这样,或者不?
li $v0, 10
syscall
QtSpim(至少版本 9.1.17 for Windows)将以下代码放在 text
部分的开头:
[00400000] 8fa40000 lw , 0() ; 183: lw $a0 0($sp) # argc
[00400004] 27a50004 addiu , , 4 ; 184: addiu $a1 $sp 4 # argv
[00400008] 24a60004 addiu , , 4 ; 185: addiu $a2 $a1 4 # envp
[0040000c] 00041080 sll , , 2 ; 186: sll $v0 $a0 2
[00400010] 00c23021 addu , , ; 187: addu $a2 $a2 $v0
[00400014] 0c000000 jal 0x00000000 [main] ; 188: jal main
[00400018] 00000000 nop ; 189: nop
[0040001c] 3402000a ori , [=10=], 10 ; 191: li $v0 10
[00400020] 0000000c syscall ; 192: syscall # syscall 10 (exit)
如您所见,它将 jal
到您的 main
标签,如果您 return 和 jr $ra
它将为您执行退出系统调用。
所以 jr $ra
没问题,只要你保留了 $ra
的原始值。但是,其他模拟器(PcSpim、Mars)可能需要自己执行退出系统调用。
如果我执行 i/o 个或更多系统调用,当我完成时我应该执行退出调用(代码 10)还是不需要?
我举个例子:
.data
input_message: .asciiz "\nEnter an integer: "
.text
.globl main
main:
li $v0, 4
la $a0, input_message
syscall
addi $v0, $zero, 5
syscall
add $t0, $zero, $v0
addi $t0, $t0, 1
addi $v0, $zero, 1
add $a0, $zero, $t0
syscall
[***]
jr $ra
我应该在 [***]
位置添加一个退出调用,像这样,或者不?
li $v0, 10
syscall
QtSpim(至少版本 9.1.17 for Windows)将以下代码放在 text
部分的开头:
[00400000] 8fa40000 lw , 0() ; 183: lw $a0 0($sp) # argc
[00400004] 27a50004 addiu , , 4 ; 184: addiu $a1 $sp 4 # argv
[00400008] 24a60004 addiu , , 4 ; 185: addiu $a2 $a1 4 # envp
[0040000c] 00041080 sll , , 2 ; 186: sll $v0 $a0 2
[00400010] 00c23021 addu , , ; 187: addu $a2 $a2 $v0
[00400014] 0c000000 jal 0x00000000 [main] ; 188: jal main
[00400018] 00000000 nop ; 189: nop
[0040001c] 3402000a ori , [=10=], 10 ; 191: li $v0 10
[00400020] 0000000c syscall ; 192: syscall # syscall 10 (exit)
如您所见,它将 jal
到您的 main
标签,如果您 return 和 jr $ra
它将为您执行退出系统调用。
所以 jr $ra
没问题,只要你保留了 $ra
的原始值。但是,其他模拟器(PcSpim、Mars)可能需要自己执行退出系统调用。