我知道程序会加载.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 $t3, $t3, -1
bnez $t3, fori
fin:
li $v0, 10
syscall
答案 0 :(得分:1)
看起来它是根据空间中的第一项添加的,因为它不会从循环内部访问数组。
因此,例如,如果你输入一个代表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
答案 1 :(得分:0)
免责声明:我没有任何直接的MIPS经验,我只是使用过多种汇编语言。
那说,我认为程序所做的是通过重复加法来计算'arg'的平方 - 在这种情况下5 * 5 = 25.但是,$ t1中的结果似乎没有存储在任何地方,而是该程序刚刚退出。