Créditos ao aluno de ciência da computação Kássio Sousa:
%OUT Editor de texto - Escrever e justificar o texto -
%OUT Autor: Kassio Romulo Lima Sousa - CP09126-81 - -
%OUT--------------------------------------------------------------------------
.model small ;tamanho do segmento de dados
.stack 100h ;tamanho da pilha
.data ;segmento de dados, com definições de variáveis
inst db "Escreva o texto e aperte ESC para retornar ao menu:$"
Msg db "Editor de Texto",0dh,0ah,"Digite a opcao desejada:",0dh,0ah,"1-Digitar o texto",0dh,0ah,"2-Sair",0dh,0ah,'$'
texto DB 1600 DUP ('$')
.code
INICIO PROC ;Inicia o segmento de dados apontando para o início da área de dados
MENU_REPETIÇAO:
mov SI,0 ;Inicializa SI com 0h
mov ax,@data
mov ds,ax
call LIMPATELA
LEA DX,Msg ; obtem o endereço efetivo de Msg
MOV AH,09h ; move valor 09h para o registrador AH (imprime a string na tela)
INT 21h
MENU:
MOV AH,1H ;FUNÇÃO PARA LER (O CHAR FICA EM AL)
INT 21H
CMP AL,'1' ;Compara o caractere lido com '1'
JE CASE_1 ;Se for igual, da jump para o label CASE_1
cmp al,'2'
je SAINDO
jmp MENU ;No caso Default, o programa Retorna ao menu
SAINDO: jmp FIM
COMMENT*------------------------------------------------------------------------------
- Caso 1: Utilizado para escrita no editor
-------------------------------------------------------------------------------------*
CASE_1:
call LIMPATELA ;Limpa a tela para digitação
LEA DX,inst ; obtem o endereço efetivo de Inst
MOV AH,09h ; move valor 09h para o registrador AH (imprime a string na tela)
INT 21h
CALL ENTER1
LOOP_ESC: ;Fica no Loop ateh o usuario pressionar ESC
MOV AH,1H ;FUNÇÃO PARA LER (O CHAR FICA EM AL)
INT 21H
CMP AL,1Bh ;compara AL com o caractere ESC
JE MENU_REPETIÇAO ;Se a comparacao for verdadeira, efetua um Jump para a parte das opçoes novamente
CMP AL, 08h ;Compara o caractere lido com Backspace
JE CARAC_BACKSPACE ;Se a comparacao for verdadeira efetua a ação
CMP AL,0Dh ;Compara o caractere lido com enter
JE CARAC_ENTER ;Se a comparacao for verdadeira vai para a função de ENTER
MOV texto[SI],AL ;Copia o caractere armazenado em AL para o espaco especificado por SI no vetor texto
INC SI
push SI
mov ah,3h ;Esta função retorna em dl a coluna atual
int 10h
cmp dl,79 ;80 é a ultima coluna
;je JUSTIFICAR
jmp LOOP_ESC ;Efetua o Loop para pedir nova entrada de caractere
CARAC_BACKSPACE: ;Efetuado quando o usuario digita o caractere "BACKSPACE"
CMP SI,0 ;Se for o inicio do texto,nao faz nada e pede nova entrada
JE LOOP_ESC ;Efetua o Loop para pedir nova entrada de caractere, Sem decrementar o contador CX
CALL BACKSPACE ;Pula para o label BACKSPACE
DEC SI ;Caso nao, decrementa SI
MOV texto[SI],'$' ;Coloca ,no espaco do vetor texto especificado por SI, o caractere '$'
JMP LOOP_ESC ;Efetua o Loop para pedir nova entrada de caractere,Sem decrementar o contador CX
CARAC_ENTER: ;Efetuado quando o usuario digita o caractere "ENTER"
call ENTER1
mov texto[SI],AL ;Copia o caractere armazenado em AL para o espaco especificado por SI no vetor texto
inc SI ;Incrementa SI para apontar para a próxima posicao do Vetor
loop LOOP_ESC ;Efetua o Loop para pedir nova entrada de caractere
jmp MENU_REPETIÇAO ;mostra o resultado da busca
COMMENT*------------------------------------------------------------------------------
- Funções para justificar
-------------------------------------------------------------------------------------*
COMMENT*------------------------------------------------------------------------------
- Funções complementares de todo o programa
-------------------------------------------------------------------------------------*
LIMPATELA: ; Limpa e Ajusta a tela
PUSH AX ; Guarda AX na pilha
MOV AH,0H ; Ativa a IRQ 10 para a limpeza do vídeo
MOV AL,3H ; define o modo de video
int 10h ; Habilita a IRQ 10 (video)
POP AX ; Recupera AX da pilha
RET
ENTER1: ;Forca o Enter
PUSH AX ;Guarda AX na pilha
MOV DL,0DH ;Passa para DL o caractere "Retorno de Carro"
MOV AH,2h ;Função 2h para imprimir um caracter
INT 21h ;Imprime o caracter que está em DL
MOV DL,0AH ;Passa para DL o caractere "Line Feed"
MOV AH,2h ;Função 2h para imprimir um caracter
INT 21h ;Imprime o caracter que está em DL
POP AX ;DEVOLVE VALOR DE AX
RETN ;RETORNA PRA ONDE FOI CHAMADO
BACKSPACE: ;Forca o BACKSPACE
MOV DL,32 ;Copia 32 decimal para DL o equivalente a ESPAÇO
MOV AH,2h ;Função 2h para imprimir um caracter
INT 21h ;Imprime o caracter que está em DL
MOV DL,08h ;Copia 08 hexa para DL o equivalente ao retorno de carro
MOV AH,2h ;Função 2h para imprimir um caracter
INT 21h ;Imprime o caracter que está em DL
RET ;Retorna o controle ao procedimento que o chamou
FIM:
MOV ah,4Ch ; move valor 4ch para o registrador AH (encerra programa)
INT 21h
INICIO ENDP
END INICIO ;Finaliza o código do programa
Coloque aqui o seu email