A seguir segue o código onde o programa recebe dados digitados pelo usuário e imprime na tela apenas as vogais. Fiquem a vontade para alterarem o código e postem aqui o que conseguirem a partir deste.
; ===== MODEL = Declara o Modelo de memoria usado no programa
.MODEL SMALL ; SMALL = código e dados são menores que 64kb, mas estão em segmentos diferentes.
; ===== STACK = Aloca espaco na pilha pilha
.STACK 200h ; Espaço de memória para instruções do programa na pilha
; ===== DATA = indica o começo do bloco de dados
.DATA ; Dados e declaracao de variaveis
; ===== Constantes =====
nome DB 0DH,0AH, " Digite o seu nome => $"
vogais DB 0DH,0AH, " As vogais sao => $"
; ===== Vetor de tamanho 20 =====
nomevet db 20 dup(' ') ; vetor de nome "nomevet" de tamanho 20
; ===== CODE = indica o começo do bloco de código.
.CODE ; Código do programa
START: ; START = inicio da funcao principal
mov ax,@data ; pega endereco do segmento de dados
mov ds,ax ; coloca no registrador de dados
xor si,si ; zera o registrador si - irá fazer a contagem no vetor
call limpatela ; chama função limpa tela
; imprime na tela a variavel
MOV DX,OFFSET nome ; Movendo o OFFSET de nome para DX
MOV AH,09H ; Ativa a interrupção 21H (09H - Escreve um string na saida padrão)
INT 21H ; Habilita a interrupção 21 - Funções do DOS
leia: ; funcao que irá ler todos os caracteres do seu nome - até 30 letras
MOV ah,1h ; Ativa a interrupção 21H (01h - Le um caractere da entrada padrão)
INT 21H ; Habilita a interrupção 21 - Funções do DOS
; comparando com as vogais minusculas
CMP AL,61H ; compara com a
JZ mover ; se for, pula para a funcao mover senao segue comparando
CMP AL,65H ; compara com e
JZ mover ; se for, pula para a funcao mover senao segue comparando
CMP AL,69H ; compara com i
JZ mover ; se for, pula para a funcao mover senao segue comparando
CMP AL,6FH ; compara com o
JZ mover ; se for, pula para a funcao mover senao segue comparando
CMP AL,75H ; compara com u
JZ mover ; se for, pula para a funcao mover senao segue comparando
; comparando com as vogais maiusculas
CMP AL,41H ; compara com A
JZ mover ; se for, pula para a funcao mover senao segue comparando
CMP AL,45H ; compara com E
JZ mover ; se for, pula para a funcao mover senao segue comparando
CMP AL,49H ; compara com I
JZ mover ; se for, pula para a funcao mover senao segue comparando
CMP AL,4FH ; compara com O
JZ mover ; se for, pula para a funcao mover senao segue comparando
CMP AL,55H ; compara com U
JZ mover ; se for, pula para a funcao mover senao segue comparando
CMP AL,0DH ; compara se a tecla digitada é enter
JZ imprimir ; caso seja enter, pula para computar o total de caracteres
jnz leia ; se não foi teclado enter ira continuar
mover:
inc si ; incrementa si para nao sobrepor a letra anterior
mov nomevet[si],al ; move o caractere digitado para o "vetor"
jmp leia
imprimir:
call imprime_caracteres ; chama a função para imprimir o vetor na tela
JMP fim2 ; após imprimir salta para o fim
;----------------------------------------------------------------------
;Procedimento: Imprime Vetor
;----------------------------------------------------------------------
imprime_caracteres proc
; Imprime todo o conteudo do vetor
push si
xor si,si ; zera o registrador si
mov ch,20 ; coloca em ch o tamanho do vetor
mov ah,9h ; Ativa a interrupção 21H (09H - Escreve um string na saida padrão)
mov dx,offset vogais ; Movendo o OFFSET de vogais para DX
int 21h ; Habilita a interrupção 21 - Funções do DOS
imprime:
mov ah,2h ; Ativa a interrupção 21H (02H - Escreve um caracter na saida padrão)
mov dl,nomevet[si] ; Move cada caracter para o registrador DL
int 21h ; Habilita a interrupção 21 - Funções do DOS
inc si ; incrementa o registrador si para o proximo caracter do vetor
dec ch ; decrementa o registrador ch
cmp ch,0 ; compara o registrador ch com 0
jnz imprime ; se não for zero volta ao inicio da função imprime
pop si
ret
endp
;----------------------------------------------------------------------
;Funcao: FIM
;----------------------------------------------------------------------
limpatela: ;#
push AX ; Guarda na pilha o valor do Registrador AX ;#
mov ah, 00h ; Ativa a IRQ 10 para a limpeza do vídeo ;#
mov al, 3 ; define o modo de video ;#
int 10h ; Habilita a IRQ 10 (video) ;#
pop AX ; Retorna da pilha o valor do Registrador AX ;#
retn ;#
fim2: ; para não fechar a janela diretamente chamar a função para leitura do teclado para então finalizar o executavel
MOV ah,1h ; Ativa a interrupção 21H (01h - Le um caractere da entrada padrão)
INT 21H ; Habilita a interrupção 21 - Funções do DOS
;finaliza o executavel
MOV AH,04CH
INT 21H
END START ; Fim do Programa
Cara, consegue me mandar o programa compilado pra testar usar o decompiler nele? Abs
ResponderExcluirAnimal esse código, valeu por compartilhar
ResponderExcluir