Ackermann Function

final_semester's Avatar
Go4Expert Member
Can anyone help me in writing Ackermann Function function in assembly language. I'm using MIPS and the function needs to be Recursive.

h**p://img41.imageshack.us/img41/9972/akermannfunction.jpg
0
nimesh's Avatar, Join Date: Apr 2009
Invasive contributor
go easy on the fonts buddy
0
xpi0t0s's Avatar, Join Date: Aug 2004
Mentor
We won't write it for you. How far have you got and where are you stuck?
0
final_semester's Avatar
Go4Expert Member
here guys I was able to write the C program .. but m having trouble writing the MIPS version of it... I'm having difficulty using the stack pointer and what not...

this is what I have so far
C code
Code:
#include<stdio.h>
#include<conio.h>

int AckFun(int,int);

void main()
{
    int result,m,n;

    clrscr();
    printf("Enter the positive integer values of m and n : ");
    scanf("%d %d",&m,&n);
    
    result=AckFun(m,n);

    printf("\nThe value of A(%d,%d) = %d",m,n,result);
    getch();
}

int AckFun(int m,int n)
{
   int send;

   if(m==0)
   {
      if(n==0)
	 send=1;
      else
	 send=n+1;
   }
   else if(n==0)
      send=AckFun(m-1,1);
   else
      send=AckFun(m-1,AckFun(m,n-1));
   return=send;
}
MIPS code
Code:
main: 
	li $so, 3	# m = s0 = a0
	li $s1, 3	# n = s1 = a1
		
	add $a0, $s0, 0
	add $a1, $s1, 0
	jal ackermann		

	move $a0, $v0
	li $v0, 1
	syscall

	li	$v0, 10
	syscall

ackermann:

	addi $sp, $sp, -8
	sw $s0, 4($sp)
	sw $ra, 0($sp)

case_one: bne $a0, 0, case_two
0
final_semester's Avatar
Go4Expert Member
this is how far I have reached

Code:
main: 
	li $a0, 3	# m = a0
	li $a1, 3	# n = a1
		
	jal ackermann		

	move $a0, $v0
	li $v0, 1
	syscall

	li	$v0, 10
	syscall

ackermann:
	
	addi $sp, $sp, -8
	sw $ra, 4($sp)
	sw $a1,	0($sp)
	

	bne $a0, 0, other
	add $v0, $a0, 1

	lw $ra, 4($sp)
	addi $sp, $sp, 8
	
	jr $ra

other:

	bne $a1, 0, other_two
	addi $a0, $a0, -1
	jal ackermann

other_two:
		
	addi $a1, $a1, -1
	jal ackermann

	addi $a1, $v0, 0
	addi $a0, $a0, -1 
	
	jal ackermann
0
final_semester's Avatar
Go4Expert Member
k..now m stuck here

Code:
main: 
	li $a0, 3	# m = 3
	li $a1, 3	# n = 3
		
	jal ackermann		

	move $a0, $v0
	li $v0, 1
	syscall

	li	$v0, 10
	syscall

ackermann:
	
	addi $sp, $sp, -12		# creating space on the stack (3 columns)
	sw $a0, 4($sp)			# saving origional m
	sw $a1, 8($sp)			# saving origional n
	sw $ra, 0($sp)			# saving origional caller return address           ERROR ON THIS LINE
	
case_one:					# m = 0
	
	bne $a0, 0, case_two
	add $v0, $a1, 1
	
	j exit


case_two:					# n = 0

	bne $a1, 0, case_three
	addi $a0, $a0, -1
	li $a1, 1

	jal case_one


case_three:					 
		
	addi $a1, $a1, -1
	jal ackermann

	addi $a1, $v0, 0
	addi $a0, $a0, -1 
	
	jal case_one

exit:

	lw $ra, 0($sp)
	addi $sp, $sp, 12	
	jr $ra
0
xpi0t0s's Avatar, Join Date: Aug 2004
Mentor
Well, if you're in your final semester, you should already know that the exact error message is rather essential in helping identifying the cause of the problem. So why not tell us what the error message is instead of just saying "error on this line".
0
final_semester's Avatar
Go4Expert Member
my expertise is not in programming but in analog circuit designing, DSP etc... I dont want the solution, just a better explanation why's there a error on that line
0
xpi0t0s's Avatar, Join Date: Aug 2004
Mentor
Well, how do we know if we don't know what the error is.

OK, let me say it straight. TELL US THE ERROR.
0
final_semester's Avatar
Go4Expert Member
main:
li $a0, 3 # m = 3
li $a1, 3 # n = 3

jal ackermann

move $a0, $v0
li $v0, 1
syscall

li $v0, 10
syscall

ackermann:

addi $sp, $sp, -12 # creating space on the stack (3 columns)
sw $a0, 4($sp) # saving origional m
sw $a1, 8($sp) # saving origional n
sw $ra, 0($sp) # saving origional caller return address ERROR HERE

case_one: # m = 0

bne $a0, 0, case_two
add $v0, $a1, 1

j exit


case_two: # n = 0

bne $a1, 0, case_three
addi $a0, $a0, -1
li $a1, 1

jal case_one


case_three:

addi $a1, $a1, -1
jal ackermann

addi $a1, $v0, 0
addi $a0, $a0, -1

jal case_one

exit:

lw $ra, 0($sp)
addi $sp, $sp, 12
jr $ra