- [springaccount] 请问下我虚拟机安装完毕后怎么还不行调试哦 能否请大虾给个完整的调试过程呢 谢拉 03/31 20:25
- [michael1947] 一个软盘怎么分的A和B,我知道0面为A,1面为B,可是怎么让DOS系统知道啊,我这里输入B:,就提示 03/05 17:13
- [游客] 我按照你说的帖子用bochs模拟了dos,然后就不知道该干什么了。。。。。。到底应该如何验证啊?怎么 12/24 15:36
- [游客] 花了8天60+小时,中间的曲折和艰辛实在是。。。不过还好我挺过来了,一直一直没有放弃,我坚信付出总会 07/14 13:39
- [游客] 因为nochar 就表示非ASCII键 即没有对应ASCII的键盘输入 所以我用扫描码来判断 06/30 14:19
- [游客] 我觉得你的程序没有什么逻辑上的问题啊。出现了你的错误提示,说明这个输入的字符ascii码小于20H, 06/30 11:53
- [游客] 嗯。我觉得,不能in 16H等待键盘输入,别的就不能运行了不是,所以,肯定应该开中断的。 06/23 15:32
- [zhenglxd] 回楼上的这个 out of range是我自己设计的,如果当ah>3 或者al>7 就会提示out 06/23 09:47
- [游客] 功能设计的不错。不过在运行过程中,设置完背景色后,就会出错退出。博主自己在检查一下。在command 06/20 12:05
- [游客] 苍天弄人,亦成人 支持博主 06/19 20:59
[2009-06-29 15:04] 自己独立设计的17.3完整程序,输入显示字符窜允许删除,enter键表示输入结束,报错非ASCII显示
;自己独立设计的17.3完整程序,输入显示字符窜允许删除,enter键表示输入结束,报错非ASCII显示
assume cs:code,ss:charstack
charstack segment
db 1024 dup(0)
table dw a,b
a db 'please input some string :',0
b db 'Warning:can not show it',0
charstack ends
code segment
start: mov ax,charstack
mov ss,ax
mov sp,128
mov di,16*160
mov si,ss:table[0]
mov bx,2 ;前后景
call showstr
;显示请求输入字符窜,输入字符窜在请求信息后
mov bx,7 ;默认前后景
mov si,0
input:mov ah,0
int 16h
cmp al,20h
jb nochar
mov ss:[si],al
call showstr
jmp input
;显示输入的字符窜,对于非ASCII码字符转入nochar
nochar: cmp ah,1ch
je enter
cmp ah,0eH
je backspace
push si
mov si,ss:table[2]
push di
mov di,23*160
push bx
mov bl,4
call showstr
pop bx
pop di
pop si
jmp input
;nochar作用,报错无ASCII码字符并返回等待重新输入,处理backspace键和enter键
backspace:cmp si,0
je input
push bx
mov bh,1
call showstr
pop bx
mov byte ptr ss:[si],0
dec si
jmp input
enter: mov ax,4c00h
int 21h
showstr:push ds
push es
push si
mov si,ss
mov ds,si
mov si,0b800h
mov es,si
pop si
cmp bh,1
je subshowstr
cld
ls:cmp byte ptr ds:[si],0
je over
movsb
mov byte ptr es:[di],bl
inc di
jmp ls
subshowstr:dec di
dec di
mov word ptr es:[di],' '
over: pop es
pop ds
ret
;showstr作用:显示字符,必要参数si=源地址址,di=目标地址
; 默认参数 ds=ss,es=0b800h
; 可选参数 bx, bl=颜色,bh=1为启动subshowstr
code ends
end start
assume cs:code,ss:charstack
charstack segment
db 1024 dup(0)
table dw a,b
a db 'please input some string :',0
b db 'Warning:can not show it',0
charstack ends
code segment
start: mov ax,charstack
mov ss,ax
mov sp,128
mov di,16*160
mov si,ss:table[0]
mov bx,2 ;前后景
call showstr
;显示请求输入字符窜,输入字符窜在请求信息后
mov bx,7 ;默认前后景
mov si,0
input:mov ah,0
int 16h
cmp al,20h
jb nochar
mov ss:[si],al
call showstr
jmp input
;显示输入的字符窜,对于非ASCII码字符转入nochar
nochar: cmp ah,1ch
je enter
cmp ah,0eH
je backspace
push si
mov si,ss:table[2]
push di
mov di,23*160
push bx
mov bl,4
call showstr
pop bx
pop di
pop si
jmp input
;nochar作用,报错无ASCII码字符并返回等待重新输入,处理backspace键和enter键
backspace:cmp si,0
je input
push bx
mov bh,1
call showstr
pop bx
mov byte ptr ss:[si],0
dec si
jmp input
enter: mov ax,4c00h
int 21h
showstr:push ds
push es
push si
mov si,ss
mov ds,si
mov si,0b800h
mov es,si
pop si
cmp bh,1
je subshowstr
cld
ls:cmp byte ptr ds:[si],0
je over
movsb
mov byte ptr es:[di],bl
inc di
jmp ls
subshowstr:dec di
dec di
mov word ptr es:[di],' '
over: pop es
pop ds
ret
;showstr作用:显示字符,必要参数si=源地址址,di=目标地址
; 默认参数 ds=ss,es=0b800h
; 可选参数 bx, bl=颜色,bh=1为启动subshowstr
code ends
end start
评论次数(2) |
浏览次数(1888) |
类型(汇编作业) |
收藏此文 |
[ 游客 发表于 2009-06-30 11:53 ]
我觉得你的程序没有什么逻辑上的问题啊。出现了你的错误提示,说明这个输入的字符ascii码小于20H,且不是回车或退格,我运行试了几次,在正常输入情况下没有发现问题,当输入tab等键是,也能正常提示出错误信息,然后此错误信息会一直存在,是不是这个现象引起的错觉?我按照你图示的样子试了,没发现异常,然后看了一下你的逻辑,也没找到什么可疑的地方。
不过,不知道为什么在nochar中在进行回车和退格的判断你要用扫描码,而不是用ascii码呢?
[ 游客 发表于 2009-06-30 14:19 ]
因为nochar 就表示非ASCII键 即没有对应ASCII的键盘输入 所以我用扫描码来判断