Ackermann Function

Go4Expert Member
23Sep2009,08:55   #1
final_semester's Avatar
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
Invasive contributor
24Sep2009,02:15   #2
nimesh's Avatar
go easy on the fonts buddy
Mentor
24Sep2009,03:47   #3
xpi0t0s's Avatar
We won't write it for you. How far have you got and where are you stuck?
Go4Expert Member
7Oct2009,09:53   #4
final_semester's Avatar
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
Go4Expert Member
7Oct2009,10:22   #5
final_semester's Avatar
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
Go4Expert Member
7Oct2009,11:44   #6
final_semester's Avatar
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
Mentor
7Oct2009,12:13   #7
xpi0t0s's Avatar
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".
Go4Expert Member
7Oct2009,19:29   #8
final_semester's Avatar
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
Mentor
7Oct2009,20:06   #9
xpi0t0s's Avatar
Well, how do we know if we don't know what the error is.

OK, let me say it straight. TELL US THE ERROR.
Go4Expert Member
7Oct2009,20:23   #10
final_semester's Avatar
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