0

b我不太确定为什么它没有读取输入并决定重复或结束..这是我的代码,不胜感激!

.data  
again:
    .asciiz "Again (y or n)? "  
answer:
    .asciiz " "  

.text  
.globl main  
  main:
    li  $v0, 4  
    la  $a0, again  
    syscall  

    la  $s4, answer
    jal get 

    beq $v0, 'y', main
    beq $v0, 'Y', main

    li  $v0, 10 
    syscall 

  get:  
    li  $v0, 12  
    li      $a1, 2  
    syscall  
    jr  $ra
4

1 回答 1

2

考虑一下:

.data
again:
    .asciiz "Again (y or n)? "  
answer:
    .space 256

.text  
.globl main  
  main:
    li  $v0, 4  
    la  $a0, again  
    syscall  

    la  $a0, answer
    li  $a1, 3
    li  $v0, 8
    syscall

    lb  $t4, 0($a0)

    beq $t4, 'y', main
    beq $t4, 'Y', main

    li  $v0, 10 
    syscall 

首先,在您的代码中,您似乎误解了系统调用的工作方式以及它们应该如何与函数交互(此处的一些文档)。因为您的 get 例程基本上只是称为系统调用,所以我将其作为添加例程的基本程序可能会增加而不是降低复杂性。

接下来,您的代码的主要问题是对输入缓冲工作方式的误解。在您的代码中,您为 分配了 2 个字节的空间answer,然后使用系统调用一次获取不超过 2 个字节的空间。这不适用于stdin,因为在大多数系统上,stdin它是行缓冲的,这意味着用户必须按下ENTER才能刷新流。这意味着当用户键入时'y',asyscall实际上会返回"y\n\0"

为了解决这个问题,我将其扩展syscall为读取 3 个字符并回答最多存储 256 个字符。将其扩展为对任何大小都安全是留给读者的练习题。

于 2013-11-27T21:36:51.477 回答