Assembly I/O系统调用需要退出

Assembly I/O系统调用需要退出,assembly,mips,system-calls,qtspim,Assembly,Mips,System Calls,Qtspim,如果我执行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

如果我执行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(对于Windows,至少版本为9.1.17)将以下代码放置在
文本
部分的开头:

[00400000] 8fa40000  lw $4, 0($29)            ; 183: lw $a0 0($sp) # argc 
[00400004] 27a50004  addiu $5, $29, 4         ; 184: addiu $a1 $sp 4 # argv 
[00400008] 24a60004  addiu $6, $5, 4          ; 185: addiu $a2 $a1 4 # envp 
[0040000c] 00041080  sll $2, $4, 2            ; 186: sll $v0 $a0 2 
[00400010] 00c23021  addu $6, $6, $2          ; 187: addu $a2 $a2 $v0 
[00400014] 0c000000  jal 0x00000000 [main]    ; 188: jal main 
[00400018] 00000000  nop                      ; 189: nop 
[0040001c] 3402000a  ori $2, $0, 10           ; 191: li $v0 10 
[00400020] 0000000c  syscall                  ; 192: syscall # syscall 10 (exit)
如您所见,它将
jal
发送到您的
main
标签,如果您带着
jr$ra
返回,它将为您执行退出系统调用。 因此,只要保留了
$ra
的原始值,
jr$ra
就可以了。但是,对于其他模拟器(PcSpim、Mars),可能需要自己执行退出系统调用。

QtSpim(对于Windows,至少版本为9.1.17)将以下代码放在
文本部分的开头:

[00400000] 8fa40000  lw $4, 0($29)            ; 183: lw $a0 0($sp) # argc 
[00400004] 27a50004  addiu $5, $29, 4         ; 184: addiu $a1 $sp 4 # argv 
[00400008] 24a60004  addiu $6, $5, 4          ; 185: addiu $a2 $a1 4 # envp 
[0040000c] 00041080  sll $2, $4, 2            ; 186: sll $v0 $a0 2 
[00400010] 00c23021  addu $6, $6, $2          ; 187: addu $a2 $a2 $v0 
[00400014] 0c000000  jal 0x00000000 [main]    ; 188: jal main 
[00400018] 00000000  nop                      ; 189: nop 
[0040001c] 3402000a  ori $2, $0, 10           ; 191: li $v0 10 
[00400020] 0000000c  syscall                  ; 192: syscall # syscall 10 (exit)
如您所见,它将
jal
发送到您的
main
标签,如果您带着
jr$ra
返回,它将为您执行退出系统调用。
因此,只要保留了
$ra
的原始值,
jr$ra
就可以了。但是,其他模拟器(PcSpim,Mars)可能需要自己执行退出系统调用。

如果您使用的是C运行时,
jr$ra
应该足够了,这是
main
的提示。我使用QtSpim来模拟mipsx86。如果您使用的是C运行时,
jr$ra
应该足够了,哪个
main
提示。我使用QtSpim模拟mipsx86。非常感谢Michael!非常感谢迈克尔!