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
答案 0 :(得分:3)
考虑一下:
.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
首先,在您的代码中,您似乎误解了系统调用的工作方式以及它们应该如何与函数进行交互(some docs here)。因为你的get例程基本上只是调用了一个系统调用,所以我把它当作为基本可能增加复杂性而不是减少它的东西添加一个例程。
接下来,您的代码的主要问题是对输入缓冲的工作方式的误解。在您的代码中,您为answer
分配了2个字节的空间,然后使用syscalls一次获得不超过2个字节的空间。这对stdin
不起作用,因为在大多数系统上,stdin
是行缓冲的,这意味着用户必须按ENTER
才能刷新流。这意味着当用户输入'y'
时,syscall
实际上会返回"y\n\0"
。
为了解决这个问题,我将syscall
扩展为3个字符并回答最多可存储256个字符。扩展此字符以保证任何大小都是安全的,这是读者留下的优点。