请编制程序,其功能是:对经常上下波动的数据采用只记录峰值的数据压缩方法,即每次将采样到的当前值和前一次值比较,如数据变向改变(原变大现变小或原变小现变大),说明已过峰值,这时就将当前值记录下来。 例如(下列数据均为无符号数): 原数据:23H,

admin2010-12-14  40

问题 请编制程序,其功能是:对经常上下波动的数据采用只记录峰值的数据压缩方法,即每次将采样到的当前值和前一次值比较,如数据变向改变(原变大现变小或原变小现变大),说明已过峰值,这时就将当前值记录下来。
   例如(下列数据均为无符号数):
   原数据:23H,45H,89H,67H,5CH,36H,3CH,78H…
   压缩后:23H,89H,36H…
   内存中从SOURCE开始连续存放着40个八位无符号数,假定相邻两数无相等的情况,编程按上述方法进行压缩,结果保存在RESULT开始的内存单元中。
   部分程序已给出,请填空BEGIN和END之间已给出的源程序使其完整(空白已用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可),或删除BEGIN和END之间原有的代码并自行编程来完成所要求的功能。
   原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。
   对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。
   试题程序:

选项

答案(1)XORDX,AX (2)ANDDH,80H (3)Z (4)STOSB (5)MOVDX,AX

解析 此程序要实现的功能是:将经常上下波动的数据采用只记录峰值的数据压缩方法,即每次将采样到的当前值和前一次值比较,如数据变向改变,即原变大现变小或原变小现变大,说明已过峰值,这时就将当前值记录下来。
   程序的堆栈段定义了一个128字节的堆栈区。堆栈段下面是数据段。数据段中定义了四个字节型变量:原始数据区SOURCE、结果数据区RESULT、原始数据文件名NAME0、结果数据文件名NAMEI。数据段下面是代码段,告诉汇编程序,代码段、数据段和堆栈段分别属于段寄存器CS、DS、Ss。
   将原始数据的偏移地址装入到SI中,结果数据存放的偏移地址装入到DI中。CLD指令将方向标志DF清0,在数据操作时,实现地址指针自动增量。然后用MOVSB指令将SI中内容送到DI中。先将两个寄存器,AX、BX清0。然后用LOADSB指令将SI中内容装入到AL中,即取数X[1]。接着将SI-2中的内容,即X[0]送BL中,即取数X[0]。将AX减去BX,即x[1]-X[0],差值放在AX中。接着将差值暂存在DX中。CX赋初值为N-2,用于控制循环处理的次数。
   FILTER段,先做差值,通过判断相邻两个差值的符号是否相等,来观察数据改变方向是否发生了变化。寄存器AX、BX先清0。然后用LOADSB指令将SI中内容装入到AL中,即取数X[n],接着将SI-2中的内容送BL,即BL等于X[n-1)。然后将AX减去BX,即X[n]-X[n-1),差值结果放在AX中。接下来要比较后一差值AX与前一差值DX符号位是否相同。先将DX和AX进行异或操作,结果放DX中,因为只需看最高位,即符号位,所以,再将DH和80H进行逻辑与操作,若结果为0,即ZF=1,说明两个差值DX和AX符号位相同,转SKIP段执行,继续搜索下面的数据;否则,ZF=0,说明两个差值DX和 AX符号位不相同,则将当前值记录下来,即将AL存入到DI中。从上面的分析看来,第(1)空填写"XOR DX,AX",第(2)空填写"ANDDH,80H",第(3)空填写"Z",第(4)空填写"STOSB"。
   SKIP段,是两个差值DX和BX符号位相同时,继续搜索数据,将新的差值存在DX中,准备和接下来的差值比较。所以第(15)空填写"MOV DX,AX"。然后从FILTER入口处循环,继续判断数据变化方向情况,一共循环N-2次。
转载请注明原文地址:https://jikaoti.com/ti/Bs27FFFM
0

最新回复(0)