我正在使用EMU8086为学校的项目进行装配游戏。在这个游戏中,我需要允许用户输入一个字符串才能进步。当他输入字符串时,他可能会输入错误的内容并使用 backspace 来纠正它。问题是退格将光标移动到前一个字符上,但先前输入的字符仍然存在。为什么退格不清除前一个字符?如何修复程序,以便删除屏幕上的前一个字符?
我的代码是:
data segment
ends
stack segment
dw 128 dup(0)
ends
StringHelper db 20 dup(?)
Line db 13,10,'$'
FullInput db 'You cant type more than 20 letters!!! please try again!!',13,10,'$'
t db '$'
code segment
PROC PrintMessage
;BX MUST have OFFSET OF MESSAGE
; if you want to go down a line do (lea bx,line)
mov dx,bx
mov ah,09h
int 21h
ret
endp printMessage
proc InputString
;askes the user to input chars untill he press (enter) then puts it in StringHelper
b:
lea bx, StringHelper
mov cx,5
xor dx,dx
a: ;restarts string helper
mov [bx],00
inc bx
loop a
lea bx, StringHelper
up:
cmp dx,20 ;cheacks if you wrote more than 20 chars
jz TryAgain
deleted:
xor ax,ax
mov ah,01h
int 21h
xor ah,ah
mov cx,08h ;checks if the user inputed the backspace key
cmp al,cl
jz BackSpace
mov cx,0dh
cmp al, cl ;checks if the user enters enter
jz InputIsOver
inc dx
mov [bx],al
inc bx
jmp up
TryAgain:
lea bx, line
call PrintMessage
lea bx, FullInput
call PrintMessage
jmp b:
BackSpace:
cmp dx,0 ;checks if te user didnt just BackSpaced nothing
jz deleted
lea bx,stringhelper ;gets the start of the array
add bx,dx ;adds dx which is the indexer to how many chars you already wrote
mov [bx],00h ;puts 0(nothing) at that place
dec bx
dec dx
jmp deleted ;returen to get an extra input
InPutIsOver:
ret
endp
start:
mov ax, @data
mov ds, ax
mov al,13h
int 10h
call InputString
; add your code here
mov ax, 4c00h
int 21h
ends
end start
答案 0 :(得分:5)
对于典型的屏幕和终端仿真器,打印退格字符只是将光标向左移动一个位置。要清除字符,请尝试打印退格键+空格+退格键。
答案 1 :(得分:1)
Keith是正确的,即使在DOS中,如果你打印退格字符,它也是非破坏性的。这意味着光标将返回但下面的字符仍然存在。这是正常行为。
我没有时间仔细查看代码,但在最初打印第一个退格后,您可以使用Int 21h/Ah=2打印另一个 space 字符然后是另一个退格。
在退格代码中你有:
BackSpace:
cmp dx,0 ;checks if te user didnt just BackSpaced nothing
jz deleted
要解决此问题,我认为您可以将代码更改为:
BackSpace:
cmp dx,0 ;checks if te user didnt just BackSpaced nothing
jz deleted
mov ah, 02h ; DOS Display character call
mov dl, 20h ; A space to clear old character
int 21h ; Display it
mov dl, 08h ; Another backspace character to move cursor back again
int 21h ; Display it