汇编语言(二十八)之统计单词

汇编语言(二十八)之统计单词

输入一行字符串,统计单词SUN出现的个数

程序运行:

www.zeeklog.com  - 汇编语言(二十八)之统计单词

代码:


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