求教:以下程序有很么不妥的,格式不好,还有不知道为什么输入的最后一个字符会填满整个第一行
时间:2011-05-15
来源:互联网
程序功能:
从键盘一系列字符一会车符结束,并按照字母、数字和其他字符分类统计其对应的个数,然后将结果以16进制数形式显示在屏幕上。
代码如下:
data segment
string label byte
max db 80
act db ?
stokn db 80 dup(?)
digit db 0
Letter db 0
other db 0
mess1 db 'Please input chars:','$'
mess2 db 0dh,0ah,'$'
mess3 db ' digit : ','$'
mess4 db 'letter : ','$'
mess5 db ' other : ','$'
mess6 db 'h ','$'
n db 3
data ends
code segment
assume cs:code,ds:data
COUNT proc far
mov ah, 2
mov dl, 0ah
int 21h
push ds
sub ax, ax
push ax
mov ax, data
mov ds, ax
lea dx, mess1
mov ah, 09
int 21h
mov ah, 2
mov dl, 0ah
int 21h
lea dx, string
mov ah, 0ah
int 21h
lea dx, mess2
mov ah, 09h
int 21h
lea si, stokn
sub ch, ch
mov cl, act
again: mov al, [si]
cmp al, 30h
jl other1
cmp al, 3ah
jl digit1
cmp al, 41h
jl other1
cmp al, 5bh
jl letter1
cmp al, 61h
jl other1
cmp al, 7bh
jl letter1
other1: inc other
inc si
loop again
jmp print
digit1: inc digit
inc si
loop again
jmp print
letter1:inc letter
inc si
loop again
print:
mov ch, 2
mov ah, 09
mov bl, 01h
int 10h
mov ah, 2
mov dl, 0ah
int 21h
mov bl, digit
lea dx, mess3
mov ah, 09
int 21h
rotate: mov cl, 4
rol bl, cl
mov al, bl
and al, 0fh
add al, 30h
cmp al, 3ah
jl print1
add al, 7h
print1: mov dl, al
mov ah, 2
int 21h
dec ch
jnz rotate
lea dx, mess6
mov ah, 09
int 21h
dec n
cmp n, 2
jz letter2
cmp n, 1
jz other2
jmp exit
letter2:
mov ah, 2
mov dl, 0ah
int 21h
lea dx, mess4
mov ah, 09
int 21h
mov ch, 2
mov bl, letter
jmp rotate
other2:
mov ah, 2
mov dl, 0ah
int 21h
lea dx, mess5
mov ah, 09
int 21h
mov ch, 2
mov bl, other
jmp rotate
exit:
mov ah, 2
mov dl, 0ah
int 21h
ret
COUNT endp
code ends
end COUNT
结果:
从键盘一系列字符一会车符结束,并按照字母、数字和其他字符分类统计其对应的个数,然后将结果以16进制数形式显示在屏幕上。
代码如下:
data segment
string label byte
max db 80
act db ?
stokn db 80 dup(?)
digit db 0
Letter db 0
other db 0
mess1 db 'Please input chars:','$'
mess2 db 0dh,0ah,'$'
mess3 db ' digit : ','$'
mess4 db 'letter : ','$'
mess5 db ' other : ','$'
mess6 db 'h ','$'
n db 3
data ends
code segment
assume cs:code,ds:data
COUNT proc far
mov ah, 2
mov dl, 0ah
int 21h
push ds
sub ax, ax
push ax
mov ax, data
mov ds, ax
lea dx, mess1
mov ah, 09
int 21h
mov ah, 2
mov dl, 0ah
int 21h
lea dx, string
mov ah, 0ah
int 21h
lea dx, mess2
mov ah, 09h
int 21h
lea si, stokn
sub ch, ch
mov cl, act
again: mov al, [si]
cmp al, 30h
jl other1
cmp al, 3ah
jl digit1
cmp al, 41h
jl other1
cmp al, 5bh
jl letter1
cmp al, 61h
jl other1
cmp al, 7bh
jl letter1
other1: inc other
inc si
loop again
jmp print
digit1: inc digit
inc si
loop again
jmp print
letter1:inc letter
inc si
loop again
print:
mov ch, 2
mov ah, 09
mov bl, 01h
int 10h
mov ah, 2
mov dl, 0ah
int 21h
mov bl, digit
lea dx, mess3
mov ah, 09
int 21h
rotate: mov cl, 4
rol bl, cl
mov al, bl
and al, 0fh
add al, 30h
cmp al, 3ah
jl print1
add al, 7h
print1: mov dl, al
mov ah, 2
int 21h
dec ch
jnz rotate
lea dx, mess6
mov ah, 09
int 21h
dec n
cmp n, 2
jz letter2
cmp n, 1
jz other2
jmp exit
letter2:
mov ah, 2
mov dl, 0ah
int 21h
lea dx, mess4
mov ah, 09
int 21h
mov ch, 2
mov bl, letter
jmp rotate
other2:
mov ah, 2
mov dl, 0ah
int 21h
lea dx, mess5
mov ah, 09
int 21h
mov ch, 2
mov bl, other
jmp rotate
exit:
mov ah, 2
mov dl, 0ah
int 21h
ret
COUNT endp
code ends
end COUNT
结果:

作者: dfhuang09 发布时间: 2011-05-15
1、格式不好
******************************************
是因为在程序中你只用到了“换行”而没有“回车”。
可在mess1和mess6的定义中添加一个0dh(回车的ASCII码),如:
mess1 db 'Please input chars:',0dh,'$'
mess6 db 'h ',0dh,'$'
2、输入的最后一个字符会填满整个第一行
******************************************
是因为你在print的开始处用到了int 10h的 09功能。该功能在当前光标处重复显示字符(最多显示一行),其中al=字符,bl=属性或颜色,cx=重复输出字符的字数。很明显,当程序执行到print处,al存储的就是最后输入的字符,cx=0,而你又在print的首句将cx赋值成了0200h,所以就会重复显示最后一个字符。
解决:
没看出此处int 10h作何用,我觉得可将
mov ch, 2
mov ah, 09
mov bl, 01h
int 10h
这部分代码删掉。
如果它有作用,那么就将print标号的首句代码 mov ch, 2移至rotate标号之前。
******************************************
是因为在程序中你只用到了“换行”而没有“回车”。
可在mess1和mess6的定义中添加一个0dh(回车的ASCII码),如:
mess1 db 'Please input chars:',0dh,'$'
mess6 db 'h ',0dh,'$'
2、输入的最后一个字符会填满整个第一行
******************************************
是因为你在print的开始处用到了int 10h的 09功能。该功能在当前光标处重复显示字符(最多显示一行),其中al=字符,bl=属性或颜色,cx=重复输出字符的字数。很明显,当程序执行到print处,al存储的就是最后输入的字符,cx=0,而你又在print的首句将cx赋值成了0200h,所以就会重复显示最后一个字符。
解决:
没看出此处int 10h作何用,我觉得可将
mov ch, 2
mov ah, 09
mov bl, 01h
int 10h
这部分代码删掉。
如果它有作用,那么就将print标号的首句代码 mov ch, 2移至rotate标号之前。
作者: simajian_gg 发布时间: 2011-05-16
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28