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

admin2010-09-01  37

问题 请编制程序,其功能是:对经常上下波动的数据可采用只记录峰值的数据压缩方法。即每次将采样到的当前值和前一次值比较,如数据变化方向改变(原变大现变小或原变小现变大),说明已过峰值,这时就将前一值(峰值)记录下来。
   例如(下例数据均为无符号数):
   原数据: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
             DB       128  DUP(?)
   STAC      ENDS
   DATA      SEGMENT
   SOURCE    DB       N  DUP(?)
   RESULT    DB       N  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
             XOR       AX,AX
             PUSH      AX
             MOV       AX,DATA
             MOV       DS,AX
             MOV       ES,AX        ;置附加段寄存器
             LEA       DX,SOURCE    ;数据区起始地址
             LEA       SI,NAME0     ;原始数据文件名起始地址
             MOV       CX,N         ;字节数
             CALL      LOAD          ;从’INPUT.DAT’中读取数据
   ;    ********  BEGIN  ********
             LEA       SI,SOURCE
             LEA       DI,RESULT
             CLD
             MOVSB                   ;Y[0]=X[0]
             XOR       AX,AX
             XOR       BX,BX
             LODSB
             MOV       BL,[SI-2]
             SUB       AX,AX         ;X[1]-X[0]
             MOV       DX,AX
             MOV       CX,N-2
   FILTER:
             XOR       AX,AX
             XOR       BX,BX
             LODSB                     ;X[n]
             MOV       BL,[SI-2]      ;X[n-1]
             SUB       AX,BX          ;X[n]-X[n-1]
               (1)              ;相邻两差值(Ax,Dx)符号位是否相同
               (2)  
             J  (3)    SKIP     ;相同,数据方向未变
               (4)              ;不同,方向变化,保存峰值
             STOSB
   SKIP:      (5)  
   LOOP      FILTER
   ;    ********  END  ********
             LEA       DX,RESULT      ;数据区起始地址
             LEA       SI,NAME1       ;结果文件名起始地址
             MOV       CX,N           ;字节数
             CALL      SAVE            ;保存结果到 ’OUTPUT.DAT’ 文件中
             RET
   START     ENDP
   CODE      ENDS
             END       START

选项

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

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

最新回复(0)