1、三级 PC 技术机试-168 及答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.请编制程序,其功能是:对一个由可打印 ASCII 字符(ASCII 值为 20H7FH)组成的字符串可采用下列方法进行压缩:从串首开始向后扫描,如某字符单独出现则该字符不变,如某字符连续出现 n 次,则该字符用 ESC(1BH),n,原字符三个字节来代替(假定 n 不超过 255)。设内存中从 SOURCE 开始有一用上述方法压缩的字符串,其以 OOH 结束,解压后长度不超过 100。试编程对其解压缩,结果存入 RESULT 开始的内存单元。例如:原串: 41H,
2、1BH,06H,43H,61H,00H解压缩后:41H,43H,43H,43H,43H,43H,43H,61H,OOH(“ACCCCCCa“)部分程序已给出,原始数据由过程 LOAD 从文件 INPUT.DAT 中读入 SOURCE 开始的内存单元中,结果要求从RESULT 开始存放,由过程 SAVE 保存到文件 OUTPUT.DAT 中。请填空 BEGIN 和 END 之间已给出的源程序使其完整,空白己用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可,或删除 BEGIN 和 END 之间原有的代码并自行编写程序片段来完成所要求的功能。对程序必须进行汇编,并与 IO.OBJ
3、链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。【试题程序】EXTRN LOAD:FAR, SAVE:FARN EQU 100ESC_CODE EQU 27STAC SEGMENT STACKDB 128 DUP(?)STAC ENDS DATA SEGMENT SOURCE DB N DUP(?)RESULT DB N DUP(0)NAME0 DB INPUT.DAT,0NAME1 DB OUTPUT.DAT,0DATA ENDSCODE SEGMENTASSUME CS:CODE, DS:DATA, SS:STACSTART PROC FARPUS
4、H DSXOR AX,AXPUSH AXMOV AX,DATAMOV DS, AXMOV ES, AX ;置附加段寄存器LEA DX, SOURCE ;数据区起始地址LEA SI, NAME0 ;原始数据文件名起始地址MOV CX, N ;字节CALL LOAD ;从“INPUT.DAT“ 中读取数据* BEGIN *LEA SI, SOURCELEA DI, RESULTCLDLO: LODSBCMP AL, 0JE QUITCMP AL, ESC_CODEJ (1) EXPAND(2) JMP L0EXPAND: (3) ;解压缩XOR CX, CX(4) (5) (6) (7) JMP
5、LOQUIT:STOSB ;STORE THE 00H* END *LEA DX, RESULT ;结果数据区首址LEA SI, NAME1 ;结果文件名起始地址MOV CX,N ;字节数CALL SAVE ;保存结果到“output.dat“ 文件RETSTART ENDPCODE ENDSEND START(分数:100.00)_三级 PC 技术机试-168 答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.请编制程序,其功能是:对一个由可打印 ASCII 字符(ASCII 值为 20H7FH)组成的字符串可采用下列方法进行压缩:从串首开始
6、向后扫描,如某字符单独出现则该字符不变,如某字符连续出现 n 次,则该字符用 ESC(1BH),n,原字符三个字节来代替(假定 n 不超过 255)。设内存中从 SOURCE 开始有一用上述方法压缩的字符串,其以 OOH 结束,解压后长度不超过 100。试编程对其解压缩,结果存入 RESULT 开始的内存单元。例如:原串: 41H,1BH,06H,43H,61H,00H解压缩后:41H,43H,43H,43H,43H,43H,43H,61H,OOH(“ACCCCCCa“)部分程序已给出,原始数据由过程 LOAD 从文件 INPUT.DAT 中读入 SOURCE 开始的内存单元中,结果要求从RE
7、SULT 开始存放,由过程 SAVE 保存到文件 OUTPUT.DAT 中。请填空 BEGIN 和 END 之间已给出的源程序使其完整,空白己用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可,或删除 BEGIN 和 END 之间原有的代码并自行编写程序片段来完成所要求的功能。对程序必须进行汇编,并与 IO.OBJ 链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。【试题程序】EXTRN LOAD:FAR, SAVE:FARN EQU 100ESC_CODE EQU 27STAC SEGMENT STACKDB 128 DUP(?)STA
8、C ENDS DATA SEGMENT SOURCE DB N DUP(?)RESULT DB N DUP(0)NAME0 DB INPUT.DAT,0NAME1 DB OUTPUT.DAT,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 ;原始数据文件名起始地址MOV CX, N ;字节CALL LOAD ;
9、从“INPUT.DAT“ 中读取数据* BEGIN *LEA SI, SOURCELEA DI, RESULTCLDLO: LODSBCMP AL, 0JE QUITCMP AL, ESC_CODEJ (1) EXPAND(2) JMP L0EXPAND: (3) ;解压缩XOR CX, CX(4) (5) (6) (7) JMP LOQUIT:STOSB ;STORE THE 00H* END *LEA DX, RESULT ;结果数据区首址LEA SI, NAME1 ;结果文件名起始地址MOV CX,N ;字节数CALL SAVE ;保存结果到“output.dat“ 文件RETSTART
10、 ENDPCODE ENDSEND START(分数:100.00)_正确答案:(1)E (2)STOSB (3)CID (4)MOV CL,SI(5)MOV AL,SI+1 (6)REP STOSB (7)ADD SI,2)解析:解析本题是一道数据插入题,其中本题采用的算法是首先从原始数据区读取一个字节,判断是否为结束标志,若是结束标志,则直接送至结果数据区并结束处理,若不是结束标志则再次判断是否是压缩标志,是则读取下一个字节,然后将其值送 CL,再读取下一个字节到 AL,以 CL 为计数器重复将刚才读取的数据写入结果数据区,然后继续读取下一个数据开始进行判断,直到发现结束标志为止。反之则直接将该字符送到结果数据区。程序中使用串处理指令 LODSB 来完成读取数据和修改原始数据区偏移地址的目的:使用串处理指令 STOSB来完成写入数据和修改结果数据区偏移地址的目的;使用 CL 做计数器和指令 REP 完成循环处理。