[英]Simple yes/no loop to repeat/end - MIPS assembly (MARS)
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
考慮一下:
.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例程基本上只稱為syscall,所以我把它作為添加例程的原因排除在外,而此例程可能會增加而不是降低復雜性。
接下來,代碼的主要問題是對輸入緩沖工作方式的誤解。 在您的代碼中,您正好為answer
分配了2個字節的空間,然后使用syscalls一次獲取不超過2個字節。 這對於stdin
無效,因為在大多數系統上, stdin
是行緩沖的,這意味着用戶必須按ENTER
才能刷新流。 這意味着,當用戶鍵入'y'
, syscall
實際上返回"y\\n\\0"
。
為了解決這個問題,我將syscall
擴展為讀取3個字符並回答以存儲多達256個字符。將其擴展為對任何大小都安全的做法是使閱讀器擁有了一定的特權。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.