;
设计一个对整数的滑动平均滤波
程序,数据由用户输入
;用户输入一组数据(-9999至+9999),每个数以回车键结束,全部数据输入完毕,以空格键结束
DATASSEGMENT
;此处输入数据段代码
INPUT_MESSAGEDB0AH,'PLEASEINPUTYOURNUMBERS(EVERYNUMBERLESSTHAN5FIGURES):$'
CHANGE_LINEDB0AH,'$'
QUIT_MESSAGEDB0AH,'ENTERQORqTOQUITORANYOTHERTOCONTINUE:$'
IN_ASC_BUFDB6;十进制数的输入缓冲区,共可接收6个字符
DB?;保留,用于10号调用时DOS填入实际输入字符个数
DB6DUP(?);一个符号位,四位数字ASCII码,加上一个回车符,共计6字符
BIN_BUF1DW100DUP(?);一个数转换为二进制后,放于此处
BIN_BUF2DW100DUP(?);滑动平均滤波处理后的数,放于此处
OUTPUT_MESSAGEDB0AH,'THEOUTCOMNUMBERSIS:','$'
OUT_ASC_AVERAGEDB6DUP(?),'$';将滑动滤波后的数转换为ASCII码后的值,放于此处
;循环调用以供9号调用显示
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
DB200DUP(?)
STACKSENDS
CODESSEGMENT
ASSUMECS:CODES,DS:DATAS,SS:STACKS
MAINPROCFAR
START:
MOVAX,DATAS
MOVDS,AX
;键盘输入一组数,将其ASCII码值并保存转换为二进制在BIN_BUF1中
CALLINPUT
;对所输入数组中的数进行中间值滤波,放入BIN_BUF2中
CALLShift_average
;将中值滤波后的数(存放在BIN_BUF2)从二进制形式转换为ASCII码值一一输出
CALLOUTPUT
;一组数滤波显示完毕,等待下一步用户操作
;退出或继续
MOVDX,OFFSETQUIT_MESSAGE
MOVAH,9
INT21H
MOVAH,1
INT21H
CMPAL,'Q'
JZOVER
CMPAL,'q'
JZOVER
JMPSTART
OVER:MOVAH,4CH
INT21H
MAINENDP
INPUTPROC
;键盘输入一组数,将其ASCII码值并保存转换为二进制在BIN_BUF1中
;入口:键盘输入小于100个十进制数
;出口:数据二进制形式存放在BIN_BUF1中
;算法:输入一个数,就调用ASC_TO_BIN子程序,将其转换成二进制形式,并保存于BIN_BUF1中,
;循环调用INPUT1,将输入的一组数全部转换为二进制,存于BIN_BUF1中
MOVSI,OFFSETBIN_BUF1;将输入的数转换为ASCII码值后,放在BIN_BUF1开始的单元中
MOVDI,0
PUSHSI;计输入数的个数
MOVDX,OFFSETINPUT_MESSAGE;提示输入一个数
MOVAH,9
INT21H
INPUT1:INCDI
MOVDX,OFFSETIN_ASC_BUF;缓冲输入一个数(一位符号位,小于等于四位数字位,一位回车符)
MOVAH,10
INT21H
PUSHSI
CALLASC_TO_BIN;转换当前输入的数为二进制
POPSI
MOV[SI],AX;依次保存输入数至数组BIN_BUF1中
ADDSI,2
PUSHAX
MOVDX,OFFSETCHANGE_LINE;换行
MOVAH,9
INT21H
POPAX
CMPAX,20H
JNZINPUT1
RET
INPUTENDP
OUTPUTPROC
;将滤波处理后的存于BIN_BUF2中的数,由二进制转换为十进制,一一显示
;入口:键盘输入的数经滤波处理后以二进制形式存于BIN_BUF2中
;出口:以十进制显示滤波处理后的一组数数
;算法:从BIN_BUF2中读入一个数,调用BIN_TO_ASCII将其转换为十进制的ASCII码输出
;循环调用OUTPUT1,将输入的一组数全部转换为十进制的ASCII码输出
;输出提示信息
MOVDX,OFFSETOUTPUT_MESSAGE
MOVAH,9
INT21H
DECDI
MOVSI,OFFSETBIN_BUF2
;待显示数在输出数组BIN_BUF2中,循环调用OUTPUT1将其转换为ASCII码值显示
OUTPUT1:MOVAX,[SI]
CALLBIN_TO_ASCII;将二进制数转换为其ASCII码值,以供显示用
MOVDX,OFFSETOUT_ASC_AVERAGE
MOVAH,9
INT21H
ADDSI,2
DECDI
CMPDI,0
JNZOUTPUT1
RET
OUTPUTENDP
ASC_TO_BINPROC
;ASCII码转换为二进制数
;入口:十进制数的ASCII码在IN_ASC_BUF内
;出口:转换后的二进制数在AX内
;算法:先将其转换成十进制数字,再用累加和乘10加X的方法变成二进制数,如将
;358转换为二进制数,可先将累加和赋0,再计算(((0*10+3)*10+5)*10+8),结果为二
;进制数,再由符号位决定是否需要求补。
&nb