Стирание текущей строки в консоли после нажатия клавиши 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д