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