1
我一直在負責編寫功能1內執行下列數學運算遞歸MIPS彙編程序:如何在MIPS彙編中執行遞歸操作?
(-3)*function1(n-2) + 7*function1(n-3) + 15
該方案是在C建模:
// The function1 is a recursive procedure defined by:
// function1(n) = 1 if n <= 2
// = (-3)*function1(n-2) + 7*function1(n-3) + 15 otherwise.
int function1(int n)
{
if (n <= 2)
{
return 1;
}
else
{
int comp = (-3)*function1(n-2) + 7*function1(n-3) + 15;
return comp;
}
}
// The main calls function1 by entering an integer given by a user.
void main()
1 of 2{
int ans, n;
printf("Enter an integer:\n");
// read an integer from user and store it in "n"
scanf("%d", &n);
ans = function1(n);
// print out the solution computed by function 1
printf("The solution is: %d\n", ans);
return;
}
我寫的代碼,它編譯和執行得很好,但給我不正確的值:
.data
mes1: .asciiz "\nEnter an integer: "
mes2: .asciiz "The solutinon is: "
.text
.globl main
main:
#Display message
la $a0, mes1
li $v0, 4
syscall
#Retrieve Value
li $v0, 5
syscall
#Store value into $a0 and jump to function1
move $a0, $v0
jal function1
#Store return value to $t0
move $t0, $v0
#Display solution
la $a0, mes2
li $v0, 4
syscall
move $a0, $t0
li $v0, 1
syscall
#End
li $v0, 10
syscall
function1:
#Store return address
addi $sp, $sp, -4
sw $ra, 0($sp)
#Store $a0 to stack
addi $sp, $sp, -4
sw $a0, 0($sp)
#If($a0<3):$t0=1:$t0=0
slti $t0, $a0, 3
#if($t0=0):math
beq $t0, $zero, math
addi $v0, $zero, 1
#Retrieve from stack
lw $a0, 0($sp)
addi $sp, $sp, 4
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra
math:
addi $a0, $a0, -2
jal function1
mul $s0 $v0, -3
addi $a0, $a0, -3
jal function1
mul $s1, $v0, 7
add $s1, $s0, $s1
addi $v0, $s1, 15
#Retrieve from stack
lw $a0, 0($sp)
addi $sp, $sp, 4
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra
當我輸入6,它應該輸出91.目前,我t的輸出44.也許更令人不安,每當我輸入任何值時,輸出數字總是可以被4整除。對於我的生活,我無法弄清楚什麼是錯誤的。任何人都可以建議嗎?
CNC中
我考慮到了@關於保護$ A0托馬斯巴丹評論。我嘗試過:
math:
#Store $a0 to stack
addi $sp, $sp, -4
sw $a0, 0($sp)
addi $a0, $a0, -2
jal function1
mul $s0, $v0, -3
#Retrieve from stack
lw $a0, 0($sp)
addi $sp, $sp, 4
addi $a0, $a0, -3
jal function1
mul $s1, $v0, 7
add $s1, $s0, $s1
addi $v0, $s1, 15
#Retrieve from stack
lw $a0, 0($sp)
addi $sp, $sp, 4
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra
但它仍然返回不正確的值,儘管接近正確的數字。
我已更新我的代碼。在addi $ v0中,$ zero,4行應該是1而不是4.關於你的第二條評論,我相信我應該把$ a0遞減2,直到function1返回1.關於你的第三條評論,我已經完成了mflo,並使用了mul。我也使用了不同的寄存器,所以我不覆蓋它們。關於評論4,我再一次認爲這是由堆棧處理的,必要的與評論2相似? – rphello101
輸入6現在輸入-35 – rphello101
例如,如果n = 5,則必須調用您的函數爲:'(-3)* function1(3)+ 7 * function1(2)+ 15'。在你的代碼中,你用$ a0 = 3調用第一個函數1,但在第二次調用中,你的$ a0 = 3 - 3,即0 – Amadeus