.MODEL small
.STACK 100h
.DATA
Message1 DB 'Entre com o enezimo numero',13,10,'$'
Message2 DB 'Enezimo numero Fibonacci:',13,10,'$'
Message3 DB 'Nao e um digito valido',13,10,'$'
FibVetor DB 0,0,0,0,0,13,10,'$'
newline DB 13,10,'$'
var1 DB 1
Tam DB 5
.CODE
mov cx,@data
mov ds,cx ;set DS to point to the data segment
Pega_Numero_Verifica:
mov ah,9 ;DOS print string function
mov dx,OFFSET Message1 ;point to "Entre com o primeiro numero"
int 21h ;display "Hello, world"
mov ah,1 ; funcao 1 da int 21 h, pega caracter com eco.
int 21h ; caracter que eu peguei, vai em al
sub al,30h
jb NOT_DIGIT ; verificar se o primeiro caracter pego é um digito
cmp al,9 ; tenho que verificar se o caracter em al, está entre 0 e 9.
ja NOT_DIGIT ; senão é digito
mov [var1],al ; salvo caracter que eu peguei em al.
jmp FINALIZA1
NOT_DIGIT:
mov ah,9 ;DOS print string function
mov dx,OFFSET Message3 ;
int 21h ;display "Hello, world"
jmp Pega_Numero_Verifica
FINALIZA1:
mov ah,9 ; vou pular uma linha
mov dx,OFFSET newline
int 21h
mov ax,al
CALL FIB
add bx,48
mov [FibVetor],bl
mov ah,9 ;DOS print string function
mov dx,OFFSET FibVetor ;point to "Hello, world"
int 21h ;display "Hello, world"
mov ah,4ch ;DOS terminate program function
int 21h ;terminate the program
FIB proc near
push ax ;empilha ax
push cx
cmp ax,1 ;compara ax com 1
jz LABEL_IF ;se for verdadeiro vai para label if
cmp ax,2 ;se n for 1 compara com 2
jz LABEL_IF ;se for 0 pula para label_if
dec ax ;decrementa ax
CALL FIB ;chama fib recursivamente
mov cx,bx ;poem o ret da funcao em cx
dec ax ;dec ax
CALL FIB ;chama fib recursivamente
add bx,cx ;soma bx com cx o retorno esta em bx aogra tem fib(n-1)+fib(n-2)
jmp FIB_END ;pula para FIB_END;
LABEL_IF:
mov bx,1
jmp FIB_END
FIB_END:
pop cx
pop ax
ret
ENDP
END