2

15 のテスト スコアのリストを調べる MiPS プログラムを作成しています。そしてターミナルから入力していきます。合格基準は 50​​ 点です。端末への出力には、各カテゴリの得点と、合格者と不合格者の数が含まれます。入力プロンプトと出力ステートメントを使用する必要があります。助けが必要です。どうすればよいかアドバイスが必要です。

main:
 li $t1,15         #load 15 into $t1

 la $a1,array      #load a pointer to array into $a1

私はループを持っています:

addi $t1,$t1,-1

li $v0,4

la $a0,prompt

syscall
4

2 に答える 2

2

私はそれを手放したくないので、いくつかのガイドラインを投げます。

Assemblers, linkers and the Spim simulatorを読む必要があります。とても助かります。

それで、ここに行きます。

15 ワードの配列を 2 つ作成します。

 .data
 fail_vector: .word  -1,-1,-1 ...    #15 invalid words 
 passed_vector: .word  -1,-1,-1 ...  #15 invalid words 

ループ制御変数をいくつかのレジスターにロードします。

 li $t1,15
 beq $t1,$zero,END
 addiu $t1,$t1,-1

このループ内で値を読み取ります

 syscall...     #SYS_READ

次に、この値を読み取り (レジスタ t4 にあると仮定します)、それを失敗ベクトルに格納するか、パス ベクトルに格納するかを決定します。

     addiu t4,t4,-50     #subtract 50 from input value. 
     blez  t4,FAILED     #If its lower than 0, then read value is lower than 50 ->FAIL
PASSED:
     #STORE VALUE INTO passed_vector

FAILED:
     #STORE VALUE INTO failed_vector

15 個の値すべてが完成したら、ベクトルを出力します。これはちょっと難しいです。プログラムを使用する前に、両方のベクトルに -1 などの無効な値を入力する必要があります。そのため、ベクトルを画面に出力している場合、この無効な値のいずれかが見つかったら停止する必要があります。そして、あなたがそれに取り組んでいる間、合格/不合格の数を示すカウンターを保管してください.

疑似コードで

for both arrays
   for (i in (0,15) and array[i] not -1)
        print array[i]
        add 1 to scores count //to count passed - failed test scores.

組み立て(空欄を埋める)

END:
     li $t4,15
     li $t1,0
     beq $t1,$t4,EXIT   #condition. While ( i < 15) kind of thing.
     addiu $t1,$t1,-1

     #print out vectors and keep count on other registers
     #then print them out.

     syscall... #SYS_WRITE

EXIT: #exit syscall here.

もう 1 つのトリッキーな問題は、これらのベクトルのインデックス付けです。これらは単語の配列であるため、ループ制御変数 (C の従来の i 変数) に 4 (32 ビット ワードと仮定) を掛けて、ベクトルにインデックスを付ける必要があります。それらがバイト配列である場合、乗算は必要ありません。そして、それらが短い配列である場合...(まあ、あなたは私の主張を理解します)

例えば:

passed_vector[i] #(C style sintax)

変数 i をレジスタ $t1 に格納すると、次のようになります。

  sll $t2,$t1,2             #i * sizeof(word)
  la  $a0,passed_vector     #$a0 points to passed_vector
  add $a0,$a0,$t2           #$a0 now points to passed_vector + i   

これで、passed_vector[i] にロード/ストアできるようになりました

  sw  $t3,0($a0)            #0($a0) is passed_vector[0]
  lw  $t3,0($a0)

この種の問題 (つまり、アセンブリで記述する) を解決する 1 つの方法は、プログラムを C (またはその他の既知の言語) で記述し、それを命令ごとにアセンブリに変換することです。

于 2009-04-29T22:37:02.287 に答える