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 25511 char db 012 num db 013 ends14 15 stack segment16 dw 100 dup(?) 17 tos label word 18 ends19 20 code segment 21 main proc far22 assume cs:code,ds:data,ss:stack23 start: 24 mov ax,stack ;预处理25 mov ss,ax26 mov sp,offset tos27 push ds28 sub ax,ax29 mov ax,data30 mov ds,ax31 begin:32 mov bx,0 ;table数组的指针33 mov cx,255 ;下面loop循环的次数34 input: ;循环输入字符串,遇到35 mov ah,136 int 21h37 cmp al,0DH ;输入换行跳出循环38 jz set_n39 mov table[bx],al40 inc bx ;加1不影响cf41 loop input42 set_n: ;循环结束后把数组大小bx给n,然后等待字符输入43 mov n,bx44 call disp_crlf45 input_char:46 mov ah,1 ;从键盘接收一个字符的DOS功能调用al等于输入内容47 int 21h 48 cmp al,0DH ;如果输入为换行就停止49 jz exit50 mov char,al ;将输入内容给char51 call search ;调用统计函数52 mov dl,'-' ;显示一个分隔符53 mov ah,02h54 int 21h55 mov dl,num ;计算的结果放在num中,传入dl中56 add dl,30H ;把dl转换为ascial码并输出57 cmp dl,39H58 jbe next59 add dl,07H 60 next: 61 mov ah,262 int 21H63 call disp_crlf64 jmp short input_char65 exit: 66 ret 67 main endp68 ;---------------------------------69 search proc near70 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 rotate177 inc num78 rotate1:79 inc si80 loop rotate81 ret82 search endp83 ;--------------------------------84 disp_crlf proc near;换行子函数 85 mov dl,0DH86 mov ah,02H87 int 21H 88 mov dl,0AH89 mov ah,02H90 int 21H 91 ret92 disp_crlf endp93 ;-------------------------------94 code ends95 end start96