2012-03-29 38 views
1

我試圖做一個基本的while循環例如im preperation爲我的下一個任務和IM卡在一個無限循環。 $ t3​​永遠不會達到3,或者它不會檢測到它在3.我在這裏做錯了什麼?謝謝!while循環在MIPS

.data   #data segment 


msg1:.asciiz "please enter a number to convert to ASCI: " 
    nl:.asciiz "\n" 
msg2:.asciiz "done! " 



.text   # Code segment 
.globl main  # declare main to be global 
main: 

    la $a0,msg1  # $a0 := address of message 1 

    li $v0,4    # system call, type 4, print an string 
    syscall 

    li $t3,0 #initial value of $t3 


    li $v0,5 
    syscall #read an int 

loop: 

    la $a0,msg1  # $a0 := address of message 1 

    li $v0,4    # system call, type 4, print an string 
    syscall 


    addi $t3,$t3,1 

    beq $3,$t3,Exit # branch to the label Exit if $t3=3 

    j loop # branch unconditionally to loop ($t3 != 0) 

Exit: 
    li $v0,10  # System call, type 10, standard exit 
    syscall 

回答

1

的問題是在這裏:

beq $3,$t3,Exit 

$3寄存器;它是而不是的值3.它指的是$3寄存器的內容,它實際上是$v1,它的值爲0,因爲您沒有在其中放入任何內容。因此,而不是比較3的值,你比較爲0.(它實際上不是一個無限循環,因爲$t3最終將包裝爲0,但你明白了。)

MIPS缺少一個指令與立即比較,所以您需要先將值3加載到寄存器中。

循環之前加入這一行,因爲你只需要一次加載值:

li $t4, 3 

,改變你的比較是:

beq $t4, $t3, Exit 

這將讓你跳出循環。然後你的程序將打印msg1三次並退出,我懷疑這不是你想要的,但希望這可以讓你繼續完成。

+0

MIPS確實有指令與直接進行比較,看' slti'和'sltiu' – gusbro 2012-03-29 14:48:35

+0

有趣,不知道那一個。 – 2012-03-29 18:02:59

0

如果要根據此比較比較寄存器與立即數和分支,則必須使用兩條指令slti和任何分支指令。 如果$ s的內容小於直接值,則指令slti $t, $s, imm將把寄存器$ t設置爲1,否則爲0。

因此,當寄存器$ T3是等於3分支(假設是0,並在每次循環的增量開始),你應該做的

slti $a0, $t3, 3 # Sets $a0 to 1 if $t3 < 3, 0 otherwise 
    beq $a0, $0, loop # Jumps to 'loop' when $t3 < 0