All pastes #2077098 Raw Edit

armazena

public text v1 · immutable
#2077098 ·published 2011-06-09 02:58 UTC
rendered paste body
.MODEL small
.STACK 100h
.DATA
    Message1 DB 'Digite uma sequencia de caracteres:',13,10,'$'
    Message4 DB 'Digite outra sequencia de caracteres:',13,10,'$'
    Message2 DB 'Este nao e um caracter valido:',13,10,'$'
    Message3 DB 'Tamanho do vetor foi excedido',13,10,'$'
    Vetor1 DB  0,0,0,0,0,0,0,0,0,0,13,10,'$'
    Vetor2 DB  0,0,0,0,0,0,0,0,0,0,13,10,'$'
    newline DB 13,10,'$'
    POS db 0                    ;posicao no vetor
    Tam DB 10                   ;constante serve para referencia da posicao
.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_caracter_Verifica:
    mov ah,1                    ;funcao 1 da int 21 h, pega caracter 
    int 21h                     ;caracter que eu peguei, vai em al
    cmp cx,0                    ;cx e uma flag em 0 continua operando com o vetor1 | cx=1 opera com vetor2
    je primeiro_vetor           ;se for 0 vetor1
    ja segundo_vetor            ;se for 1 vetor2
primeiro_vetor:    
    cmp al,13                   ;compara bl com 13(enter)
    je PROXIMO_VETOR            ;se for enterentao passa pro proximo vetor
    cmp al,32                   ;compara bl com 32 valor em inteiro de space
    jb NOT_DIGIT                ;verificar se o caracter é valido
    cmp al,127                  ;tenho que verificar se e um caracter q esta em al entre 32 e 126.
    ja  NOT_DIGIT               ;senão é digito
    mov bx, OFFSET Vetor1       ;move vetor1 para bx para usar na funcao de armazenar
    CALL GUARDA_NO_VETOR        ;chamada de funcao pra armazenar no vetor
    jmp Pega_caracter_Verifica  ;retorna para a o inicio
segundo_vetor:
    cmp al,13                   ;compara bl com 13(enter)
    je FINALIZA1                ;se for enterentao passa pro proximo vetor
    cmp al,32                   ;compara bl com 32 valor em inteiro de space
    jb NOT_DIGIT                ;verificar se o caracter é valido
    cmp al,126                  ;tenho que verificar se e um caracter q esta em al entre 32 e 126.
    ja  NOT_DIGIT               ;senão é digito
    mov bx, OFFSET Vetor2       ;move vetor2 para bx
    CALL GUARDA_NO_VETOR        ;chamada de funcao pra armazenar no vetor
    jmp Pega_caracter_Verifica  ;retorna para a o inicio
NOT_DIGIT:
    xor ax,ax                   ;limpa ax
    mov  ah,9                   ;funcao para imprimir cadeia de caracteres
    mov  dx,OFFSET Message2     ;move vetor Message2 em dx
    int  21h                    ;interrupção do sistema e imprime message3
    jmp  Pega_caracter_Verifica ;voltar para o inicio

PROXIMO_VETOR:
    mov cx,1
    mov [POS],0                 ;reseta posicao para trabalhar com o novo vetor
    mov [Tam],10                ;
    mov ah,9                    ;move 9 para ah
    mov dx,OFFSET newline       ;pula linha
    int 21h  
    mov  ah,9                   ;funcao mostrar na tela
    mov  dx,OFFSET Message4     ;funcao mostrar na tela
    int  21h                
    jmp Pega_caracter_Verifica
FINALIZA1:
    mov ah,9                    
    mov dx,OFFSET newline       ;pula linha
    int 21h  
    mov ah,9                   
    mov dx,OFFSET newline       ;pula linha
    int 21h  

    xor ax,ax                   ;resetar ax
    mov  ah,9                   ;DOS print string function
    mov  dx,OFFSET Vetor1       ;mov vetor1 pra dx para imprimir
    int  21h                    
    mov ah,9                   
    mov dx,OFFSET newline       ;pula linha
    int 21h  
    mov  ah,9                   ;DOS print string function
    mov  dx,OFFSET Vetor2       ;mov vetor2 para dx para imprimir seu conteudo
    int  21h  
    mov  ah,4ch                 ;DOS terminate program function
    int  21h                    ;terminate the program                        ;


GUARDA_NO_VETOR proc near
        push cx                 ;empilha cx pois preciso usar o valor dele como flag no inicio do programa
        xor ch,ch               ;limpa ch
        mov cl, [POS]           ;move pos para cl
        cmp cl,[Tam]            ;compara cl com tam para ver se excedeu o tamanho
        jae limite_do_vetor     ;se pos for igual ou maior q 10 excedeu e vai para o flag limite_do_vetor
        mov si, cx              ;move cx para si
        mov [bx][si],al         ;move ah para vetor
        inc cx                  ;decrementa cx
        mov [POS],cl            ;move cl para tam
        pop cx                  ;desempilha cx para voltaro valor da flag ,
        ret                     ; assim podendo utilizar no inicio do programa
limite_do_vetor:                ;significa q o excedeu o tamanho do vetor e n vai armazenar mais
        mov ah,9
        mov dx,OFFSET Message3
        int 21h
        pop cx                  ;desempilha cx para voltaro valor da flag ,
        ret                     ; assim podendo utilizar no inicio do programa
ENDP
END                             ;fim