.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