问题 问答题

请编制程序,其功能是:对经常上下波动的数据可采用只记录峰值的数据压缩方法。即每次将采样到的当前值和前一次值比较,如数据变化方向改变(原变大现变小或原变小现变大),说明已过峰值,这时就将前一值(峰值)记录下来。
例如(下例数据均为无符号数):
原数据:23H,45H,89H,67H,5CH,36H,3CH…
压缩后:23H,89H,36H…
内存中从SOURCE连续存放着48个八位无符号数,假定无相邻两数相等的情况,编程按上述方法进行压缩,结果保存在 RESULT开始的内存单元中。
部分程序已给出,请填空BEGIN和END之间已给出的源程序使其完整,空白已用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可,或删除BEGIN和END之间原有的代码并自行编写程序片段来完成所要求的功能。
原始数据由过程LOAD从文件INPUT.DAT中读入SOURCE开始的内存单元中,结果要求从RESULT开始存放,由过程 SAVE保存到文件OUTPUT.DAT中。
对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。
[试题程序]
EXTRN LOAD:FAR,SAVE:FAR
N EQU 40
STAC SEGMENT STACK
DB128 DUP()
STAC ENDS
DATA SEGMENT
SOURCE DBN DUP()
RESULT DBN DUP(0)
NAME0 DB’INPUT.DAT’,0
NAME1 DB’OUTPUT.DAT’,0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STAC
START PROC FAR
PUSH DS
XORAX,AX
PUSH AX
MOVAX,DATA
MOVDS,AX
MOVES,AX;置附加段寄存器
LEADX,SOURCE ;数据区起始地址
LEASI,NAME0 ;原始数据文件名起始地址
MOVCX,N ;字节数
CALL LOAD ;从’INPUT.DAT’中读取数据
; ******** BEGIN ********
LEASI,SOURCE
LEADI,RESULT
CLD
MOVSB ;Y[0]=X[0]
XORAX,AX
XORBX,BX
LODSB
MOVBL,[SI-2]
SUBAX,AX ;X[1]-X[0]
MOVDX,AX
MOVCX,N-2
FILTER:
XORAX,AX
XORBX,BX
LODSB ;X[n]
MOVBL,[SI-2] ;X[n-1]
SUBAX,BX ;X[n]-X[n-1]
(1) ;相邻两差值(Ax,Dx)符号位是否相同
(2)
J (3) SKIP ;相同,数据方向未变
(4) ;不同,方向变化,保存峰值
STOSB
SKIP: (5)
LOOP FILTER
; ******** END ********
LEADX,RESULT ;数据区起始地址
LEASI,NAME1;结果文件名起始地址
MOVCX,N ;字节数
CALL SAVE ;保存结果到 ’OUTPUT.DAT’ 文件中
RET
START ENDP
CODE ENDS
ENDSTART

答案

参考答案:(1)XOR DX,AX (2)AND DH,80H (3)Z (4)MOVAL,[SI-2] (5)MOV DX,AX

解析:
本题是一道综合题,其所采用的算法是读取第一个数并保存到结果数据区,然后再读取第二个数,将第一个数和第二个数相减,将结果保存起来,读取第三个数,然后将第二个数和第三个数相减,将得到的结果和前面得到的结果进行符号位的判断,如果相同则表明数据变化方向相同,不用保存第二个数据,如果不同则说明数据变化方向相反,需要保存第二个数据,后面的数据依次类推,直到最后一个数据为止。
解决此类题型时,根据所采用的算法不同,其技巧也有一定的区别,而本程序中就用异或运算将Ax和Bx设置为0;将两次差值进行异或运算,并将运算结果与80H进行与运算,以此判断两个差值的符号位是否相同。通过判断两个差值的符号位是否相同来判断数据变化方向是否相同。

单项选择题
单项选择题