1、三级 PC 技术机试-215 及答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.请编制程序,其功能是:内存中连续存放着 10 个二进制字节数,需对此组数进行加密,其方法为:将前一个字节数(两位十六进制数 a1a2表示)的低位十六进制数 a2与后一个字节数(两位十六进制数 b1b2表示)的高位十六进制数 b1进行交换;第一个字节数的高位十六进制数与最后一个字节数的低十六进制数进行交换,加密后的结果存入内存。例如:内存中有:50H,61H,72H,83H,94H,A5H,B6H,C7H,D8H,E9H结果为:96H,07H,18H,29H,3AH
2、,4BH,5CH,6DH,7EH,85H部分程序已给出,其中原始数据由过程 LOAD 从文件 INPUT1.DAT 中读入 SOURCE 开始的内存单元中。运算结果要求从 RESULT 开始存放,由过程 SAVE 保存到文件 OUTPUT1.DAT 中。填空 BEGIN 和 END 之间已给出的一段源程序使其完整(空白已用横线标出,每行空白一般只需一条指令,但采用功能相当的多条指令亦可),或删除 BEGIN 和 END 之间原有的代码并自行编程来完成要求的功能。对程序必须进行汇编,并与 IO.OBJ 链接产生 PROG1.EXE 执行文件,最终运行程序产生结果(无结果或结果不正确者均不得分)。
3、调试中若发现整个程序中存在错误之处,请加以修改。试题程序:EXTRN LOAD:FAR, SAVE:FARN EQU 10STAC SEGMENT STACKDB 128 DUP(?)STAC ENDSDATA SEGMENTSOURCE DB N DUP(?) ; 顺序存放 10 个 ASCII 字符RESULT DB N DUP(0) ; 存放结果NAME0 DB INPUT1.DAT,0NAME1 DB OUTPUT1.DAT,0DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACSTART PROC FARPUSH DSXOR AX,A
4、XPUSH AXMOV AX,DATAMOV DS,AXLEA DX,SOURCE ; 数据区起始地址LEA SI,NAMEO ; 原始数据文件名MOV CX,N ; 字节数CALL LOAD ; 从 INPUT1.DAT 中读取数据;*BEGIN*MOV DI,0MOV SI,0MOV CX,NAGN1: MOV AL,SOURCESIMOV AH ,ALAND AL,0FHAND AH,0FOHINC SICMP SI,N(1) MOV SI,0LW: MOV BL,SOURCESIMOV BH,BLAND BL,0FHAND BH,0FOH(2) CXMOV CX,4L1: SHR BH
5、,1SHL AL,1LOOP L1(3) CXOR AH,BHOR AL,BLCMP DI,0JNZ STORE1MOV SOURCESI,ALDEC SIMOV SOURCESI,AHINC SIJMP NEXTSTORE1: CMP DI,N-1JL STORE2MOV RESULTDI,AHMOV DI,0MOV RESULTDI,ALJMP NEXTSTORE2: MOV (4) ,AHMOV (5) ,ALNEXT: INC DILOOP AGN1;*END*LEA DX,RESULT ; 结果数据区首址LEA SI,NAME1 ; 结果文件名MOV CX,N ; 字节数CALL S
6、AVE ; 保存结果文件RETSTART ENDPCODE ENDSEND START(分数:100.00)_三级 PC 技术机试-215 答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.请编制程序,其功能是:内存中连续存放着 10 个二进制字节数,需对此组数进行加密,其方法为:将前一个字节数(两位十六进制数 a1a2表示)的低位十六进制数 a2与后一个字节数(两位十六进制数 b1b2表示)的高位十六进制数 b1进行交换;第一个字节数的高位十六进制数与最后一个字节数的低十六进制数进行交换,加密后的结果存入内存。例如:内存中有:50H,61H,
7、72H,83H,94H,A5H,B6H,C7H,D8H,E9H结果为:96H,07H,18H,29H,3AH,4BH,5CH,6DH,7EH,85H部分程序已给出,其中原始数据由过程 LOAD 从文件 INPUT1.DAT 中读入 SOURCE 开始的内存单元中。运算结果要求从 RESULT 开始存放,由过程 SAVE 保存到文件 OUTPUT1.DAT 中。填空 BEGIN 和 END 之间已给出的一段源程序使其完整(空白已用横线标出,每行空白一般只需一条指令,但采用功能相当的多条指令亦可),或删除 BEGIN 和 END 之间原有的代码并自行编程来完成要求的功能。对程序必须进行汇编,并与
8、IO.OBJ 链接产生 PROG1.EXE 执行文件,最终运行程序产生结果(无结果或结果不正确者均不得分)。调试中若发现整个程序中存在错误之处,请加以修改。试题程序:EXTRN LOAD:FAR, SAVE:FARN EQU 10STAC SEGMENT STACKDB 128 DUP(?)STAC ENDSDATA SEGMENTSOURCE DB N DUP(?) ; 顺序存放 10 个 ASCII 字符RESULT DB N DUP(0) ; 存放结果NAME0 DB INPUT1.DAT,0NAME1 DB OUTPUT1.DAT,0DATA ENDSCODE SEGMENTASSUM
9、E CS:CODE,DS:DATA,SS:STACSTART PROC FARPUSH DSXOR AX,AXPUSH AXMOV AX,DATAMOV DS,AXLEA DX,SOURCE ; 数据区起始地址LEA SI,NAMEO ; 原始数据文件名MOV CX,N ; 字节数CALL LOAD ; 从 INPUT1.DAT 中读取数据;*BEGIN*MOV DI,0MOV SI,0MOV CX,NAGN1: MOV AL,SOURCESIMOV AH ,ALAND AL,0FHAND AH,0FOHINC SICMP SI,N(1) MOV SI,0LW: MOV BL,SOURCESI
10、MOV BH,BLAND BL,0FHAND BH,0FOH(2) CXMOV CX,4L1: SHR BH,1SHL AL,1LOOP L1(3) CXOR AH,BHOR AL,BLCMP DI,0JNZ STORE1MOV SOURCESI,ALDEC SIMOV SOURCESI,AHINC SIJMP NEXTSTORE1: CMP DI,N-1JL STORE2MOV RESULTDI,AHMOV DI,0MOV RESULTDI,ALJMP NEXTSTORE2: MOV (4) ,AHMOV (5) ,ALNEXT: INC DILOOP AGN1;*END*LEA DX,RE
11、SULT ; 结果数据区首址LEA SI,NAME1 ; 结果文件名MOV CX,N ; 字节数CALL SAVE ; 保存结果文件RETSTART ENDPCODE ENDSEND START(分数:100.00)_正确答案:(1) JNZ LW (2) PUSH (3) POP(4) RESULT DI (5) SOURCE SI)解析:解析 本题属于数据加密算法的简单应用。对原数据进行加密时,首先要通过对高 4 位和低 4 位分别清 0 来做交换准备,同时当原数据指针下移时,要判断是否到了末尾。如果到了末尾,就要回头去取第 1 个字节,把它的高 4 位和末尾字节的低 4 位互换,接下来通过进行逻辑移位 4 次后,后一个字节的高4 位与前一个字节低 4 位交换,前一个字节低 4 位与后一字节的高 4 位交换。