汇编语言(二十八)之统计单词
输入一行字符串,统计单词SUN出现的个数
程序运行:
代码:
datas segment
ENG_max_length db 0ffh
ENG_length db 0
ENG db 100h dup(?)
eng_len dw 0
SUN db 'SUN'
sun_len dw $-SUN
count dw 0
input db 'input a line:$'
output db 0DH,0AH,'SUN count:$'
datas ends
stacks segment stack
db 100h dup(?)
stacks ends
codes segment
assume cs:codes,ds:datas,ss:stacks
main proc far
start:
push ds
mov ax,0h
push ax
mov ax,datas ;初始化ds
mov ds,ax
lea dx,input
mov ah,9
int 21h
lea dx,ENG_max_length
mov ah,10
int 21h
mov al,ENG_length
xor ah,ah
mov eng_len,ax
xor si,si
xor di,di
mov bp,sun_len ;取查找单词的长度
dec bp ;长度减1,指向SUN最后一单元
mov cx,eng_len ;取ENG的长度
mov dx,0 ;记录查找SUN出现的次数
s:
mov al,ENG[si]
cmp SUN[di],al ;比较SUN[di]与al
jnz not_same ;若不相等,跳转
cmp di,bp ;判断di是否指向SUN最后一单元
jz match ;若是,则进行单词左右匹配
inc di ;若不是,di加1
jmp next ;跳转至下一次循环
match: ;单词左右匹配
mov di,si ;取单词的左边索引
sub di,sun_len
cmp di,0 ;判断左边索引是否小于0
jl judge_right ;若小于0,则判断单词右边索引
mov bl,ENG[di]
and bl,11011111b ;将单词左边的字母转成大写
cmp byte ptr bl,'A' ;判断该字母是否小于'A'
jb judge_right ;若小于'A',则判断单词右边索引
cmp byte ptr bl,'Z' ;判断该字母是否大于'Z'
ja judge_right ;若大于'Z',则判断单词右边索引
jmp not_same ;否则跳转至不匹配
judge_right: ;单词的右匹配
mov di,si ;取单词的右匹配索引
inc di
cmp di,eng_len ;判断右匹配索引是否越界
jz same ;若越界,则匹配
mov bl,ENG[di] ;右匹配的字母转换成大写
and bl,11011111b
cmp byte ptr bl,'A' ;判断该字母是否小于'A'
jb same ;若小于'A',则匹配
cmp byte ptr bl,'Z' ;判断该字母是否大于'Z'
ja same ;若大于'Z',则匹配
jmp not_same ;否则不匹配
same:
inc dx ;匹配,则计算器加1
mov di,0 ;di索引置0
jmp next ;跳转置下一次循环
not_same:
xor di,di ;di置0
next:
inc si
loop s
mov count,dx
lea dx,output
mov ah,9
int 21h
mov ax,count
call decimal
ret
main endp
decimal proc near uses ax bx cx dx
mov bx,10
mov cx,0
de:
xor dx,dx
div bx
push dx
inc cx
cmp ax,0
jnz de
de1:
pop dx
add dl,30h
mov ah,2
int 21h
loop de1
ret
decimal endp
codes ends
end main