2012-03-29 82 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