Стирание текущей строки в консоли после нажатия клавиши 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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.4 из 5
Похожие ответы