2016-03-31 19 views
1

Okulda bir proje için EMU8086 kullanarak montajda bir oyun yapıyorum. Bu oyunda, ilerlemek için kullanıcının bir dize girmesine izin vermem gerekiyor. Dizeye girerken yanlış bir şey yazabilir ve düzeltmek için backspace'u kullanabilir. Sorun, backspace imlecin önceki karaktere göre hareket etmesidir, ancak daha önce girilen karakter kalır. Backspace neden önceki karakteri temizlemiyor? Programımı, ekrandaki önceki karakter kaldırılacak şekilde nasıl düzeltebilirim?Ekranda bir char silme

Benim kodudur: backspace karakterini baskı tipik ekranlar ve terminal emulatörleri için

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 
+1

değil-girintili kodunun dev duvar olurdu Yani Ayrı kod blokları ve bunlar gibi şeyler arasında boş satırlar bıraktıysanız daha okunabilir. En azından yorumlar makul görünüyor (kodun neden her şeyi yapıyor olduğunu söylüyorlar). –

cevap

4

sadece sola imleç bir pozisyon kaydırılır. Bir karakteri temizlemek için, backspace + space + backspace yazdırmayı deneyin.

0

Keith, backspace karakterini yazdırırsanız DOS'ta bile doğrudur, yıkıcı değildir. Bu, imlecin geri döneceği, ancak altındaki karakterin kaldığı anlamına gelir. Bu normal davranış.

yakından ancak başlangıçta başka backspace ardından başka boşluk karakteri yazdırmak için Int 21h/Ah=2 kullanabilirsiniz ilk backspace baskı sonrasında kodlarına bakmak zamanım olmadı. Backspace kodda

sahip:

BackSpace: 
cmp dx,0   ;checks if te user didnt just BackSpaced nothing 
jz deleted 

düzeltmek için, sana böyle bir şey için kodu değiştirebilirsiniz düşünüyorum:

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