均值滤波
L_NUM EQU $-NUM
MAXNUM DB ?
MINNUM DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK1
STARTPROCFAR
PUSHDS;标准序
XORAX, AX
PUSHAX
MOVAX, DATA
MOVDS, AX
MOVSI, OFFSET NUM ;求最大数MOV BX OFFSET COUNT
JNCNEXT2jnc进位标志位为0则转移
MOVAL, [SI]
;求最大数子程序
NEXT2: INCSI
LOOPNEXT1
MOV[DI],AL
RET
SMAX ENDP
SMIN PROC
MOVAL, 0FFH
NEXT3: CMPAL, [SI]
JCNEXT4
MOVAL, [SI]
;求最小数子程序
NEXT4: INCSI
主程序
子程序SMAX
子程序SMIN
起始地址
结束地址
2、记录数据段中存放的的10个原始数据、最大数、最小数及平均数。
DS:0000
DS:0008
3、记录刚进入SMAX时,压入堆栈的内容,它就是从子程序SMAX返回主程序的地址。
执行CALL SMAX前
(IP)=
(SP)=
执行CALL SMAX后
(IP)=
LOOPNEXT3
MOV[DI],AL
RET
SMIN ENDP
CODE ENDS
ENDSTART
五.实验歩骤
1同实验一实验歩骤1~3。
2调试程序: 单击工具栏 ,单击View\Cpu,在代码显示区单击右键\点击Mixed Both,为Mixed No,按F7单歩执行,当执行完MOV DS, AX后,单击View\Cpu,使屏幕下方的数据显示区为DS的内容:
实验二
一.实验目的
1.掌握在数据表中找最大、最小数的方法。
2.学会子程序的使用方法,参数传递的Leabharlann 法,掌握分支程序,循环程序的设计方法。
3.熟悉Tddebug调试环境和Turbo Debugger的使用。
二.实验内容
均值滤波算法:对N (2 < N < 256)个无符号数,去掉一个最大值、最小值,然后求其平均值,其中最大值,最小值的査找通过分别调用子程序SMAX和SMIN实现。
(SP)=
执行RET前
(IP)=
(SP)=
执行RET后
(IP)=
(SP)=
执行CALL SMIN前
(IP)=
(SP)=
执行CALL SMIN后
(IP)=
(SP)=
执行RET前
(IP)=
(SP)=
执行RET后
(IP)=
(SP)=
4、最大值=?最大值=?平均值=?
XOR异或AX, AX
MOVSI, OFFSET NUM
NEXT: ADDAL, [SI]
ADCAH, 0
INCSI
LOOPNEXT
MOVBH, 0;减去最大值
MOVBL, MAXNUM
SUBAX, BX
MOVBL, MINNUM;减去最小值
SUBAX, BX
MOVCL, L_NUM;求均值
SUBCL, 2
的意思就是把COUNT这个变量的偏移地址送给BX这个寄存器。
MOVDI, OFFSET MAXNUM
MOVCX, L_NUM
CALLSMAX
MOVSI, OFFSET NUM;求最小数
MOVDI, OFFSET MINNUM
MOVCX, L_NUM
CALLSMIN
MOVCX, L_NUM;求N数之和
DIVCL
MOVAVERAGE,AL;平均值存放在AVERAGE中
RET
START ENDP
SMAX PROC
MOVAL, 0
NEXT1: CMPAL, [SI]CMP( CoMPare )是比较指令,cmp的功能相当于减法指令,只是不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
三.程序流程图
主程序流程图如图1-2-1所示,SMAX子程序流程图如图1-2-2所示,SMIN子程序流程图与SMAX类似。
四.参考源程序
STACK1 SEGMENT STACK
DB 100 DUP(?)
STACK1 ENDS
DATA SEGMENT
AVERAGE DB ?
NUM DB 12H,34H,56H,78H,90H,21H,43H,65H,87H,09H
(1)用单歩和执行到光标处相结合,调试求最大值子程序,观察指令执行后各寄存器及数据区的内容。
(2)用执行到光标处,调试求最小值子程序,观察指令执行后数据区最小值的内容。
(3)用连续执行方式调试求平均值。
3修改源程序,用同一个子程序求出最大值、最小值。
六.实验报告
1、记录主程序、子程序SMAX、子程序SMIN 的起始地址和结束地址。