3

私は、チケット販売に関するいくつかのものを計算する非常に基本的な MIPS プログラムに取り組んできました。すべての機能を実装しましたが、IF ステートメント (blt --> 未満の場合は分岐) を実行すると、いくつかのエラーが発生します。次のデータを一時レジスタに保存しています。

- $t0 = # of VIP tickets.
- $t1 = # of General Admission tickets.
- $t2 = # of Box Office tickets.
- $t4 = Average ticket sales.

値がそれに応じて保存され、条件がFALSEの場合はコードが機能することを確認しましたが、条件が満たされた場合は分岐し、分岐前にコードを出力します。ここに私のコードの一部があります:

  blt $t0, $t4, VIP_LESS  # if $t0 < $t4 then VIP
  b VIP_GREAT
  VIP_LESS:
    li $v0, 4
    la $a0, less_avg_vip
    syscall 
  VIP_GREAT:
    li $v0, 4
    la $a0, great_avg_vip
    syscall 
  blt $t1, $t4, GEN_LESS # if $t1 < $t4 then GEN
  b GEN_GREAT
  GEN_LESS:
    li $v0, 4
    la $a0, less_avg_general
    syscall
  GEN_GREAT:
    li $v0, 4
    la $a0, great_avg_general
    syscall 
  blt $t2, $t4, BOX_LESS  # if $t2 < $t4 then BOX_LESS
  b BOX_GREAT
  BOX_LESS:
    li $v0, 4
    la $a0, less_avg_box
    syscall 
  BOX_GREAT:
    li $v0, 4
    la $a0, great_avg_box
    syscall 
  li $v0, 4
  la $a0, endl
  syscall

なぜこれで問題が発生するのか、誰にもわかりますか? 私のプログラムの出力は次のようになります。

VIP: 1349 tickets
General: 5278 tickets
Box: 4367 tickets

Average: 3215 tickets

VIP: Less than average.
General: Greater than average.
General: Less than average.
Box: Greater than average.
Box: Less than average.

編集:作業コード。

 blt $t0, $t4, VIP_LESS  # if $t0 < $t4 then VIP
  li $v0, 4
  la $a0, great_avg_vip
  syscall
  j GENERAL_IF
  VIP_LESS:
    li $v0, 4
    la $a0, less_avg_vip
    syscall 
  GENERAL_IF: 
    blt $t1, $t4, GEN_LESS # if $t1 < $t4 then GEN
    li $v0, 4
    la $a0, great_avg_general
    syscall 
    j BOX_IF
    GEN_LESS:
      li $v0, 4
      la $a0, less_avg_general
      syscall
  BOX_IF:
    blt $t2, $t4, BOX_LESS  # if $t2 < $t4 then BOX_LESS
    li $v0, 4
    la $a0, great_avg_box
    syscall 
    j END_IF
    BOX_LESS:
      li $v0, 4
      la $a0, less_avg_box
      syscall 
  END_IF:
    li $v0, 4
    la $a0, endl
    syscall 
4

1 に答える 1

3

「より大きい」コードパスと「より小さい」コードパスの両方を実行しないように、いくつかの無条件分岐が必要です。

  blt $t0, $t4, VIP_LESS  # if $t0 < $t4 then VIP
  li $v0, 4
  la $a0, great_avg_vip
  syscall 
                <<< you need an unconditional branch here to VIP_GE
  VIP_LESS:
    li $v0, 4
    la $a0, less_avg_vip
    syscall 
    xor $a0, $a0, $a0
  VIP_GE:       <<< label here so that you can skip previous block
  ...

3 つの if/else ブロックごとにこれを行う必要があります。

于 2012-12-05T17:56:25.230 に答える