All pastes #2077033 Raw Edit

Untitled

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