.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