5

编写一个 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 

这个对吗?

4

4 回答 4

10

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

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

它以 .jar 文件的形式提供,因此您可以在 Windows 和 Linux 上运行它。 替代文字
[火星米普斯模拟器]

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

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

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

我已修改您的程序以使其正常工作。它将最终结果存储在 $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 = "

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

Sum = 2550
-- 程序运行完毕 --

于 2009-04-18T02:11:54.630 回答
1

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

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

于 2009-04-18T01:53:04.020 回答
0

代码看起来不错。正如 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#
于 2009-04-18T02:16:54.883 回答
0

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

于 2009-04-18T01:40:14.347 回答