2012-12-05 80 views
1

我一直在研究一個非常基本的MIPS程序,它計算門票銷售的一些東西。我已經實現了所有的功能,但是當我執行IF語句時(blt - >如果小於),我遇到了一些錯誤。我已存儲以下數據到臨時寄存器:MIPS彙編分支如果不到

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

我已經檢查了值將相應地存儲,如果條件爲假,代碼的工作,但如果條件滿足,將分支,仍然打印代碼在分支之前。這裏是我的代碼的一部分:

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 
+0

您只需要一些額外的無條件分支(和標籤),以便您不會同時執行「大於或等於」和「小於」代碼路徑。 –

+0

嗨保羅,感謝您的快速回答!你是否在意詳細一點?我不明白你的意思。 –

+0

好的 - 我在下面的答案中進一步解釋了。 –

回答

2

你只需要一些無條件分支,讓你不執行這兩個「大於」和「小於」的代碼路徑,例如

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 
    ... 

您需要爲您的三個if/else塊中的每個塊都執行此操作。

+0

太棒了!我想你是什麼意思,現在它正在工作! –

+0

幹得好 - 請將回答標記爲已接受,以便將來對其他任何用戶提出質疑。 –