Solved

PLEASE HELP: recursive factorial in assembly

Posted on 2003-12-11
5
3,905 Views
Last Modified: 2012-06-22
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

0
Comment
Question by:espadana
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
5 Comments
 
LVL 11

Expert Comment

by:dimitry
ID: 9924540
Recursion suppose that you will use stack for your parameters.
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
0
 
LVL 11

Expert Comment

by:dimitry
ID: 9924624
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



0
 
LVL 3

Accepted Solution

by:
terageek earned 250 total points
ID: 9925256
You can pass return values back on the stack.

; This block is wrong.  
; You need to reserve space on the stack for making a recursive call,
; make the recursive call passing in n-1,
; multiply n by the result from the recursive call,
; and return the result back on the stack
; This code doesn't do that.
     mov bx,result
     push cx
     mul bx
     mov result,ax
     call fact

...    

end:     pop cx   ; you never pushed cx  
     pop dx
     pop bx
     pop ax
     sub sp,bp ; I have no clue what this does except mess up your stack pointer
     pop bp
     ret 2        ; You reserved 4 bytes on the stack for the call, 2 for param and 2 for result
0
 

Author Comment

by:espadana
ID: 10140276
Thanx
0

Featured Post

On Demand Webinar: Networking for the Cloud Era

Did you know SD-WANs can improve network connectivity? Check out this webinar to learn how an SD-WAN simplified, one-click tool can help you migrate and manage data in the cloud.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In part one, we reviewed the prerequisites required for installing SQL Server vNext. In this part we will explore how to install Microsoft's SQL Server on Ubuntu 16.04.
Sometimes clients can lose connectivity with the Lotus Notes Domino Server, but there's not always an obvious answer as to why it happens.   Read this article to follow one of the first experiences I had with Lotus Notes on a client's machine, my…
In this video, viewers are given an introduction to using the Windows 10 Snipping Tool, how to quickly locate it when it's needed and also how make it always available with a single click of a mouse button, by pinning it to the Desktop Task Bar. Int…
Monitoring a network: how to monitor network services and why? Michael Kulchisky, MCSE, MCSA, MCP, VTSP, VSP, CCSP outlines the philosophy behind service monitoring and why a handshake validation is critical in network monitoring. Software utilized …

687 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question