1、我是;;用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管
2、你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信 ;我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的
3、不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信 ;我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷
4、字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷
5、字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数 ;我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不
6、管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数 ;设计一个对整数的滑动平均滤波程序,数据由用户输入 ;用户输入一组数据(-9999至+9999),每个数以回车键结束,全部数据输入完毕,以空格键结束 DATAS SEGMENT
7、 ;此处输入数据段代码 INPUT_MESSAGE DB 0AH , 'PLEASE INPUT YOUR NUMBERS( EVERY NUMBER LESS THAN 5 FIGURES):$' CHANGE_LINE DB 0AH, '$' QUIT_MESSAGE DB 0AH, 'ENTER Q OR q TO QUIT OR ANY OTHER TO CONTINUE:$' IN_ASC_BUF DB 6 ;十进制数的输入缓冲区,共可接收6个字符 DB ?
8、 ;保留,用于10号调用时DOS填入实际输入字符个数 DB 6 DUP(?) ;一个符号位,四位数字ASCII码,加上一个回车符,共计6字符 BIN_BUF1 DW 100 DUP(?) ;一个数转换为二进制后,放于此处 BIN_BUF2 DW 100 DUP(?) ;滑动平均滤波处理后的数,放于此处 OUTPUT_MESSAGE DB 0AH , 'THE OUTCOM NUMBERS IS:' , '$' OUT_ASC_AVERAGE DB
9、 6 DUP(?) , '$' ;将滑动滤波后的数转换为ASCII码后的值,放于此处 ;循环调用以供9号调用显示 DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 DB 200 DUP(?) STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS MAIN PROC FAR START: MOV AX , DATAS MOV D
10、S , AX ;键盘输入一组数,将其ASCII码值并保存转换为二进制在BIN_BUF1中 CALL INPUT ;对所输入数组中的数进行中间值滤波,放入BIN_BUF2中 CALL Shift_average ;将中值滤波后的数(存放在BIN_BUF2)从二进制形式转换为ASCII码值一一输出 CALL
11、 OUTPUT ;一组数滤波显示完毕,等待下一步用户操作 ;退出或继续 MOV DX,OFFSET QUIT_MESSAGE MOV AH , 9 INT 21H MOV AH , 1 INT 21H CMP AL,'Q' JZ OVER CMP AL,'q'
12、 JZ OVER JMP START OVER: MOV AH , 4CH INT 21H MAIN ENDP INPUT PROC ;键盘输入一组数,将其ASCII码值并保存转换为二进制在BIN_BUF1中 ;入口:键盘输入小于100个十进制数 ;出口:数据二进制形式存放在BIN_BUF1中 ;算法: 输入一个数,就调用ASC_TO_BIN 子程序,将其转换成二进制形式,并保存于BIN_BUF1中, ;循环调用INPUT1,将输入的一组数全部转
13、换为二进制,存于BIN_BUF1中 MOV SI, OFFSET BIN_BUF1 ;将输入的数转换为ASCII码值后,放在BIN_BUF1开始的单元中 MOV DI,0 PUSH SI ;计输入数的个数 MOV DX , OFFSET INPUT_MESSAGE ;提示输入一个数 MOV AH , 9 INT 21H
14、 INPUT1: INC DI MOV DX , OFFSET IN_ASC_BUF ;缓冲输入一个数(一位符号位,小于等于四位数字位,一位回车符) MOV AH , 10 INT 21H PUSH SI CALL ASC_TO_BIN ;转换当前输入的数为二进制 POP SI
15、 MOV [SI] , AX ;依次保存输入数至数组BIN_BUF1中 ADD SI,2 PUSH AX MOV DX , OFFSET CHANGE_LINE ;换行 MOV AH , 9 INT 21H POP AX CMP AX,20H JNZ INPUT
16、1 RET INPUT ENDP OUTPUT PROC ;将滤波处理后的存于BIN_BUF2中的数,由二进制转换为十进制,一一显示 ;入口:键盘输入的数经滤波处理后以二进制形式存于BIN_BUF2中 ;出口:以十进制显示滤波处理后的一组数数 ;算法: 从BIN_BUF2中读入一个数,调用BIN_TO_ASCII 将其转换为十进制的ASCII码输出 ;循环调用OUTPUT1,将输入的一组数全部转换为十进制的ASCII码输出 ;输出提示信息
17、 MOV DX , OFFSET OUTPUT_MESSAGE MOV AH , 9 INT 21H DEC DI MOV SI,OFFSET BIN_BUF2 ;待显示数在输出数组BIN_BUF2中,循环调用OUTPUT1将其转换为ASCII码值显示 OUTPUT1: MOV AX,[SI] CALL BIN_TO_ASCII ;将二进制数转换为其ASCII码值
18、以供显示用 MOV DX , OFFSET OUT_ASC_AVERAGE MOV AH , 9 INT 21H ADD SI,2 DEC DI CMP DI,0 JNZ OUTPUT1 RET OUTPUT ENDP ASC_TO_BIN PROC ;ASCII码转换为二进制数 ;入口:十进制数的ASCII码在IN_ASC_BUF内 ;出口:转换后的二进制数在AX内 ;算法:先将其转换成十
19、进制数字,再用累加和乘10加X的方法变成二进制数,如将 ;358转换为二进制数,可先将累加和赋0,再计算(((0*10+3)*10+5)*10+8),结果为二 ;进制数,再由符号位决定是否需要求补。 ;PUSH SI MOV CL , IN_ASC_BUF+1 ;取字符个数 MOV CH , 0 DEC CL ;扣除符号位
20、 MOV BX,OFFSET IN_ASC_BUF+2 MOV AL,[BX] CMP AL,20H JZ EXI JMP GO EXI: MOV AL,20H ;0089 MOV AH,0 RET GO : MOV BX , OFFSET IN_ASC_BUF+3 ;调整BX指向十进制数的最高位 P
21、USH BX PUSH CX L1: MOV AL , [BX] AND AL , 0FH MOV [BX] , AL INC BX LOOP L1 ;将所有数字字符的高四位清0,使之变为数字值 POP CX POP BX MOV AX , 0
22、 ;累加和赋初值 MOV SI , 10 L2: MUL SI ADD AL , [BX] ADC AH , 0 INC BX LOOP L2 ;累加乘10 CMP IN_ASC_BUF+2 , '+' JZ L3 ;符号是正号,转
23、移 NEG AX ;符号是负号,求补 L3: ; POP SI RET ASC_TO_BIN ENDP BIN_TO_ASCII PROC ;将二进制数转换为对应十进制数数字的ASCII码 ;入口:二进制数在AX内 ;出口:转换后的ASCII码在OUT_ASC_ AVERAGE变量内 ;算法:AX中的数范围在+32767到-32768之间,先检查AX中的符号位,以决定输出“+” ;还是“-”,若是负数,
24、应先求补,得到原码后即可与正数作统一处理。转换方法为将被转换的 ;二进制数先除以10000,商;即为万位数,再将余数除以1000,商为千位数,以此类推,求出 ;百、十位数,剩下的为个位数。最后,将各个数加上30H,即成为对应字符。 MOV OUT_ASC_AVERAGE , '+' CMP AX , 0 JGE L4 MOV OUT_ASC_AVERAGE , '-' ;不是负数,转移
25、 NEG AX L4: CWD ;AX中的有符号字扩展为双字,扩展后的高16位存放在DX中 MOV BX , 10000 DIV BX ADD AL , 30H ;将万位转换为数字(商应在AX内,但因为商不大于3, ;所以有效部分在AL内)
26、 MOV OUT_ASC_AVERAGE +1 , AL ;保存万位数字 MOV AX , DX ;将余数置入AX内,以便当作被除数 CWD MOV BX , 1000 DIV BX ADD AL , 30H MOV OUT_ASC_AVERAGE +2 , AL ;保存千位数字 MOV AX , DX
27、 ;将余数置入AX内,以便当作被除数 MOV BL , 100 DIV BL ADD AL , 30H MOV OUT_ASC_AVERAGE +3 , AL ;保存百位数字 MOV AL , AH CBW ;将AL的最高有效位D7扩展至AH MOV BL , 10 DIV BL
28、 ADD AL , 30H MOV OUT_ASC_AVERAGE +4 , AL ;保存十位数字 ADD AH , 30H MOV OUT_ASC_AVERAGE +5 , AH ;保存个位数字 RET BIN_TO_ASCII ENDP ;求所输入数的滑动平均值,放入BIN_BUF2中 Shift_average PROC ;将输入的以二进制形式表达的数进行滑动平
29、均滤波 ;入口:原数组 在BIN_BUF1中 ;出口:滤波后的数组放入BIN_BUF2中 ;算法:原数组每三个为一个窗口大小,取一次平均值后代替窗口首端数字的值,然后将窗口顺 ;移一位,再继续取平均值,直到窗口内不足三个数为止,最后两个数保留原值 PUSH DI MOV CX,DI SUB CX,3 ;去掉空格符和最后两个数 MOV SI,OFFSET BIN_BUF1 MOV DI,OFFSET BIN_BUF2 L5: MOV AX,[SI] CMP AX, [SI+2] JB CO
30、NT MOV AX,[SI+2] CONT:CMP AX,[SI+4] JA CONN MOV AX,[SI+4] CMP AX,[SI+2] JB CONN MOV AX,[SI+2] CONN:MOV [DI],AX ADD SI,2 ADD DI,2 LOOP L5 MOV AL,[SI] MOV [DI],AL ADD SI,1 ADD DI,1 MOV AL,[SI] MOV [DI],AL ADD SI,1 ADD DI,1 MOV AL,[SI] MOV [DI],AL ADD SI,1 ADD DI,1 MOV AL,[SI] MOV [DI],AL POP DI RET Shift_average ENDP CODES ENDS END START






