Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MIPS中的while循环_Mips - Fatal编程技术网

MIPS中的while循环

MIPS中的while循环,mips,Mips,我试图做一个基本的while循环示例,为下一个作业做准备,但我陷入了一个无限循环$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

我试图做一个基本的while循环示例,为下一个作业做准备,但我陷入了一个无限循环$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   
问题在于:

beq $3,$t3,Exit
$3
是一个寄存器;它不是值3。它指的是
$3
寄存器的内容,实际上是
$v1
,它的值为0,因为您没有在其中放入任何内容。因此,与3的值进行比较的不是0,而是0。(实际上,这不是一个无限循环,因为
$t3
最终将环绕到0,但您知道了。)

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

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

li $t4, 3
并将您的比较更改为:

beq $t4, $t3, Exit
这会让你脱离循环。然后,您的程序将打印msg1三次并退出,我怀疑这不是您想要的,但希望这能让您继续完成。

问题在于:

beq $3,$t3,Exit
$3
是一个寄存器;它不是值3。它指的是
$3
寄存器的内容,实际上是
$v1
,它的值为0,因为您没有在其中放入任何内容。因此,与3的值进行比较的不是0,而是0。(实际上,这不是一个无限循环,因为
$t3
最终将环绕到0,但您知道了。)

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

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

li $t4, 3
并将您的比较更改为:

beq $t4, $t3, Exit

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

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

因此,当register$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
slti$a0,$t3,3#如果$t3<3,则将$a0设置为1,否则为0
beq$a0,$0,循环#在$t3<0时跳到“循环”

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

因此,当register$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
slti$a0,$t3,3#如果$t3<3,则将$a0设置为1,否则为0
beq$a0,$0,循环#在$t3<0时跳到“循环”

MIPS确实有与立即数比较的指令,请参见
slti
sltiu
有趣的,我不知道。MIPS确实有与立即数比较的指令,请参见
slti
sltiu
有趣的,我不知道那个。