Assembly 我的MIPS程序正确吗?
编写一个MIPS程序,生成并累加从1到100的所有偶数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
- 它必须至少有一个循环
- 它应该将总和存储在寄存器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#