如果直接使用书上的代码, 会发现输入一定字符就会卡死
先上代码, 或者跳到问题
assume cs:code
; dsstack segment
; db 16 dup(0)
; dsstack ends
code segment
start:
; mov ax,dsstack
; mov ds,ax
; mov si,13
; mov sp,160
call getstr
mov ax,4c00h
int 21h
getstr:
push ax
getstrs:
mov ah,0
int 16h
cmp al,20h
jb nochar
mov ah,0
call charstack
mov ah,2
call charstack
jmp getstrs
nochar:
cmp ah,0eh
je backspace
cmp ah,1ch
je enter
jmp getstrs
backspace:
mov ah,1
call charstack
mov ah,2
call charstack
jmp getstrs
enter:
mov al,0
mov ah,0
call charstack
mov ah,2
call charstack
pop ax
ret
; ==================================
charstack:
jmp short charstart
table dw charpush,charpop,charshow
top dw 0 ; top of stack
charstart:
push bx
push dx
push di
push es
cmp ah,2
ja charret
mov bl,ah
mov bh,0
add bx,bx
jmp word ptr table[bx]
charpush:
mov bx,top
mov ds:[si][bx],al
add top,1
jmp charret
charpop:
cmp top,0
je charret
dec top
mov bx,top
mov al,[si][bx]
jmp charret
charshow:
mov bx,0b800h
mov es,bx
mov al,160
mov ah,0
mul dh
mov di,ax
add dl,dl
mov dh,0
add di,dx
mov bx,0
charshows:
cmp bx,top
jne noempty
mov byte ptr es:[di],'+' ; 结束符
jmp charret
noempty:
mov al,[si][bx]
mov es:[di],al
mov byte ptr es:[di+2],'+' ; 结束符
inc bx
add di,2
jmp charshows
charret:
pop es
pop di
pop dx
pop bx
ret
code ends
end start
问题
问题现象:
- 输入稍多字符后, 按下回车后卡死
- 一直输入更多的字符后, 没有回车卡死( 有时会显示乱的)
- 第一个问题比第二个问题输入的字符要少