【问题标题】:Is my MIPS program correct?我的 MIPS 程序是否正确?
【发布时间】:2009-04-18 01:27:29
【问题描述】:

编写一个 MIPS 程序,生成从 1 到 100 的所有偶数并将其相加。

  • 它必须至少有一个循环
  • 它应该将总和存储在寄存器 R12 中

这就是我写的:
main:
    li      $t0, 0               # clear register $t0 to zero
    li      $t4, 0               # clear register $t4 to zero
loop:
    add     $t0, $t0, 2          # generating even numbers in register $t0
    add     $t4, $t4, $t0        #  compute the sume
    bne     $t0, 100, loop       # if t0 reached 100 then go to loop.
    b endloop                    # branch to endloop
endloop:
    li      $v0, 10              # terminate program run and
    syscall                      # Exit 

这是正确的吗?

【问题讨论】:

  • 你能运行它吗?你有 MIPS 板或模拟器之类的吗?
  • 我使用 gxemul 来模拟运行 NETBSD 的 mips 架构 en.wikipedia.org/wiki/GXemul
  • 另一个模拟器是qemu,它模拟了包括MIPS在内的一堆架构和系统。
  • 谢谢...但是你能帮我一个忙吗,我用 spim 运行它,但一切看起来都不错,可以帮助我用任何模拟器运行它,看看我是否正确...谢谢
  • @csunwold,我认为寄存器 R12 是通用寄存器编号 12,恰好是 $t4

标签: assembly mips


【解决方案1】:

我刚刚完成了我的 MIP 汇编课程,我有一个建议给你:不要使用 PC Spim!

我使用过 PC Spim、Mars 和 Qemu,最适合一般课程作业的是 Mars (Mips Assembler and Runtime Simulator)。编辑器很不错,它的崩溃很多少,它允许您轻松调试和设置断点。它是免费的、开源的,由密苏里州立大学创建。

它以 .jar 文件的形式提供,因此您可以在 Windows 和 Linux 上运行它。
[Mars Mips Emulator]

在一般情况下,判断一个数字是偶数还是奇数的简单方法是将数字与(按位)1 与数字相乘,如果结果为 0,则数字为偶数。

但是,由于我们想要一个系列中的所有偶数,我们可以像您在发布的代码中所做的那样循环并将我们的数字增加 2。

添加立即数时,您应该使用“addi”或“addu”指令,而不是“add”。您还说您想将结果放入寄存器 $r12 但这不是有效的 MIP 寄存器。查看 MIP 维基百科链接以查看所有寄存器的列表:MIPS - Register Usage.

我已修改您的程序以使其正常工作。它将最终结果存储在 $t1 中,然后打印最终结果。

                .text
                .globl main
main:
    li      $t0, 0               # $t0 = loop counter
    li      $t1, 0               # $t1 = sum of even numbers
loop:
    addi    $t0, $t0, 2          # generating even numbers in register $t0
    add     $t1, $t1, $t0        #  compute the sum
    bne     $t0, 100, loop       # if t0 reached 100 then go to loop.

    li      $v0, 4
    la      $a0, result
    syscall                      # print out "Sum = "

    li      $v0, 1
    move    $a0, $t1
    syscall                      # print out actual sum


exit:
    li      $v0, 10              # terminate program run and
    syscall                      # Exit 


                .data
result:         .asciiz "Sum = "

在火星上运行后,我得到以下信息:

总和 = 2550
-- 程序运行完毕 --

【讨论】:

  • 但假设是从 1 到 100 的偶数相加吗?
  • @Simucal,我认为它们的意思不是 R12 的 $r12,而是通用寄存器 12,即 $t4。
【解决方案2】:

您应该能够自己使用 SPIM。 “b endloop”这一行也是不必要的,因为如果你不分支回到循环的顶部,程序将“落入”endloop。

在此处下载 SPIM:
http://pages.cs.wisc.edu/~larus/spim.html

【讨论】:

    【解决方案3】:

    试试this 模拟器。当我学习计算机组织时,我使用了 SPIM,它相当容易使用。您还可以在线找到有关 MIPS 的教程。请记住,Google 是您的朋友。

    【讨论】:

    • 请你帮我跑一下看看我是否正确......谢谢
    • 但假设是从 1 到 100 的偶数相加吗?
    【解决方案4】:

    代码看起来不错。正如 cunwold 所说,“b endloop”是不必要的,因为分支目标是第一个分支(bne ...)失败。 不过有一个错误。

    您以两种不同的方式使用相同的指令(添加)。 指令

    add $t0,$t0,2
    

    应该是

    addiu $t0,$t0,2
    

    由于您要添加一个中间体,而不是两个寄存器。

    所以,就这样吧。我将系统调用部分替换为对函数的实际返回(在 $v0 寄存器中返回值)。

    希望对你有帮助。

    文件 main.c

    #include <stdio.h>
    
    extern int addEven();
    
    int main(){
    
    
            printf("%d\n",addEven());
            return 0;
    }
    

    文件 addEven.S(程序集)

    #include <mips/regdef.h>
    
      /*
       * int addEven();
       * Adds even numbers between 0 and 100.
       * 0 + 2 + 4 + 6 +....+100 = 2550
       */
    
            .text
            .align 2
            .globl addEven
    
    addEven:
            li      t0,0            # clear register $t0 to zero
            li      t4,0            # clear register $t4 to zero
    loop:
            addiu   t0, t0,2          # generating even numbers in register $t0
            add     t4, t4,t0          #  compute the sume (R12 = t4)
            bne     t0, 100, loop      # if t0 reached 100 then go to loop.
    endloop:
            move    v0,t4
            jr      ra
    

    我编译并链接了这些文件。就这样吧。

    root@:~/stackoverflow# gcc -c -g addEven.S
    root@:~/stackoverflow# gcc -c -g main.c
    root@:~/stackoverflow# gcc main.o addEven.o -o prog 
    root@:~/stackoverflow# ./prog 
    2550
    root@:~/stackoverflow#
    

    【讨论】:

    • 您是否经常以这种方式使用 MIP?如果是这样,你用它做什么?我很好奇,因为我喜欢 MIP,但不知道如何经常使用它。
    • 我经常使用它,但仅用于教育目的。我正在尝试让一些板子更进一步。
    猜你喜欢
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 2010-11-29
    • 2022-11-24
    • 1970-01-01
    相关资源
    最近更新 更多