.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,'$' Message5 DB 'Os vetores sao iguais',13,10,'$' Message6 DB 'Os vetores sao diferentes',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 Message3 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 CALL COMPARA_VETORES cmp cx,0 je diferentes ja iguais iguais: mov ah,9 mov dx,OFFSET Message5 int 21h mov ah,4ch ;DOS terminate program function int 21h ;terminate the program diferentes: mov ah,9 mov dx,OFFSET Message6 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 COMPARA_VETORES proc near xor cx,cx mov cl,0 lea si,Vetor1 ;LEA destino,fonte O operador fonte deve estar localizado na memória, e lea di,Vetor2 ;seu deslocamento é colocado no registrador de índice ou ponteiro especificado no destino. inicio: cmp cl,[Tam] ;compara cl com 10 se cl estiver em 10 vai para o fim do procedimento je fim_igual ;label para o fim mov ah,[si] ;move a posicao referenciada do vetor1 para ah mov al,[si+1] ;move a posicao à frente da referenciada do vetor1 para al mov bh,[di] ;move a posicao referenciada do vetor2 para ah mov bl,[di+1] ;move a posicao à frente da referenciada do vetor2 para al cmp ah,bh ;compara os caracteres referenciados ex em c: if(ah[cont] == bh[cont]) je segundo ;se for igual pula para o segundo caracter jmp fim_desigual ;se não for pula para o fim_desigual e move 0 para cx que e o valor de retorno segundo: cmp al,bl ;compara al,bl se for igual pula para mod_si_di je mod_si_di ;label de modificao dos operandos jmp fim_desigual ;se não for igual pula para fim_desigual mod_si_di: add cl,2 ;adiciona 2 em cl por que ja foram verificador duas posicoes de cada vetor add si,2 ;adiciona 2 em si para trabalhar com as proximas 2 posicoes dos vetor1 add di,2 ;adiciona 2 em di para trabalhar com as proximas 2 posicoes dos vetor2 jmp inicio ;volta para o inicio fim_desigual: mov cx,0 ;move 0 para cx, essa flag quando retornada indica que as strings sao desiguais ret ;retorna o procedimento fim_igual: mov cx,1 ;move 1 para cx, essa flag determina que as strings sao iguais ret ;retorna o procedimento ENDP END ;fim