汇编语言程序设计

编写一个有主程序和子程序的程序模块,子程序参数是一个N字节数的首地址TABLE,数N及字符CHR,要求在N个字节数组中查找字符CHAR,并记录该字符出现的次数。要求在主程序中输入字符串存入TABLE中,然后再输入要查找的字符CHR,输出显示字符CHR在TABLE中出现的次数。请给出必要的注释,谢谢。

; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code
; -----------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -----------------------------------------
; 功能:输出回车换行
Output_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
Output_CTLF endp
; -----------------------------------------
; 功能:把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
; 入口:AX=二进制数
; 出口:在当前光标位置显示转换后的ASCII码数字
Dec_ASCII Proc Near
push dx
push bx
push di
mov bx,10
lea di,@@Temp_Save[6]
mov byte ptr [di],'$'
dec di
cld
@@Divide: xor dx,dx
div bx
or dl,30h
mov [di],dl
dec di
test ax,0ffffh
jnz @@Divide
inc di
push di
pop dx
mov ah,9
int 21h
pop di
pop bx
pop dx
ret
@@Temp_Save db 7 dup(?)
Dec_ASCII EndP
; -----------------------------------------
; 功能:在N个字节数组中查找字符CHAR,并记录该字符出现的次数。
; 入口参数:
; si=一个N字节数的字符串TABLE首地址
; cx=字符串长度,N
; ah=要查找的字符
; 出口参数:bl=该字符出现的次数
Find_Chr Proc Near
@@Find_Chr: lodsb
cmp al,ah ;是指定的字符?
jnz $+4 ;不是
inc bl ;是,计数
loop Find_Chr ;判断下一个字符
ret
Find_Chr EndP
; -----------------------------------------
Prompt_Str db 'Please input a string: $' ;输入字符串提示信息
No_String db 'The string is null.$' ;空字符串提示信息
Prompt_Chr db 'Please input a charactor: $' ;输入字符提示信息
Prompt_CNT db 'The specified charactor in th string TABLE: $' ;指定字符出现次数提示信息
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
cld
Input_Str: Output Prompt_Str ;提示输入字符串
lea dx,TABLE ;字符串缓冲区地址
mov ah,0ah
int 21h
call Output_CTLF ;输出一个回车、换行
lea si,TABLE[1] ;实际输入的字符串长度地址
lodsb ;读入这个长度N
test al,0ffh ;N=0?
jnz Read_Chr ;否,转去输入一个字符
Output No_String ;空字符串提示信息
jmp Input_Str ;重新输入字符串
Read_Chr: Output Prompt_Chr ;提示输入字符
mov ah,1 ;从键盘输入一个字符
int 21h
cmp al,1bh
jz Exit_Proc ;若按键为Esc,则结束程序
cmp al,20h ;控制及通讯字符?
jb Read_Chr ;重新输入字符
call Output_CTLF ;输出一个回车、换行
call Output_CTLF ;输出一个回车、换行
push ax
Output Prompt_CNT ;提示指定字符出现次数提示
pop ax
mov ah,al ;指定的字符送ah保存
lea si,TABLE[1] ;实际输入的字符串长度地址
lodsb ;读入这个长度N
mov cl,al
xor ch,ch ;N=cx
xor bl,bl ;计数器,计数指定字符在字符串中出现的次数
call Find_Chr ;在N个字节数组中查找字符CHAR,并记录该字符出现的次数
mov al,bl
xor ah,ah
call Dec_ASCII ;把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
Exit_Proc: mov ah,4ch ;结束程序
int 21h
TABLE db 255 ; 字符串缓冲区
Code ENDS
END Start ;编译到此结束
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-06-05
比较
相似回答