|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 kane080824 于 2011-11-30 22:01 编辑
王爽老师17.3章节实现字符串输入用了建立字符栈的方法,其本意应该是是为了让我们多多练习直接定址表和功能模块化,但由此也产生一个问题,由于使用字符栈,每次字符的增加或删减字符串都要重新显示,理论上说有损效率,因为习惯上每输入一个字符不需要每次重新显示之前已输入的字符,删除同理,所以决定抛弃字符栈.
程序框架图
程序运行截图
程序代码:
assume cs:code
code segment
table dw showstr,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
je Nub1 ;如果退格键则调用1号(字符串删除)功能
cmp ah,1ch
je Nub2 ;如果是Enter则调用2号(字符串结束)功能
jmp scan
Nub0: mov dl,al
mov al,0
jmp fun_tab ;进入功能地址表取功能地址
Nub1: mov al,1
jmp fun_tab
Nub2: mov al,2
fun_tab: add al,al
mov ah,0
mov bx,ax
jmp word ptr table[bx] ;调用各功能
showstr: mov al,dl
cmp al,0
je quit ;判断字符串是否结束
mov byte ptr es:[di],al
add di,2
jmp scan
delchar: cmp di,cx
je scan
sub di,2
mov byte ptr es:[di],' '
jmp scan
endstr: mov dl,0 ;如果是Enter,则结束字符串输入
jmp showstr
quit: ret
code ends
end start
|
|