1、三级 PC技术机试-170 及答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.请编制程序,其功能是:对经常上下波动的数据采用只记录峰值的数据压缩方法,即每次将采样到的当前值和前一次值比较,如数据变向改变(原变大现变小或原变小现变大),说明已过峰值,这时就将当前值记录下来。例如(下列数据均为无符号数):原数据:23H,45H,89H,67H,5CH,36H,3CH,78H压缩后:23H,89H,36H内存中从 SOURCE开始连续存放着 40个八位无符号数,假定相邻两数无相等的情况,编程按上述方法进行压缩,结果保存在 RESULT开始的内存单元
2、中。部分程序已给出,请填空 BEGIN和 END之间已给出的源程序使其完整(空白已用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可),或删除 BEGIN和 END之间原有的代码并自行编程来完成所要求的功能。原始数据由过程 LOAD从文件 INPUT1.DAT中读入 SOURCE开始的内存单元中,运算结果要求从 RESULT开始存放,由过程 SAVE保存到文件 OUTPUT1.DAT中。对程序必须进行汇编,并与 IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。试题程序:(分数:100.00)_三级 PC技术机试-170 答案
3、解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.请编制程序,其功能是:对经常上下波动的数据采用只记录峰值的数据压缩方法,即每次将采样到的当前值和前一次值比较,如数据变向改变(原变大现变小或原变小现变大),说明已过峰值,这时就将当前值记录下来。例如(下列数据均为无符号数):原数据:23H,45H,89H,67H,5CH,36H,3CH,78H压缩后:23H,89H,36H内存中从 SOURCE开始连续存放着 40个八位无符号数,假定相邻两数无相等的情况,编程按上述方法进行压缩,结果保存在 RESULT开始的内存单元中。部分程序已给出,请填空 BEG
4、IN和 END之间已给出的源程序使其完整(空白已用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可),或删除 BEGIN和 END之间原有的代码并自行编程来完成所要求的功能。原始数据由过程 LOAD从文件 INPUT1.DAT中读入 SOURCE开始的内存单元中,运算结果要求从 RESULT开始存放,由过程 SAVE保存到文件 OUTPUT1.DAT中。对程序必须进行汇编,并与 IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。试题程序:(分数:100.00)_正确答案:(1)XORDX,AX(2)ANDDH,80H(3)Z(
5、4)STOSB(5)MOVDX,AX)解析:解析此程序要实现的功能是:将经常上下波动的数据采用只记录峰值的数据压缩方法,即每次将采样到的当前值和前一次值比较,如数据变向改变,即原变大现变小或原变小现变大,说明已过峰值,这时就将当前值记录下来。程序的堆栈段定义了一个 128字节的堆栈区。堆栈段下面是数据段。数据段中定义了四个字节型变量:原始数据区 SOURCE、结果数据区 RESULT、原始数据文件名 NAME0、结果数据文件名 NAMEI。数据段下面是代码段,告诉汇编程序,代码段、数据段和堆栈段分别属于段寄存器 CS、DS、Ss。将原始数据的偏移地址装入到 SI中,结果数据存放的偏移地址装入到
6、 DI中。CLD 指令将方向标志 DF清0,在数据操作时,实现地址指针自动增量。然后用 MOVSB指令将 SI中内容送到 DI中。先将两个寄存器,AX、BX 清 0。然后用 LOADSB指令将 SI中内容装入到 AL中,即取数 X1。接着将 SI-2中的内容,即 X0送BL中,即取数 X0。将 AX减去 BX,即 x1-X0,差值放在 AX中。接着将差值暂存在 DX中。CX 赋初值为 N-2,用于控制循环处理的次数。FILTER段,先做差值,通过判断相邻两个差值的符号是否相等,来观察数据改变方向是否发生了变化。寄存器 AX、BX 先清 0。然后用 LOADSB指令将 SI中内容装入到 AL中,
7、即取数 Xn,接着将 SI-2中的内容送 BL,即 BL等于 Xn-1)。然后将 AX减去 BX,即 Xn-Xn-1),差值结果放在 AX中。接下来要比较后一差值 AX与前一差值 DX符号位是否相同。先将 DX和 AX进行异或操作,结果放 DX中,因为只需看最高位,即符号位,所以,再将 DH和 80H进行逻辑与操作,若结果为 0,即 ZF1,说明两个差值 DX和 AX符号位相同,转 SKIP段执行,继续搜索下面的数据;否则,ZF0,说明两个差值 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次。