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 

まず、あなたのコードでは、syscalls が機能する方法と、syscalls が関数とどのように相互作用するべきかを誤解しているようです (一部のドキュメントはこちら)。あなたの get ルーチンは基本的に syscall と呼ばれているだけなので、基本的なものはおそらく複雑さを軽減するのではなく、複雑さを追加するためのルーチンを追加するものとして取り上げました。

次に、あなたのコードの主な問題は、入力バッファリングの仕組みを誤解していたことです。あなたのコードでは、正確に 2 バイトのスペースを に割り当ててanswerから、syscalls を使用して一度に 2 バイトを超えないようにしています。これは では機能しませんstdin。ほとんどのシステムでstdinは がライン バッファリングされているためです。つまり、ユーザーENTERはストリームをフラッシュするために を押す必要があります。これは、ユーザーが を入力する'y'と、syscall実際には a が返されることを意味します"y\n\0"

これを修正するために、 を拡張しsyscallて 3 文字を読み取り、回答を最大 256 まで格納できるようにしました。これを拡張して、どのサイズでも安全であるようにすることは、リーダーに残されている問題です。

于 2013-11-27T21:36:51.477 に答える