我的MIPS程序是否正确?

时间:2009-04-18 01:27:30

标签: assembly mips

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

答案 0 :(得分:10)

我刚刚完成了我的MIPs装配课程,我有一个建议:不要使用PC Spim!

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

它是一个.jar文件,因此您可以在Windows和Linux上运行它。 alt text
[Mars Mips Emulator]

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

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

添加立即值时,您应使用“addi”或“addu”说明,而不是“添加”。你还说你想把结果放在寄存器$ r12中,但这不是一个有效的MIPs寄存器。查看MIPs维基百科链接,查看所有注册表的列表: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 :(得分:0)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分: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#