Стирание текущей строки в консоли после нажатия клавиши escape - Assembler
Формулировка задачи:
Здравствуйте, я написал программу, которая вводит и выводит числа в десятичной системе счисления. Хочу поинтересоваться возможно ли стирание текущей строки в консоли после нажатия клавиши escape. Стирание происходит через сдвиг каретки на один символ влево и заполнением этого места пробелом. В моей программе также есть функция, которая, при нажатии клавиши backspace, стирает последний введённый символ. И эта функция работает. А вот после нажатия escape число должно фактически обнуляться, а визуально стирать строку, но это не происходит! Показывается стрелка влево и каретка остаётся на том же месте! Пробовал просто менять положение каретки, и это получается, но чтобы очищало строку - никак.
Вот, соответственно, код программы:
Листинг программы
- .model small
- .stack
- .data
- a dw ?
- b dw ?
- incorrect db 10, 13, "WAS ENTERED INCORRECT CHARACTER!$"
- bignumber db 10, 13, "NUMBER IS TOO BIG!$"
- impossible db 10, 13, "DIVIDE BE ZERO IS IMPOSSIBLE$"
- nextln db 10, 13, "$"
- backspace db 32, 8, "$"
- .code
- Input proc
- mov bx, 0
- begin:
- mov ah, 01h
- int 21h
- cmp al, 13
- je exit
- cmp al, 27
- je escape
- cmp al, 8
- je bkspace
- cmp al, '0'
- jb error
- cmp al, '9'
- ja error
- allisok:
- sub al, 30h
- xor ah, ah
- xchg ax, bx
- mov dx, 10
- mul dx
- add bx, ax
- cmp bx, 6553
- jae check
- jmp begin
- error:
- mov dx, offset incorrect
- mov ah, 09h
- int 21h
- mov bx, 0
- jmp nextline
- check:
- cmp bx, 6553
- ja numberok
- mov ah, 01h
- int 21h
- cmp al, 13
- je exit
- cmp al, '0'
- jb error
- cmp al, '9'
- ja error
- cmp al, '6'
- jb allisok
- mov dx, offset bignumber
- mov ah, 09h
- int 21h
- mov bx, 0
- jmp nextline
- nextline:
- mov dx, offset nextln
- mov ah, 09h
- int 21h
- jmp begin
- exit:
- ret
- numberok:
- mov dx, offset nextln
- mov ah, 09h
- int 21h
- ret
- escape:
- mov bx, 0
- mov cx, 4
- again:
- mov dx, offset backspace
- mov ah, 09h
- int 21h
- loop again
- jmp begin
- bkspace:
- mov dx, offset backspace
- mov ah, 09h
- int 21h
- mov ax, bx
- xor dx, dx
- mov cx, 10
- div cx
- mov bx, ax
- jmp begin
- Input endp
- Output proc
- xor cx, cx
- mov bx, 10
- l1:
- xor dx,dx
- div bx
- push dx
- inc cx
- test ax, ax
- jnz l1
- mov ah, 02h
- l2:
- pop dx
- add dl, '0'
- int 21h
- loop l2
- ret
- Output endp
- main:
- mov ax, @data
- mov ds, ax
- call Input
- mov a, bx
- call Input
- mov b, bx
- mov ax, a
- call Output
- mov dl, '/'
- mov ah, 02h
- int 21h
- mov ax, b
- call Output
- mov dl, '='
- mov ah, 02h
- int 21h
- cmp b, 0
- je dbzero
- xor dx, dx
- mov ax, a
- div b
- call Output
- mov ax, 4c00h
- int 21h
- int 20h
- dbzero:
- mov dx, offset impossible
- mov ah, 09h
- int 21h
- end main
- ;made by Belsky Anton
Решение задачи: «Стирание текущей строки в консоли после нажатия клавиши escape»
textual
Листинг программы
- .MODEL TINY
- InpBuffLen=10
- Cr=0dh
- Lf=0ah
- BSpace=8
- .CODE
- org 100h
- Begin:
- jmp @@get_key
- @@disp:
- mov EscPres, 0
- cmp al, BSpace
- jne @@no_bs
- call BackSpace
- jmp @@get_key
- @@no_bs:
- cmp CharQty, InpBuffLen
- jae @@get_key
- inc CharQty
- mov dl, al
- mov ah, 2
- int 21h
- @@get_key:
- mov ah, 8
- int 21h
- cmp al, 1bh
- jne @@disp
- inc EscPres
- mov dx, offset ClrBuff
- call DispStrDx
- mov CharQty, 0
- cmp EscPres, 2
- jb @@get_key
- mov dx, offset MsgTerm
- call DispStrDx
- mov ah, 8
- int 21h
- int 20h
- ;---------------------------
- BackSpace PROC NEAR
- cmp CharQty, 0
- je @F
- dec CharQty
- mov dx, offset ClrOne
- call DispStrDx
- @@:
- ret
- BackSpace ENDP
- ;---------------------------
- DispStrDx PROC NEAR
- push ax
- mov ah, 9
- int 21h
- pop ax
- ret
- DispStrDx ENDP
- ;---------------------------
- .DATA
- CharQty db 0
- EscPres db 0
- MsgTerm db Cr, Lf, "Press a key to exit", Cr, Lf, 24h
- ClrOne db BSpace, " ", BSpace, 24h
- ClrBuff db Cr, InpBuffLen dup(" "),Cr,"$"
- end Begin
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д