资源描述
;;我是;;用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信
;我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信
;我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数
;我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数的,不管你信不信我是用来刷字数
;设计一个对整数的滑动平均滤波程序,数据由用户输入
;用户输入一组数据(-9999至+9999),每个数以回车键结束,全部数据输入完毕,以空格键结束
DATAS SEGMENT
;此处输入数据段代码
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 ? ;保留,用于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 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 DS , AX
;键盘输入一组数,将其ASCII码值并保存转换为二进制在BIN_BUF1中
CALL INPUT
;对所输入数组中的数进行中间值滤波,放入BIN_BUF2中
CALL Shift_average
;将中值滤波后的数(存放在BIN_BUF2)从二进制形式转换为ASCII码值一一输出
CALL OUTPUT
;一组数滤波显示完毕,等待下一步用户操作
;退出或继续
MOV DX,OFFSET QUIT_MESSAGE
MOV AH , 9
INT 21H
MOV AH , 1
INT 21H
CMP AL,'Q'
JZ OVER
CMP AL,'q'
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,将输入的一组数全部转换为二进制,存于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
INPUT1: INC DI
MOV DX , OFFSET IN_ASC_BUF ;缓冲输入一个数(一位符号位,小于等于四位数字位,一位回车符)
MOV AH , 10
INT 21H
PUSH SI
CALL ASC_TO_BIN ;转换当前输入的数为二进制
POP SI
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 INPUT1
RET
INPUT ENDP
OUTPUT PROC
;将滤波处理后的存于BIN_BUF2中的数,由二进制转换为十进制,一一显示
;入口:键盘输入的数经滤波处理后以二进制形式存于BIN_BUF2中
;出口:以十进制显示滤波处理后的一组数数
;算法: 从BIN_BUF2中读入一个数,调用BIN_TO_ASCII 将其转换为十进制的ASCII码输出
;循环调用OUTPUT1,将输入的一组数全部转换为十进制的ASCII码输出
;输出提示信息
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码值,以供显示用
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内
;算法:先将其转换成十进制数字,再用累加和乘10加X的方法变成二进制数,如将
;358转换为二进制数,可先将累加和赋0,再计算(((0*10+3)*10+5)*10+8),结果为二
;进制数,再由符号位决定是否需要求补。
;PUSH SI
MOV CL , IN_ASC_BUF+1 ;取字符个数
MOV CH , 0
DEC CL ;扣除符号位
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指向十进制数的最高位
PUSH 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 ;累加和赋初值
MOV SI , 10
L2:
MUL SI
ADD AL , [BX]
ADC AH , 0
INC BX
LOOP L2 ;累加乘10
CMP IN_ASC_BUF+2 , '+'
JZ L3 ;符号是正号,转移
NEG AX
;符号是负号,求补
L3: ; POP SI
RET
ASC_TO_BIN ENDP
BIN_TO_ASCII PROC
;将二进制数转换为对应十进制数数字的ASCII码
;入口:二进制数在AX内
;出口:转换后的ASCII码在OUT_ASC_ AVERAGE变量内
;算法:AX中的数范围在+32767到-32768之间,先检查AX中的符号位,以决定输出“+”
;还是“-”,若是负数,应先求补,得到原码后即可与正数作统一处理。转换方法为将被转换的
;二进制数先除以10000,商;即为万位数,再将余数除以1000,商为千位数,以此类推,求出
;百、十位数,剩下的为个位数。最后,将各个数加上30H,即成为对应字符。
MOV OUT_ASC_AVERAGE , '+'
CMP AX , 0
JGE L4
MOV OUT_ASC_AVERAGE , '-' ;不是负数,转移
NEG AX
L4:
CWD ;AX中的有符号字扩展为双字,扩展后的高16位存放在DX中
MOV BX , 10000
DIV BX
ADD AL , 30H ;将万位转换为数字(商应在AX内,但因为商不大于3,
;所以有效部分在AL内)
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 ;将余数置入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
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
;将输入的以二进制形式表达的数进行滑动平均滤波
;入口:原数组 在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 CONT
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
展开阅读全文