.MODEL small
.STACK 100h
.DATA
Message1 DB 'Digite uma sequencia de caracteres',13,10,'$'
Message2 DB 'Enezimo numero Fibonacci:',13,10,'$'
Message3 DB 'SEU IDIOTA É PRA DIGITAR UM NUMERO NAO OUTRA COISA',13,10,'$'
FibVetor DB 0,0,0,0,0,0,0,0,0,0,13,10,'$'
newline DB 13,10,'$'
var1 DB 0
var2 db 0
Tam DB 10
.CODE
mov cx,@data ;
mov ds,cx ;set DS to point to the data segment
xor cx,cx ;limpa cx
mov ah,9 ;funcao mostrar na tela
mov dx,OFFSET Message1 ;funcao mostrar na tela
int 21h ;funcao mostrar na tela
Pega_Numero_Verifica:
mov ah,1 ;funcao 1 da int 21 h, pega caracter com eco.
int 21h ;caracter que eu peguei, vai em al
xor bx,bx ;limpa bx
mov bl,al ;move al para bl
cmp bl,13 ;compara bl com 13
je FINALIZA1 ;condicional
sub bl,30h ;subtrai para pegar o numero decimal
cmp bl,0 ;compara bl com 0
jb NOT_DIGIT ;verificar se o primeiro caracter pego é um digito
cmp bl,9 ;tenho que verificar se o caracter em al, está entre 0 e 9.
ja NOT_DIGIT ;senão é digito
mov [var1],bl ;salvo caracter que eu peguei em al.
jmp CONVERTE_NUM ;pula para procedimento
CONVERTE_NUM:
xor ax,ax ;limpa ax
mov al,10 ;mov 10 para al
mov cl,[var2] ;move var2 para cl
mul cl ;multiplica
mov cl,al ; move al para cl
add cl,[var1] ;soma var1 com cl
mov [var2],cl ;move cl para var2
jmp Pega_Numero_Verifica;pula para procedimento
NOT_DIGIT:
xor ax,ax ;limpa ax
mov ah,9 ;funcao mostrar na tela
mov dx,OFFSET Message3 ;funcao mostrar na tela
int 21h ;funcao mostrar na tela
jmp Pega_Numero_Verifica ;pula para Pega_Numero_Verifica
FINALIZA1:
mov ah,9 ;move 9 para ah
mov dx,OFFSET newline ;pula linha
int 21h ;
xor ax,ax ;resetar ax
mov al,[var2] ;armazena var2 em ax
CALL FIB ;chama fib
xor ax,ax ;limpa ax
mov ax,bx ;move bx para ax
CALL ITOA ;chama procedimento
mov ah,9 ;DOS print string function
mov dx,OFFSET FibVetor ;ponteiro para o conteudo de fibvetor
int 21h ;Mostra o conteudo do vetor
mov ah,4ch ;DOS terminate program function
int 21h ;terminate the program
FIB proc near
push ax ;empilha ax
push cx ;empilha 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 ;empilha 1 quando for 1 ou 2
jmp FIB_END ;pula para FIB_END
FIB_END:
pop cx ;desmpilha cx
pop ax ;desmpilha ax
ret ;retorna
ENDP ;
ITOA PROC ; int to ascii function
xor dx,dx ;limpa dx
xor dx,dx ;limpa dx
mov bx,0AH ; coloca 10 em bx
INICIO_CONVERSAO:
div bl ;divide ax por bl --> quociente em al, resto em ah
call CONVERTE_ARMAZENA_VETOR;chama procedimento
cmp al,0 ;compara al com 0
je FIM_CONVERSAO ;condicional pula
xor ah,ah ;limpa ah
jmp INICIO_CONVERSAO ;pula para procedimento
FIM_CONVERSAO:
ret ;retorna
ENDP
CONVERTE_ARMAZENA_VETOR proc near
push bx ;empilha bx
xor ch,ch ;limpa ch
mov cl, [Tam] ;move tam para cl
mov si, cx ;move cx para si
mov bx, OFFSET FibVetor ;move FibVetor para bx
add ah, 30h ;coma 30h a ah
mov [bx][si],ah ;move ah para vetor
dec cx ;decrementa cx
mov [Tam],cl ;move cl para tam
pop bx ;desempilha bx
ret
ENDP
END ;fim