espadana
asked on
PLEASE HELP: recursive factorial in assembly
Hi, I am trying to convert the following into 8086 assembly.
#include <stdio.h>
int i;
int fact(n) /* ANSI C version: */
int n; /* int fact(int n) */
{
if (n == 1)
return 1;
else
return n * fact(n-1);
}
void main()
{
printf("input a number 1-9 : ");
scanf("%d",&i);
printf("factorial %d = %d\n",i,fact(i));
}
I have already done the parts that read a number from the keyboard and the result, so please ignore those parts of the code that concern these operations.
I have spend a lot of time, but I cannot implement recursion in the above code.
can you please help me. thanx in advance
below is the code i've done, but it doesnt give me results
.MODEL TINY ; Data and code fit in one 64K segment
.STACK ; allocate a stack
.CODE ; start of code segment
result equ [bp+6]
param equ [bp+4]
sub sp,2
push w[times]
call fact
jmp l0
fact: push bp
mov bp,sp
push ax
push bx
push dx
mov dx,param
cmp dx,1
je base
mov ax,param
mov cx,ax
dec cx
mov bx,result
push cx
mul bx
mov result,ax
call fact
base: mov dx,1
mov result,dx
jmp end
end: pop cx
pop dx
pop bx
pop ax
sub sp,bp
pop bp
ret 2
l0: mov ax,4c00h
int 21h ; return control to DOS with errorlevel 0
.data
n db ? ; uninitialised short n
k db ?
times dw 4
prompt db 'type a number from 1 to 9: $'
end
#include <stdio.h>
int i;
int fact(n) /* ANSI C version: */
int n; /* int fact(int n) */
{
if (n == 1)
return 1;
else
return n * fact(n-1);
}
void main()
{
printf("input a number 1-9 : ");
scanf("%d",&i);
printf("factorial %d = %d\n",i,fact(i));
}
I have already done the parts that read a number from the keyboard and the result, so please ignore those parts of the code that concern these operations.
I have spend a lot of time, but I cannot implement recursion in the above code.
can you please help me. thanx in advance
below is the code i've done, but it doesnt give me results
.MODEL TINY ; Data and code fit in one 64K segment
.STACK ; allocate a stack
.CODE ; start of code segment
result equ [bp+6]
param equ [bp+4]
sub sp,2
push w[times]
call fact
jmp l0
fact: push bp
mov bp,sp
push ax
push bx
push dx
mov dx,param
cmp dx,1
je base
mov ax,param
mov cx,ax
dec cx
mov bx,result
push cx
mul bx
mov result,ax
call fact
base: mov dx,1
mov result,dx
jmp end
end: pop cx
pop dx
pop bx
pop ax
sub sp,bp
pop bp
ret 2
l0: mov ax,4c00h
int 21h ; return control to DOS with errorlevel 0
.data
n db ? ; uninitialised short n
k db ?
times dw 4
prompt db 'type a number from 1 to 9: $'
end
Sorry, I didn't pay attention that you have "define" of param as [bp+4].
I think that your code has 2 problems:
1) You are trying to keep result in stack too... And it should be in AX...
2) This code is wrong:
mov result, ax
call fact
base:
mov dx,1 <--- Always set result to 1
mov result,dx
jmp end
I think that your code has 2 problems:
1) You are trying to keep result in stack too... And it should be in AX...
2) This code is wrong:
mov result, ax
call fact
base:
mov dx,1 <--- Always set result to 1
mov result,dx
jmp end
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thanx
They can not be global in the way you implemented them.
This should be correct code for your fact(n):
assume cs:_TEXT
_fact proc near
push bp
mov bp,sp
push si
mov si,word ptr [bp+4]
cmp si,1
jne short callFact
mov ax,1
pop si
pop bp
ret
callFact:
mov ax,si
dec ax
push ax
call near ptr _fact
add sp,2
imul si
pop si
pop bp
ret
_fact endp