我试图制作一个基本的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
答案 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