+ -
当前位置:首页 → 问答吧 → 求教:以下程序有很么不妥的,格式不好,还有不知道为什么输入的最后一个字符会填满整个第一行

求教:以下程序有很么不妥的,格式不好,还有不知道为什么输入的最后一个字符会填满整个第一行

时间: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


结果:

作者: 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标号之前。

作者: simajian_gg   发布时间: 2011-05-16