我对代码进行了一些更改,但它仍在打印9位数字。不知道这是怎么回事。当我输入2 * 3时,它输出268501017。我很难找出如何从寄存器中获取结果并将其打印出来。
main:
#prompt 1
li $v0, 4 # Print the String at Label “Input”
la $a0, num1
syscall
li $v0, 5
syscall
move $a2, $v0
#prompt 2
li $v0, 4 # Print the String at Label “Input”
la $a0, num2
syscall
li $v0, 5 # Read integer from user
syscall
move $a1, $v0 # Pass integer to input argument register $a0
jal multiply
add $a1, $v0, $zero
li $v0, 1
syscall
li $v0, 10
syscall
multiply:
bne $a1, 0, recurse
move $v0, $a1
jr $ra
recurse:
sub $sp, $sp, 12
sw $ra, 0($sp)
sw $a0, 4($sp)
sw $a1, 8($sp)
addiu $a1, $a1, -1 #product(x, y-1)
jal multiply
lw $a1, 4($sp)
add $v0, $a2, $a1
lw $ra, 0($sp)
addi $sp, $sp, 12
jr $ra
答案 0 :(得分:0)
您正在打印内存地址,而不是计算结果。
这是由于重新使用$a0
,而该地址仍保留着num1
的地址。如果$a0
仅需要这两个操作数,则应仅将它们存储在$a1
和multiply
中。
此外,您的add指令不使用上一个递归调用的结果。而是使用两个参数寄存器。
最后,系统调用1在$a0
中打印数字,而不是$a1
所以:
move $a2, $v0
应该是move $a1, $v0
(第10行)move $a1, $v0
应该为move $a0, $v0
(第18行)add $a1, $v0, $zero
应该为add $a0, $v0, $zero
(第22行)add $v0, $a2, $a1
应该为add $v0, $v0, $a1
(第46行)