;程序名称:Char_pro
;任务:完成字符串的输入、删除和显示
assume cs:code
stack segment
db 128 dup (0)
stack ends
code segment
start: mov ax,stack
mov ds,ax
mov si,0 ;设置ds:si指向栈空间
call getstr
mov ax,4c00h
int 21h
;- - - - - - - - - - - - - - - - - - -
;getstr子程序
;任务:对int 16h接收到的键盘输入,进行字符、退格键、回车键的分类处理
getstr:
push ax
getstrs: mov ah,0
int 16h
cmp al,20h
jb nochar ;小于20h的ASCII码不是字符,则转去另行处理
mov ah,0
call charstack ;字符入栈
mov ah,2
call charstack ;显示栈中字符
jmp getstrs
nochar: cmp ah,0eh ;判断int 16h是否读到退格键扫描码
je backspace ;读到,则转到backspace
cmp ah,1ch ;判断int 16h是否读到回车键扫描码
je enter ;读到,则转到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 ;0入栈,字符串输入结束
mov ah,2
call charstack ;显示栈中字符
pop ax
ret
;- - - - - - - - - - - - - - - - -
;Charstack子程序(字符栈)
;任务:将键盘输入的字符入栈、出栈,并显示栈中字符
;参数:(ah)=功能号,0表示入栈,1表示出栈,2表示显示;
; ds:si指向字符栈空间(即栈空间的段地址和偏移地址)
; 对于0号功能:(al)=入栈字符
; 对于1号功能:(al)=返回的字符
; 对于2号功能:(dh)、(dl)=字符串在屏幕上显示的行、列位置
Charstack: jmp short charstart
table dw charpush,charpop,charshow ;功能表
top dw 0 ;栈顶
charstart: push bx
push dx
push di
push es
cmp ah,2 ;判断申请的功能是否越界
ja sret ;越界则转到结束
mov bl,ah ;未越界,则作申请功能的入口地址选择
mov bh,0
add bx,bx
jmp word ptr table[bx] ;指向相关功能的入口地址
charpush: mov bx,top ;将栈顶赋予bx
mov [si][bx],al ;将入栈符号存于栈顶处
inc top ;将栈顶位置加1,完成入栈
jmp sret
charpop: cmp top,0 ;判断栈顶是否为0
je sret ;为0则不可出栈,转到结束
dec top ;不为0则栈顶位置减1
mov bx,top ;将栈顶赋予bx
mov al,[si][bx] ;将[si][bx]处的符号存于al,完成出栈
jmp sret
charshow: mov bx,0b800h ;设置显示位置
mov es,bx
mov al,160
mov ah,0
mul dh ;乘数为行号
mov di,ax ;相乘结果存于di
add dl,dl ;1个字符占2字节
mov dh,0
add di,dx ;相加得首字符显示位置,存于di
mov bx,0
charshows: cmp bx,top ;判断栈顶是否为0
jne noempty ;不为0,则转到noempty(非空)
mov byte ptr es:[di],' ' ;为0,输一空格清除之前显示字符
jmp sret ;转到结束
noempty: mov al,[si][bx] ;读取[si][bx]处字符,存于al
mov es:[di],al ;在首位置显示读取的字符
mov byte ptr es:[di+2],' ' ;同时清除之前显示的字符
inc bx ;栈中寻址增1
add di,2 ;显示位置增2
jmp charshows
sret: pop es
pop di
pop dx
pop bx
ret
code ends
end start
- [游客] 为啥简版的int 13h之后不用 jmp 也行。 08/31 00:14
- [hky987654321] 是的,按压F1的次数 >=15 ,有“按下“→”键会出现光斑落在年份的百位数上”的现象。 这与缓冲 08/09 11:12
- [游客] 为什么多次按F1后,按下“→”键会出现光斑落在年份的百位数上? 08/02 21:42
- [游客] 懂了。 07/30 10:54
- [hky987654321] -1就是FFh。用-1兼济了ffff:0和简洁的数据分隔这二者的需要。 [bp-2],是因为刚进入 07/29 11:43
- [游客] 也看不懂[bp-2] 07/12 10:49
- [游客] 不懂-1 07/09 17:55
- [游客] 16位现在只有教学意义,看一眼就好。 04/13 00:46
- [游客] 没搞错吧,课程2才351b 03/09 18:01
- [游客] 没想到实验14只用13条代码! 03/02 15:46