编写一个MIPS程序,生成并累加从1到100的所有偶数。
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
这是对的吗?
答案 0 :(得分:10)
我刚刚完成了我的MIPs装配课程,我有一个建议:不要使用PC Spim!
我使用过PC Spim,Mars和Qemu,一般课程的最佳工作是Mars (Mips Assembler and Runtime Simulator)。编辑器很好,它很少崩溃,它允许您轻松调试和设置断点。它是免费的,开源的,由密苏里州立大学创建。
它是一个.jar文件,因此您可以在Windows和Linux上运行它。
[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#