I have to... Once the user has entered a valid number (0-20), the menu procedure should call a third procedure that causes the first N Fibonacci numbers to be displayed on the console. Each number should be displayed with a single space between them. This procedure will need to loop over the numbers from 0 to the user input number. The display procedure will call a fourth procedure to compute the Fibonacci number for each specific number in the loop. (This is the scary recursive procedure!)

The fourth procedure is to evaluate the Fibonacci number for an input value of N. This procedure must be recursive as described above. The input parameter must be passed to the routine on the stack before the procedure is called. The return value should be left on the stack as well. The calling procedure (which can be this procedure as well, remember it is recursive) will need to set up the stack and clean up after it is done.

This is what I have...but it hangs

file 1
Start:
           
         
           
            call        menu


file2
 enter       0,0
            pushad
            mov        ebx,0
            mov        eax,0
menu:           
            mov        eax,instruction
            call        print_string
            call        print_nl
            mov        eax,list_1
            call        print_string
            call        print_nl
            mov        eax,list_2
            call        print_string
            call        print_nl
            mov        eax,list_3
            call        print_string
            call        print_nl
            mov        eax,list_4
            call        print_string
            call        print_nl
Loop_1:
         
            call        get_kb
            cmp        al,49h
            je          menu_I
            cmp        al,69h
            je          menu_I
            cmp        al,4Eh
            je          menu_N
            cmp        al,6Eh
            je          menu_N
            cmp        al,46h
            je          menu_F
            cmp        al,66h
            je          menu_F
            cmp        al,58h
            je          menu_X
            cmp        al,78h
            je          menu_X
menu_X:
         
            jmp        exit
           

menu_I:
            mov        eax,inst_I
            call        print_string
            call        print_nl
            jmp        menu
menu_N:
            mov        eax,inst_N
            call        print_string
            call        print_nl
           
           
            call        read_int                ;get int from caller
           
            cmp        al,0h                    ; compare AL to 0
            jl          error2                  ; no match do second else

            cmp        al,14h                ;compare AL to 20
            jg          error2                  ;no match do second else
            mov        ,al
            mov        ebx,
            call        print_int
            call        print_nl
         
            jmp        menu
menu_F:
            ;N is in ebx
            cmp        ebx,0h
            jb          error
            cmp        ebx,14h                ;check to see if there is a number between 0-20 in ebx
            ja          error
            mov        eax,ebx
            call        print_int
            call        print_nl
            push        eax
            call        Fib_Driver
            pop        eax
            jmp        menu
            ;call recursive driver procedure
            ;
error:
            mov        eax,error_msg1
            call        print_string
            call        print_nl
            jmp        menu
           
error2:
            mov        eax,error_msg2
            call        print_string
            call        print_nl
            jmp        menu
exit:
            popad
            leave
            ret

file3


Fib_Driver: ;N is in eax
            enter      0,0
            push        ecx                ;save callers ecx
            mov        ecx,0              ;move 0 into ecx
           
L1:        cmp        ecx,eax            ;compare eax to 0(ecx)
            je          Finally            ;if eax is 0 jump to finally
           
Next: 
           
            call        math                ;call math
            call        print_int          ;print answer from math
            call        print_nl
            inc        ecx                ;increase ecx by 1
            jmp        L1                  ;jump to L1
               
           
Finally:
         
            pop        ecx
            leave
            ret
           
           


file 4
      
math:
            enter  0,0
            push    ebx            ; save caller's ebx
            push    ecx
            mov    ecx, eax    ; loop count
            mov    eax, 1      ; first value
            mov    ebx, 1      ; second value

loopie:

            call    print_int
            call    print_nl

            lea    edx, ; number = first + second
            mov    eax, ebx
            mov    ebx, edx

            loop    loopie

           
end:
            pop    ecx
            pop    ebx            ;clean up
            leave
            ret
Posted on 2008-07-16 17:53:03 by cannsyl
call    print_int
            call    print_nl

chances are they destroy the eax / ebx registers... so do something like

push eax
push ebx

call    print_int
call    print_nl

pop ebx
pop eax

you could have found that out by a bit of debugging...
Posted on 2008-07-17 01:51:25 by evlncrn8