我在C這樣的功能:裝配返回地址不工作
int func(int n0, int n){
if (n > 1){
int nFinal = func(n0, --n);
return (nFinal*nFinal) + n0;
}
return n0;
}
而且希望它在彙編程序。 我有這樣的代碼:
.data
.text
.globl func
func:
addi $29,$29, -4
sw $ra,0($29)
move $8,$4
move $9,$5
ble $9,1,fim
sub $9,$9,1
move $5,$9
jal func
move $4,$11
jal quadrado
add $11,$2,$8
j fim
quadrado:
mul $2,$4,$4
jr $31
fim:
lw $31,0($29)
move $2,$11
jr $31
如果參數傳遞在$ 4和$圖5分別是2和1,我可以看到,文程序到達ble
指令它按預期工作。它跳轉到fim
標籤,從堆棧中恢復返回地址並將返回值傳遞給我的main
函數。
問題是參數$ 5上的值未定義。它可以是任何給定的值。我相信我的程序存在的問題是,我的main
函數的返回地址丟失,程序無法返回到它。我相信文程序達到jal func
指令,其main
返回地址將其替換爲jal func
指令的返回地址。
我該如何解決這個問題? (不問代碼,但只是一些方向)
@MathewS謝謝。在我的'func'上添加'addi \t $ 29,$ 29,4'就在'j \t fim'之前,並且按照預期工作。不知道這是否是正確的方式,但它的工作原理應該如下:) – Favolas 2012-04-15 20:27:29
@Favolas:即使在添加該指令後,程序也不會在MARS中輸出正確的結果。 – blackcompe 2012-04-15 21:52:15
@blackcompe你是對的。忘了告訴我,把$ 9,1,fim' \t更改爲'ble $ 9,0,fim'。使用此代碼的Offtopic,你如何在MARS中傳遞參數? – Favolas 2012-04-15 22:36:52