这个程序的功能是,从键盘上输入字符,然后显示在dos区域,具体流程为:
- 从键盘输入的字符,将处罚int 9中断,字符存入键盘缓冲区;
- 然后再调用Int16中断,从键盘缓冲区读取输入的字符;
- 可以将显示在屏幕上的字符删除,这个功能用“出栈”实现
assume cs:code,ss:stack,ds:data
data segment
STRING db 128 dup(0) ;范围:0-126,最后一个零
TOP dw 0 ;相当于 定义了一个变量
data ends
stack segment stack
db 128 dup(0)
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,128 ;初始化栈
call init_para ;首先初始化参数
call get_string ;
mov ax,4c00h
int 21h
;==================================================
;初始化参数 :
;=====================================================
init_para:
mov bx,0b800h
mov es,bx ;显示位置
mov bx,data ;数据来源
mov ds,bx
ret
;=====================================================
;保存一个字符
;=====================================================
get_string: ;初始化工作
mov si,OFFSET STRING ; 字符串存放位置
mov di,160*10+40*2 ; 显示位置 es:[di]要显示的位置
mov bx,0;TOP ; ???????
getString:
call clear_buff ;显示的时候,清空缓冲区
mov ah,0
int 16h ;从键盘缓冲区读取一个字符
cmp al,20H ;小于20h,都不是字符
jb notChar ;判断是否小于20,小于则跳转
call char_push ;
call show_string ;显示
jmp getString
getStringRet:
ret
;=================================================
;
notChar:
cmp ah,0Eh ;扫描码,判断是否是删除键backspace
je backspace ;如果是,直接删除
cmp ah,1ch ;判断是否为enter,如果是直接返回
je getStringRet
jmp getString ;既不是backspace 也不是enter,则获取该字符
;============================================================
;清楚缓冲区
clear_buff:
mov ah,1
int 16h
jz clearBuffRet ;检测标志位,是否为0
mov ah,0
int 16H
jmp clear_buff
clearBuffRet:
ret
;====================================================
backspace:;删除
call char_pop
call show_string
jmp getString
char_pop:
cmp bx,0
je charPopRet
dec bx
mov byte ptr ds:[si+bx],0
charPopRet:
ret
;=============================================================
;将一个字符保存在栈中
;=============================================================
char_push:
;cmp TOP 125
;ja charPushRet
;mov bx,TOP
;mov ds:[si+bx],al ;放入ds中
;inc TOP
cmp bx,126
ja charPushRet
mov ds:[si+bx],al ;放入ds中
inc bx
charPushRet:
ret
;===================================
show_string:
push dx
push ds
push es
push si
push di
showString:
mov dl,ds:[si]
cmp dl,0
je showStringRet
mov es:[di],dl
mov byte ptr es:[di+1],00000010B
add di,2
inc si
jmp showString
showStringRet:
mov byte ptr es:[di],0 ;删除
pop di
pop si
pop es
pop ds
pop dx
;=======================
ret
code ends
end start
删除两个字符