【问题标题】:I/O System Call needs exitI/O 系统调用需要退出
【发布时间】:2017-04-03 12:20:49
【问题描述】:

如果我执行 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

【问题讨论】:

  • 如果您使用的是 C 运行时,jr $ra 就足够了,main 暗示了这一点。
  • 我用QtSpim模拟mipsx86。

标签: assembly mips system-calls qtspim


【解决方案1】:

QtSpim(Windows 至少为 9.1.17 版)将以下代码放在 text 部分的开头:

[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,它将为您执行退出系统调用。 所以jr $ra 没问题,只要你保留了$ra 的原始值。但是,其他模拟器(PcSpim、Mars)可能需要自己执行退出系统调用。

【讨论】:

  • 非常感谢迈克尔!
猜你喜欢
  • 2017-08-18
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
  • 2021-03-05
相关资源
最近更新 更多