簡體   English   中英

簡單的是/否循環重復/結束-MIPS組裝(MARS)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM