Стирание текущей строки в консоли после нажатия клавиши escape - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, я написал программу, которая вводит и выводит числа в десятичной системе счисления. Хочу поинтересоваться возможно ли стирание текущей строки в консоли после нажатия клавиши escape. Стирание происходит через сдвиг каретки на один символ влево и заполнением этого места пробелом. В моей программе также есть функция, которая, при нажатии клавиши backspace, стирает последний введённый символ. И эта функция работает. А вот после нажатия escape число должно фактически обнуляться, а визуально стирать строку, но это не происходит! Показывается стрелка влево и каретка остаётся на том же месте! Пробовал просто менять положение каретки, и это получается, но чтобы очищало строку - никак. Вот, соответственно, код программы:
Листинг программы
  1. .model small
  2. .stack
  3. .data
  4. a dw ?
  5. b dw ?
  6. incorrect db 10, 13, "WAS ENTERED INCORRECT CHARACTER!$"
  7. bignumber db 10, 13, "NUMBER IS TOO BIG!$"
  8. impossible db 10, 13, "DIVIDE BE ZERO IS IMPOSSIBLE$"
  9. nextln db 10, 13, "$"
  10. backspace db 32, 8, "$"
  11. .code
  12. Input proc
  13. mov bx, 0
  14. begin:
  15. mov ah, 01h
  16. int 21h
  17. cmp al, 13
  18. je exit
  19. cmp al, 27
  20. je escape
  21. cmp al, 8
  22. je bkspace
  23. cmp al, '0'
  24. jb error
  25. cmp al, '9'
  26. ja error
  27. allisok:
  28. sub al, 30h
  29. xor ah, ah
  30. xchg ax, bx
  31. mov dx, 10
  32. mul dx
  33. add bx, ax
  34. cmp bx, 6553
  35. jae check
  36. jmp begin
  37. error:
  38. mov dx, offset incorrect
  39. mov ah, 09h
  40. int 21h
  41. mov bx, 0
  42. jmp nextline
  43. check:
  44. cmp bx, 6553
  45. ja numberok
  46. mov ah, 01h
  47. int 21h
  48. cmp al, 13
  49. je exit
  50. cmp al, '0'
  51. jb error
  52. cmp al, '9'
  53. ja error
  54. cmp al, '6'
  55. jb allisok
  56. mov dx, offset bignumber
  57. mov ah, 09h
  58. int 21h
  59. mov bx, 0
  60. jmp nextline
  61. nextline:
  62. mov dx, offset nextln
  63. mov ah, 09h
  64. int 21h
  65. jmp begin
  66. exit:
  67. ret
  68. numberok:
  69. mov dx, offset nextln
  70. mov ah, 09h
  71. int 21h
  72. ret
  73. escape:
  74. mov bx, 0
  75. mov cx, 4
  76. again:
  77. mov dx, offset backspace
  78. mov ah, 09h
  79. int 21h
  80. loop again
  81. jmp begin
  82. bkspace:
  83. mov dx, offset backspace
  84. mov ah, 09h
  85. int 21h
  86. mov ax, bx
  87. xor dx, dx
  88. mov cx, 10
  89. div cx
  90. mov bx, ax
  91. jmp begin
  92. Input endp
  93. Output proc
  94. xor cx, cx
  95. mov bx, 10
  96. l1:
  97. xor dx,dx
  98. div bx
  99. push dx
  100. inc cx
  101. test ax, ax
  102. jnz l1
  103. mov ah, 02h
  104. l2:
  105. pop dx
  106. add dl, '0'
  107. int 21h
  108. loop l2
  109. ret
  110. Output endp
  111. main:
  112. mov ax, @data
  113. mov ds, ax
  114. call Input
  115. mov a, bx
  116. call Input
  117. mov b, bx
  118. mov ax, a
  119. call Output
  120. mov dl, '/'
  121. mov ah, 02h
  122. int 21h
  123. mov ax, b
  124. call Output
  125. mov dl, '='
  126. mov ah, 02h
  127. int 21h
  128. cmp b, 0
  129. je dbzero
  130. xor dx, dx
  131. mov ax, a
  132. div b
  133. call Output
  134. mov ax, 4c00h
  135. int 21h
  136. int 20h
  137. dbzero:
  138. mov dx, offset impossible
  139. mov ah, 09h
  140. int 21h
  141. end main
  142. ;made by Belsky Anton

Решение задачи: «Стирание текущей строки в консоли после нажатия клавиши escape»

textual
Листинг программы
  1. .MODEL  TINY
  2. InpBuffLen=10
  3. Cr=0dh
  4. Lf=0ah
  5. BSpace=8
  6. .CODE
  7.     org 100h
  8. Begin:
  9.     jmp @@get_key
  10.  
  11. @@disp:
  12.     mov EscPres, 0
  13.     cmp al, BSpace
  14.     jne @@no_bs
  15.     call    BackSpace
  16.     jmp @@get_key
  17. @@no_bs:
  18.     cmp CharQty, InpBuffLen
  19.     jae @@get_key
  20.     inc CharQty
  21.  
  22.     mov dl, al
  23.     mov ah, 2
  24.     int 21h
  25. @@get_key:
  26.     mov ah, 8
  27.     int 21h
  28.  
  29.     cmp al, 1bh
  30.     jne @@disp
  31.     inc EscPres
  32.  
  33.     mov dx, offset ClrBuff
  34.     call    DispStrDx
  35.     mov CharQty, 0
  36.  
  37.     cmp EscPres, 2
  38.     jb  @@get_key
  39.  
  40.  
  41.     mov dx, offset MsgTerm
  42.     call    DispStrDx
  43.     mov ah, 8
  44.     int 21h
  45.  
  46.     int 20h
  47. ;---------------------------
  48. BackSpace   PROC    NEAR
  49.         cmp CharQty, 0
  50.         je  @F
  51.         dec CharQty
  52.         mov dx, offset ClrOne
  53.         call    DispStrDx
  54. @@:
  55.         ret
  56. BackSpace   ENDP
  57. ;---------------------------
  58. DispStrDx   PROC    NEAR
  59.         push    ax
  60.         mov ah, 9
  61.         int 21h
  62.         pop ax
  63.         ret
  64. DispStrDx   ENDP
  65. ;---------------------------
  66. .DATA
  67. CharQty db  0
  68. EscPres db  0
  69. MsgTerm db  Cr, Lf, "Press a key to exit", Cr, Lf, 24h
  70. ClrOne  db  BSpace, " ", BSpace, 24h
  71. ClrBuff db  Cr, InpBuffLen dup(" "),Cr,"$"
  72.     end Begin

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


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

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

15   голосов , оценка 4.4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы