【问题标题】:Mips Looping If-Else StatementsMips 循环 If-Else 语句
【发布时间】:2016-02-22 03:48:36
【问题描述】:

我正在尝试创建一个 mips 程序,该程序将执行 3 个 if/if-else 语句并将它们循环 10 次。我很难理解如何制作一个标签来循环其他标签,或者是否有另一种方法。我的代码如下:

.data

    a: .word 10
    b: .word 16
    c: .word 16
    d: .word 6

    message: .asciiz "\nThe numbers are equal\n"
    message2: .asciiz "\nThe numbers are not equal\n"

.text

    lw $s0, a
    lw $s1, b
    lw $s2, c
    lw $s3, d

main:

    beq $s0, $s1, firstEqualsStatement
    beq $s0, $s1, secondEqualsStatement
    j NEXT
    bne $s0, $s1, doNotEqualStatement
    j NEXT2


firstEqualsStatement: #if (a == b)
                      #{  Z = a+a;
                      #   Z = Z + b + c + d;
                      #}

    # print message if the numbers are equal
    li $v0, 4
    la $a0, message
    syscall

    li $v0, 1
    add $a0, $s0, $s0
    add $a0, $a0, $s1
    add $a0, $a0, $s2
    add $a0, $a0, $s3
    syscall


secondEqualsStatement: # if (a == b)
                       #{
                       #     Z = a;
                       #}
                       # else
                       #{
                       # Z = (a+b+c) – d;
                       #}

    # print message if the numbers are equal
    li $v0, 4
    la $a0, message
    syscall

    li $v0, 1
    add $a0, $s0, $zero
    syscall

NEXT:   
    li $v0, 4
    la $a0, message2
    syscall

    li $v0, 1
    add $a0, $s0, $s1
    add $a0, $a0, $s2
    sub $a0, $a0, $s3
    syscall

doNotEqualStatement: # if (a != b) {
                     #     Z = a;
                     #}
                     # else {
                     #     Z = (a+b+c) – d;
                     #}

    # print message if the numbers are not equal
    li $v0, 4
    la $a0, message2
    syscall

    li $v0, 1
    add $a0, $s0, $zero

NEXT2:

    li $v0, 1
    add $a0, $s0, $s1
    add $a0, $a0, $s2
    sub $a0, $a0, $s3
    syscall

【问题讨论】:

  • 我不清楚你想做什么。

标签: mips mars-simulator risc


【解决方案1】:

我希望这些提示对您有所帮助,因为 MARS 只是 SPIM 的更新版本(我的教授正在让我们在课堂上学习)。

在开始时创建一个寄存器来保存计数和最大循环

li $t0, 0 #init count to 0
li $t1, 7 #loop set to 7

将主循环包含在一个循环标签中,然后在j NEXT2之后,包括一个计数增量和b main和beq

add $t0, $t0, 1     #count++
beq $t1, $t0, exit  #if(t0==t1) break
b loop

其他说明

  • 在最后退出代码前添加“退出”标签
  • 在主代码中添加“下一个”标签,以便 if 语句在完成执行后跳转回来,并在 if 语句中包含分支语句
  • 也许改变你的数据标签? (在 QTSimp 中编译时出现语法错误,因为 'b' 表示分支?)
  • 您想在添加 ($a0) 时打印每个数字,还是只打印最终结果(添加到 $t2 直到最后一个添加/子项)?
  • 循环似乎是多余的,因为您没有更新寄存器变量 ($s0-$s3)

【讨论】: