在MIPS中循环

时间:2012-03-29 05:23:47

标签: mips

我试图制作一个基本的while循环示例im preperation for my next assignment并且我陷入无限循环。 $ t3​​永远不会达到3,或者它没有检测到它在3.我在这里做错了什么?谢谢!

.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   

2 个答案:

答案 0 :(得分:1)

问题在于:

beq $3,$t3,Exit

$3注册;它是不是值3.它指的是$3寄存器的内容,实际上是$v1,它的值为0,因为你没有放任何东西在那里。因此,不是比较值3,而是比较为0.(它实际上不是一个无限循环,因为$t3最终会回绕到0,但你明白了。)

MIPS缺少与立即数进行比较的指令,因此您需要先将值3加载到寄存器中。

在循环之前添加此行,因为您只需要加载一次值:

li $t4, 3

并将您的比较改为:

beq $t4, $t3, Exit

这会让你走出循环。然后你的程序将打印msg1三次并退出,我怀疑这不是你想要的,但希望这可以让你继续完成。

答案 1 :(得分:0)

如果要根据此比较将寄存器与立即数和分支进行比较,则必须使用两条指令slti和任何分支指令。 如果$ s的内容小于立即数,则slti $t, $s, imm指令将寄存器$ t设置为1,否则为零。

因此,当寄存器$ 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