这个MIPS程序做什么?
我知道程序加载了.word 5的地址,这是初始值,我对程序的实际操作感到困惑。是比较单词的堆叠还是添加这个MIPS程序做什么?,mips,Mips,我知道程序加载了.word 5的地址,这是初始值,我对程序的实际操作感到困惑。是比较单词的堆叠还是添加 .data arg: .word 5 .text .globl main main: la $t3, arg lw $t2, 0($t3) lw $t3, 0($t3) addi $t1, $zero, 0 beqz $t2, fin fori: add $t1, $t1, $t2 addi
.data
arg: .word 5
.text
.globl main
main:
la $t3, arg
lw $t2, 0($t3)
lw $t3, 0($t3)
addi $t1, $zero, 0
beqz $t2, fin
fori:
add $t1, $t1, $t2
addi $t3, $t3, -1
bnez $t3, fori
fin:
li $v0, 10
syscall
免责声明:我没有任何直接的MIPS经验,我只是熟悉一些汇编语言
这就是说,我认为程序所做的是通过重复加法计算‘arg’的平方——在本例中为5*5=25。但是,$t1中的结果似乎没有存储在任何地方,相反,程序只是退出。看起来它基于空间中的第一项进行加法,因为它没有从循环内部访问数组 因此,例如,如果您输入一个代表ascii值5的字符(而不是'5'本身iirc),您可能会看到如下内容:
int t2 = 5, t3 = 5, t1 = 0;
do {
t1 += t2;
t3 -= 1;
} while(t3 > 0);
有人已经回答了,但我将提供我所做的翻译:
.data
arg: .word 5
.text
.globl main
main:
la $t3, arg # load-address of arg into t3
lw $t2, 0($t3) # load-word from the address in t3 + 0 offset, like t3[0]
lw $t3, 0($t3) # same but to t3
addi $t1, $zero, 0 # initialize t1 to 0? weird they don't use li
beqz $t2, fin # if t2 is zero jump to fin:
fori:
add $t1, $t1, $t2 # t1 = t1 + t2
addi $t3, $t3, -1 # t3 -= 1
bnez $t3, fori # if(t3 != 0) goto fori
fin:
li $v0, 10 # load immediate 10 into v0, which is the syscall to terminate the program
syscall
美好的但是,我不认为程序执行的是与
return 10
等价的操作-据我所知,10
表示要执行的系统调用是“exit program”系统调用。可能$t1中的值被用作作为退出代码?Derp返回的值。是的,根据我查到的笔记终止程序。