All pastes #2073933 Raw Edit

Miscellany

public text v1 · immutable
#2073933 ·published 2011-06-03 01:34 UTC
rendered paste body
.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