首页 > 代码库 > [汇编] 统计字符

[汇编] 统计字符

 1 ;编写一个有主程序和子程序结构的程序模块。
 2 ;子程序的参数是一个N字节数组的首地址TABLE,数N及字符CHAR。
 3 ;要求在N字节数组中查找字符CHAR,并记录该字符出现的次数。
 4 ;主程序则要求从键盘接收一串字符以建立字节数组TABLE,
 5 ;并逐个显示从键盘输入的每个字符CHAR以及它在TABLE数组中出现的次数。
 6 ;(为简化起见,假设出现次数≤15,可以用16进制形式把它显示出来。)
 7 
 8 data segment
 9     table   db  255 dup(0)
10     n       dw  255
11     char    db  0
12     num     db  0
13 ends
14 
15 stack segment
16     dw      100     dup(?)  
17     tos     label   word     
18 ends
19 
20 code segment    
21 main    proc    far
22     assume  cs:code,ds:data,ss:stack
23 start:  
24     mov     ax,stack    ;预处理
25     mov     ss,ax
26     mov     sp,offset tos
27     push    ds
28     sub     ax,ax
29     mov     ax,data
30     mov     ds,ax
31 begin:
32     mov     bx,0        ;table数组的指针
33     mov     cx,255      ;下面loop循环的次数
34 input:                  ;循环输入字符串,遇到
35     mov     ah,1
36     int     21h
37     cmp     al,0DH      ;输入换行跳出循环
38     jz      set_n
39     mov     table[bx],al
40     inc     bx          ;加1不影响cf
41     loop    input
42 set_n:                  ;循环结束后把数组大小bx给n,然后等待字符输入
43     mov     n,bx
44     call    disp_crlf
45 input_char:
46     mov     ah,1        ;从键盘接收一个字符的DOS功能调用al等于输入内容
47     int     21h   
48     cmp     al,0DH      ;如果输入为换行就停止
49     jz      exit
50     mov     char,al     ;将输入内容给char
51     call    search      ;调用统计函数
52     mov     dl,-      ;显示一个分隔符
53     mov     ah,02h
54     int     21h
55     mov     dl,num      ;计算的结果放在num中,传入dl中
56     add     dl,30H      ;把dl转换为ascial码并输出
57     cmp     dl,39H
58     jbe     next
59     add     dl,07H        
60 next: 
61     mov     ah,2
62     int     21H
63     call    disp_crlf
64     jmp     short   input_char
65 exit:   
66     ret  
67 main endp
68 ;---------------------------------
69 search  proc    near
70     mov     si,0        ;table指针
71     mov     cx,n        ;循环次数
72     mov     num,0       ;计算个数
73     mov     al,char     ;把待查自符放在al中
74 rotate:                 ;循环查找,找到就num++
75     cmp     al,table[si]
76     jnz     rotate1
77     inc     num
78 rotate1:
79     inc     si
80     loop    rotate
81     ret
82 search  endp
83 ;--------------------------------
84 disp_crlf   proc    near;换行子函数   
85     mov     dl,0DH
86     mov     ah,02H
87     int     21H 
88     mov     dl,0AH
89     mov     ah,02H
90     int     21H 
91     ret
92 disp_crlf   endp
93 ;-------------------------------
94 code    ends
95 end     start
96