【求救】(汇编)编程,对输入的一串字符串进行统计

lgh0223 2010-12-11 04:09:15

;程序如下:
;
data segment
inmsg db 'please input a string:',0dh,0ah,'$' ;输入提示信息
indat db 0ffh,0,0ffh dup(0) ;输入缓冲区
cmsg db 0dh,0ah,'the count of Capital is: $'
nmsg db 'the count of Number is: $'
lmsg db 'the count of Lowercase is: $'
omsg db 'the count of Other char is: $'
csum db 0,0,0dh,0ah,'$' ;大写计数器
nsum db 0,0,0dh,0ah,'$' ;数字计数器
lsum db 0,0,0dh,0ah,'$' ;小写计数器
osum db 0,0,0dh,0ah,'$' ;其它字符计数器
data ends
code segment
assume cs:code,ds:data
start:mov ax,data
mov ds,ax
mov dx,offset inmsg
mov ah,9
int 21h
mov dx,offset indat ;输入字符串
mov ah,10
int 21h
mov si,offset indat+1
mov cl,[si] ;字符串长度存CL
compare:
inc si
cmp byte ptr [si],'0'
jb other
cmp byte ptr [si],'9' ;检查是否数字
jbe number
cmp byte ptr [si],'A'
jb other
cmp byte ptr [si],'Z' ;是否大写字母
jbe capital
cmp byte ptr [si],'a'
jb other
cmp byte ptr [si],'z' ;是否小写字母
ja other
;下面这个代码段看不太懂,相加的高低位和显示的高低位刚好相反的话,也就是说
;mov ax,word ptr [lsum]这里边AH里装的是要显示的低位,AL...那之后又为什么又XCHG了呢
;这样不是又回到原来原来高BITE装要显示输出的低位了?
lowercase:
mov ax,word ptr [lsum] ;小写字母次数送AX,准备加1
xchg al,ah ;交换是因为相加的高低位和显示的高低位刚好相反
add al,1
aaa ;低位加1后调整
mov bl,al
mov al,ah
add al,0
aaa ;高位调整,不用ADC指令是因为AAA指令已经把进位送进AH中了。
mov bh,al
xchg bl,bh
mov word ptr [lsum],bx ;加1后送回计数器单元
dec cl
jnz compare
jmp disp
number:
mov ax,word ptr nsum ;步骤同上。
xchg al,ah
add al,1
aaa
mov bl,al
mov al,ah
add al,0
aaa
mov bh,al
xchg bl,bh
mov word ptr nsum,bx
dec cl
jnz compare
jmp disp
capital:
mov ax,word ptr csum
xchg al,ah
add al,1
aaa
mov bl,al
mov al,ah
add al,0
aaa
mov bh,al
xchg bl,bh
mov word ptr csum,bx
dec cl
jnz compare
jmp disp
other:
mov ax,word ptr osum
xchg al,ah
add al,1
aaa
mov bl,al
mov al,ah
add al,0
aaa
mov bh,al
xchg bl,bh
mov word ptr osum,bx
dec cl
jnz compare
jmp disp

disp: add word ptr csum,3030h ;4个种类计数器的内容变成ASCII码,准备显示
add word ptr nsum,3030h
add word ptr lsum,3030h
add word ptr osum,3030h
mov dx,offset cmsg ;以下分别显示各种类次数。
mov ah,9
int 21h
mov dx,offset csum
mov ah,9
int 21h
mov dx,offset nmsg
mov ah,9
int 21h
mov dx,offset nsum
mov ah,9
int 21h
mov dx,offset lmsg
mov ah,9
int 21h
mov dx,offset lsum
mov ah,9
int 21h
mov dx,offset omsg
mov ah,9
int 21h
mov dx,offset osum
mov ah,9
int 21h
mov ah,4ch
int 21h
code ends
end start
...全文
232 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
shzhfu 2010-12-12
  • 打赏
  • 举报
回复
lsum db 0,0,0dh,0ah,'$' ;小写计数器

由于希望将结果变成字符串存放在这里,最后用显示字符串的形式输出结果。所以lsum开始的字单元中,低地址lsum+0存放的是十位数,为高地址lsum+1处是个位数。所以出现后面的解释“相加的高低位和显示的高低位刚好相反”,即
ax,word ptr [lsum]
后,al是十位数的非压缩BCD码,AH是个位数的非压缩BCD码,因此要把它们的位置换正确了才能做非压缩BCD的加1操作:
add al,1 ;相当于个位数加1
aaa ;做非压缩BCD码的调整,本程序中,只有当al中个位数原来为‘9’时,加1变成‘0’,经过调整可以使al变成0,且ah加个位数的进位1。
mov bl,al ;因为调整指令aaa必须在al中进行,所以要把十位数的ah放在al中调整,把原来的个位数转到bl中
mov al,ah ;十位数放al
add al,0 ;因为AAA指令已经把进位送进AH中了,这里加0是为了把前面al=‘9’时调整产生的辅助进位标志af和cf清零。主要是af,个位数为9时,加1调整,个位数为0了,把af和cf都置为了1,下面的aaa调整,会被当成因“逢十六而进的一”进行调整,给个位数“补回”本应“逢十进一”被多进上去的6。
aaa ;进行调整。同样只有当al中十位数原来为‘9’时,加1变成‘0’,经过调整可以使al变成0,且ah加个位数的进位1.
;但表示百位数的ah,后面没丢弃了。
mov bh,al ;调整后的十位数放bh
xchg bl,bh ;与最前面描述相同的原因,交换个位于十位的位置,放回lsum单元
mov word ptr [lsum],bx
lgh0223 2010-12-11
  • 打赏
  • 举报
回复
解释一下lowercase:代码段就可以,3Q3Q!!!!!

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧