.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