Non uso assembler ( o assembly che a dir si voglia ) da quando giocava Van Basten, quindi potrei essere un po arrugginito
Per semplificare la vita e per stampare la stringa ho usato la funzione 21/9 del dos, ma la parte che ho provato a vedere è quella di cancellare il carattere. Occhio che non ho controllato eventuali uscita di buffer o altro.
Per cancellare leggo la posizione del cursore, torno indietro di un carattere e stampo uno spazio vuoto. Se ho capito bene uno dei problemi era questo.
p.s. dimenticavo, assemblato con tasm, non se sia compatibile con nasm/masm.
.model tiny
.radix 16
.code
org 100
inizio:
call getstr
mov ah,9
mov dx,offset cr
int 21h
mov ah,9
mov dx,offset testo
int 21h
int 20 ; fine
getche:
XOR AH,AH
INT 16H
CMP AL,20H
JL FineChe
MOV AH,0EH
MOV BH,0
INT 10h
FineChe:
Ret
Getstr:
mov dx,offset testo
Getstrloop:
CALL getche
CMP AL,08h ;backspace
JE backspace
CMP AL,0dh ;enter
JE exit
push bx
mov bx,dx
MOV [bx],AL
pop bx
INC dx
JMP Getstrloop
backspace:
DEC dx
call tornaindietro
;come cancello il carattere dallo schermo?
JMP Getstrloop
Exit: ;aggiunge $ alla fine per stampare
mov al,24h
;inc dx
push bx
mov bx,dx
MOV [bx],AL
pop bx
RET
TornaIndietro:
push ax
push bx
push dx
mov ah,0fh ; per ottenere la pagina
int 10h
mov ah,3h ; legge posizione cursore
int 10h
dec dl
mov ah,2 ; posiziona il cursore
int 10h
MOV AH,0EH
mov al,20h ; stampa spazio vuoto
MOV BH,0
INT 10h
mov ah,2 ; posiziona il cursore
int 10h
pop dx
pop bx
pop ax
ret;
testo db " $"
cr db "",0ah,0dh,"$"
end inizio