Editor de texto em Assembly 4

Editor pequeno apenas escreve, da enter na tela e backspace:

Créditos para Núbia Cristine aluna de Ciência da computação - UFMA

%OUT--------------------------------------------------------------------------
%OUT Editor de texto - Escrever e justificar o texto                         -
%OUT Autor: Nubia Cristine Silveira dos Santos CP09142-81                          -
%OUT--------------------------------------------------------------------------

.model small  ;tamanho do segmento de dados
.stack 100h   ;tamanho da pilha
.data         ;segmento de dados, com definições de variáveis

;Vetores para utilizacao do MENU
MENU1 db "[Escrever] Sair$"
MENU2 db " Escrever [Sair]$"
MSG db "Escreva o texto e aperte ESC para retornar ao MENU:$"

texto DB 1600 DUP ('$')

.code
MAIN 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           

MENU:
        call LIMPATELA
        LEA    DX,MENU1        ; obtem o endereço efetivo de Msg
        MOV    AH,09h         ; move valor 09h para o registrador AH (imprime a string na tela)
        INT    21h
        mov ah,1h
        int 21h
        cmp al, 0dh
        je ESCREVER
        cmp al,4dh
        je MENUDIR
        jmp MENU

MENUDIR:
        call LIMPATELA
        LEA    DX,MENU2        ; obtem o endereço efetivo de MENU2
        MOV    AH,09h             ; move valor 09h para o registrador AH (imprime a string na tela)
        INT    21h
        mov ah,1h
        int 21h
        cmp al,0dh
        je SAIR
        cmp al,4bh
        je MENU
        jmp MENUDIR

ESCREVER:       
        call LIMPATELA          ; Limpa a tela para digitação
        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

        CALL ENTER1
ESCREVE:
        mov ah,1h
        int 21h
        cmp al,1bh
        je MENU
        cmp al,0dh
        je CARAC_ENTER
        cmp al,08h
        je LIMPA
        mov texto[SI],al
        inc SI
        push si
        mov ah,3h  ;esta função retorna em dl a coluna
        int 10h
        cmp dl,79    ;80 é a ultima coluna
        je JUSTIFICAR ;MOV TEXTO[SI],AL
        jmp ESCREVE

;-----------------------------------------------------------------------------------------------------------------

JUSTIFICAR:
        mov ah,1h          ;Esse trecho verifica o caractere da última coluna digitado e decide o que fazer
        int 21h
        cmp al,08h         ;Faz comparação com a tecla Backspace
        je LIMPA
        cmp al,0dh         ;Faz comparação com enter
        je ESCREVE
        cmp al,' '         ;Faz comparação com espaços
        je ESCREVE
        mov texto[si],al   ;Se não for nenhuma joga o valor dentro do vetor texto
        xor bl,bl          ;zera BL para utilizá-lo como contador

JUSTIFICANDO:
        cmp texto[si-1],' '
       






;-----------------------------------------------------------------------------------------------------------------

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
        jmp ESCREVE                ;Efetua o Loop para pedir nova entrada de caractere
        jmp MENU                ;mostra o resultado da busca

LIMPA:                            ;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 ESCREVE                ;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 ESCREVE             ;Efetua o Loop para pedir nova entrada de caractere,Sem decrementar o contador CX

;-----------------------------------------------------------------------------------------------------------------

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

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

SAIR:   
        mov ah,4ch    ;função para retorno ao dos
        int 21h

MAIN   ENDP
   END   MAIN