Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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
Assembly 我的MIPS程序正确吗?_Assembly_Mips - Fatal编程技术网

Assembly 我的MIPS程序正确吗?

Assembly 我的MIPS程序正确吗?,assembly,mips,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 e

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

这是正确的吗?

试试emulator。当我学习计算机组织时,我使用了SPIM,它相当容易使用。您也可以在MIPS在线上找到教程。记住,谷歌是你的朋友。

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

在此处下载SPIM:

我刚完成MIPs组装课程,我有一个建议给你:不要使用PC Spim

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

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

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

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

添加即时值时,应使用“addi”或“addu”指令,而不是“add”。您还说过要将结果放入寄存器$r12,但这不是有效的MIPs寄存器。查看MIPs wikipedia链接以查看所有注册表的列表:

我已经修改了你的程序,使其正常工作。它将最终结果存储在$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
--程序运行完毕--


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

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

add $t0,$t0,2
应该是

addiu $t0,$t0,2
因为您要添加一个中间寄存器,而不是两个寄存器

好了,就这样。我将syscall部分替换为函数的实际返回(值在$v0寄存器中返回)

希望能有帮助

文件main.c

#include <stdio.h>

extern int addEven();

int main(){


        printf("%d\n",addEven());
        return 0;
}

你能跑吗?你有MIPS板或模拟器吗?我用gxemul来模拟运行NETBSD的MIPS体系结构另一个模拟器是qemu,它模拟包括MIPS在内的一系列体系结构和系统。谢谢…但你能帮我个忙吗,我用spim运行了它,但一切看起来都很好,可以帮助我运行任何模拟器,看看我是否得到了正确的。。。thanks@csunwold,我认为寄存器R12是通用寄存器编号12,哪一个正好是$t4,请你帮我运行一下,看看我的回答是否正确。谢谢,但它应该是从1到100的偶数相加吗?但是它应该是从1到100的偶数相加吗?@Simucal,我想它们不是指r12的$r12,而是指通用寄存器12,也就是$t4。你经常这样使用MIPs吗?如果是,你用它做什么?我很好奇,因为我喜欢MIPs,但不知道我会如何经常使用它。我经常使用它,但只是出于教育目的。我正试图让一些董事会把它超越一步。
#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#