1、三级 PC技术机试-192 及答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.请编制程序,其功能是:对经常上下波动的数据可采用只记录峰值的数据压缩方法。即每次将采样到的当前值和前一次值比较,如数据变化方向改变(原变大现变小或原变小现变大),说明已过峰值,这时就将前一值(峰值)记录下来。例如(下例数据均为无符号数):原数据:23H,45H,89H,67H,5CH,36H,3CH压缩后:23H,89H,36H内存中从 SOURCE连续存放着 48个八位无符号数,假定无相邻两数相等的情况,编程按上述方法进行压缩,结果保存在 RESULT 开始的内存
2、单元中。部分程序已给出,请填空 BEGIN和 END之间已给出的源程序使其完整,空白已用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可,或删除 BEGIN和 END之间原有的代码并自行编写程序片段来完成所要求的功能。原始数据由过程 LOAD从文件 INPUT.DAT中读入 SOURCE开始的内存单元中,结果要求从 RESULT开始存放,由过程 SAVE 保存到文件 OUTPUT.DAT中。对程序必须进行汇编,并与 IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。试题程序EXTRN LOAD:FAR,SAVE:FARN EQ
3、U 40STAC SEGMENT STACKDB 128 DUP(?)STAC ENDSDATA SEGMENTSOURCE DB N DUP(?)RESULT DB N DUP(0)NAME0 DB INPUTDAT,0NAME1 DB OUTPUTDAT,0DATA ENDSCODE SEGMENTASSUME CS:CODE, DS:DATA, SS:STACSTART PROC FARPUSH DSXOR AX,AXPUSH AXMOV AX,DATAMOV DS,AXMOV ES,AX ;置附加段寄存器LEA DX,SOURCE ;数据区起始地址LEA SI,NAME0 ;原始数据文
4、件名起始地址MOV CX,N ;字节数CALL LOAD ;从INPUTDAT中读取数据; * BEGIN *LEA SI,SOURCELEA DI,RESULTCLDMOVSB ;Y0=X0XOR AX,AXXOR BX,BXLODSBMOV BL,SI-2SUB AX,AX ;X1-X0MOV DX,AXMOV CX,N-2FILTER:XOR AX,AXXOR BX,BXLODSB ;XnMOV BL,SI-2 ;Xn-1SUB AX,BX ;Xn-Xn-1(1) ;相邻两差值(Ax,Dx)符号位是否相同(2) J (3) SKIP ;相同,数据方向未变(4) ;不同,方向变化,保存峰值
5、STOSBSKIP: (5) LOOP FILTER; * END *LEA DX,RESULT ;数据区起始地址LEA SI,NAME1 ;结果文件名起始地址MOV CX,N ;字节数CALL SAVE ;保存结果到 OUTPUT.DAT 文件中RETSTART ENDPCODE ENDSEND START(分数:100.00)_三级 PC技术机试-192 答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.请编制程序,其功能是:对经常上下波动的数据可采用只记录峰值的数据压缩方法。即每次将采样到的当前值和前一次值比较,如数据变化方向改变(原变大
6、现变小或原变小现变大),说明已过峰值,这时就将前一值(峰值)记录下来。例如(下例数据均为无符号数):原数据:23H,45H,89H,67H,5CH,36H,3CH压缩后:23H,89H,36H内存中从 SOURCE连续存放着 48个八位无符号数,假定无相邻两数相等的情况,编程按上述方法进行压缩,结果保存在 RESULT 开始的内存单元中。部分程序已给出,请填空 BEGIN和 END之间已给出的源程序使其完整,空白已用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可,或删除 BEGIN和 END之间原有的代码并自行编写程序片段来完成所要求的功能。原始数据由过程 LOAD从文件 I
7、NPUT.DAT中读入 SOURCE开始的内存单元中,结果要求从 RESULT开始存放,由过程 SAVE 保存到文件 OUTPUT.DAT中。对程序必须进行汇编,并与 IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。试题程序EXTRN LOAD:FAR,SAVE:FARN EQU 40STAC SEGMENT STACKDB 128 DUP(?)STAC ENDSDATA SEGMENTSOURCE DB N DUP(?)RESULT DB N DUP(0)NAME0 DB INPUTDAT,0NAME1 DB OUTPUTDAT,0DAT
8、A ENDSCODE SEGMENTASSUME CS:CODE, DS:DATA, SS:STACSTART PROC FARPUSH DSXOR AX,AXPUSH AXMOV AX,DATAMOV DS,AXMOV ES,AX ;置附加段寄存器LEA DX,SOURCE ;数据区起始地址LEA SI,NAME0 ;原始数据文件名起始地址MOV CX,N ;字节数CALL LOAD ;从INPUTDAT中读取数据; * BEGIN *LEA SI,SOURCELEA DI,RESULTCLDMOVSB ;Y0=X0XOR AX,AXXOR BX,BXLODSBMOV BL,SI-2SUB
9、AX,AX ;X1-X0MOV DX,AXMOV CX,N-2FILTER:XOR AX,AXXOR BX,BXLODSB ;XnMOV BL,SI-2 ;Xn-1SUB AX,BX ;Xn-Xn-1(1) ;相邻两差值(Ax,Dx)符号位是否相同(2) J (3) SKIP ;相同,数据方向未变(4) ;不同,方向变化,保存峰值STOSBSKIP: (5) LOOP FILTER; * END *LEA DX,RESULT ;数据区起始地址LEA SI,NAME1 ;结果文件名起始地址MOV CX,N ;字节数CALL SAVE ;保存结果到 OUTPUT.DAT 文件中RETSTART E
10、NDPCODE ENDSEND START(分数:100.00)_正确答案:(1)XOR DX,AX (2)AND DH,80H (3)Z (4)MOVAL,SI-2 (5)MOV DX,AX)解析:解析本题是一道综合题,其所采用的算法是读取第一个数并保存到结果数据区,然后再读取第二个数,将第一个数和第二个数相减,将结果保存起来,读取第三个数,然后将第二个数和第三个数相减,将得到的结果和前面得到的结果进行符号位的判断,如果相同则表明数据变化方向相同,不用保存第二个数据,如果不同则说明数据变化方向相反,需要保存第二个数据,后面的数据依次类推,直到最后一个数据为止。解决此类题型时,根据所采用的算法不同,其技巧也有一定的区别,而本程序中就用异或运算将 Ax和 Bx设置为 0;将两次差值进行异或运算,并将运算结果与 80H进行与运算,以此判断两个差值的符号位是否相同。通过判断两个差值的符号位是否相同来判断数据变化方向是否相同。