17.3,抛弃字符栈...
本帖最后由 kane080824 于 2011-11-30 22:01 编辑王爽老师17.3章节实现字符串输入用了建立字符栈的方法,其本意应该是是为了让我们多多练习直接定址表和功能模块化,但由此也产生一个问题,由于使用字符栈,每次字符的增加或删减字符串都要重新显示,理论上说有损效率,因为习惯上每输入一个字符不需要每次重新显示之前已输入的字符,删除同理,所以决定抛弃字符栈.
程序框架图
http://bbs.fishc.com/data/attachment/album/201111/30/214738p5popzt4o4u54odp.jpghttp://bbs.fishc.com/data/attachment/album/201111/30/204600fsdd3d75hado3ssa.jpg
程序运行截图
程序代码:
assume cs:code
code segment
table dwshowstr,delchar,endstr ;功能地址表
start:mov ax,0b800h
mov es,ax
mov dh,12 ;行参数
mov dl,35 ;列参数
mov al,160
mul dh
mov di,ax
add dl,dl
mov dh,0
add di,dx ;字符串指针di参数,指向字符串显示的开始位置
mov cx,di ;cx指向字符串开始位置,防止删除超界
call input_str;字符串接收子程序
mov ax,4c00h
int 21h
input_str:
scan:mov ah,0
int 16h ;调用16h中断侦测键盘输入
cmp al,20h
jnb Nub0 ;如果是字符则调用0号(字符串显示)功能
cmp ah,0eh
jeNub1 ;如果退格键则调用1号(字符串删除)功能
cmp ah,1ch
jeNub2 ;如果是Enter则调用2号(字符串结束)功能
jmp scan
Nub0: mov dl,al
mov al,0
jmpfun_tab ;进入功能地址表取功能地址
Nub1: mov al,1
jmpfun_tab
Nub2:mov al,2
fun_tab: add al,al
mov ah,0
mov bx,ax
jmp word ptr table ;调用各功能
showstr: mov al,dl
cmp al,0
jequit ;判断字符串是否结束
mov byte ptr es:,al
add di,2
jmpscan
delchar: cmp di,cx
je scan
sub di,2
mov byte ptr es:,' '
jmpscan
endstr: mov dl,0 ;如果是Enter,则结束字符串输入
jmp showstr
quit:ret
code ends
end start
页:
[1]