1、三级 PC 技术机试-110 及答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.请编制程序,其功能是:以 SOURCE 开始的内存区域存放着 N 个字节的压缩 BCD 码,将每个压缩 BCD 码转换成两个 ASCII 值,并在每个 ASCII 值的最高位增加偶校验位,结果存放在 RESULT 指示的内存区域。例如:原压缩 BCD 码:26H,75H,91H,33H结果为: B2H,36H,B7H部分程序已经给出,其中原始数据由过程 LOAD 从文件 INPUT1.DAT 中读入 SOURCE 开始的内存单元中,转换结果要求从 RESULT 开
2、始存放,由过程 SAVE 保存到文件 OUTPUT1.DAT 中。请填空 BEGIN 和 END 之间已经给出的一段原程序使其完整,需填空处已经用横线标出,每个空白一般只需要填一条指令或指令的一部分(指令助记符或操作数),也可以填入功能相当的多条指令,或删去 BEGIN和 END 之间原有的代码并自行编程来完成所要求的功能。对程序必须进行汇编,并与 IO.OBJ 链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。试题程序EXTRN LOAD:FAR,SAVE:FARN EQU 10STAC SEGMENT STACKDB 128 DUP(?)STAC E
3、NDSDATA SEGMENTSOURCE DB N DUP(0)RESULT DB 2*N DUP(0)NAME0 DB INPUT1.DAT,0NAME1 DB OUTPUT1.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,NANE0 ;原始数据文件名MOV CX,N ;字节数CALL LOAD ;从INPUT1.
4、DAT 中读取数据; *BEGIN *LEA SI,SOURCEMOV DI,OFFSET RESULTMOV CX,NSERCH1: MOV (1) MOV AH,ALAND AH,0FHAND AL,0FOHPUSH CXMOV CL,4(2) (3) ADD AL,30H(4) OR AL,80HSERCH2: MOV DI,ALINC DI(5) JP SERCH3OR AH,80HSERCH3: MOV DI,AHINC DIINC SI(6) SERCH1; * END *LEA DX,RESULT ; 结果数据区首址LEA SI,NAMEl ;结果文件名起始地址MOV CX,2*
5、N ;字节数CALL SAVE ;保存结果到,OUTPUT1.DAT,文件中RETSTART ENDPCODE ENDSEND START(分数:100.00)_三级 PC 技术机试-110 答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.请编制程序,其功能是:以 SOURCE 开始的内存区域存放着 N 个字节的压缩 BCD 码,将每个压缩 BCD 码转换成两个 ASCII 值,并在每个 ASCII 值的最高位增加偶校验位,结果存放在 RESULT 指示的内存区域。例如:原压缩 BCD 码:26H,75H,91H,33H结果为: B2H,36
6、H,B7H部分程序已经给出,其中原始数据由过程 LOAD 从文件 INPUT1.DAT 中读入 SOURCE 开始的内存单元中,转换结果要求从 RESULT 开始存放,由过程 SAVE 保存到文件 OUTPUT1.DAT 中。请填空 BEGIN 和 END 之间已经给出的一段原程序使其完整,需填空处已经用横线标出,每个空白一般只需要填一条指令或指令的一部分(指令助记符或操作数),也可以填入功能相当的多条指令,或删去 BEGIN和 END 之间原有的代码并自行编程来完成所要求的功能。对程序必须进行汇编,并与 IO.OBJ 链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之
7、处,请加以修改。试题程序EXTRN LOAD:FAR,SAVE:FARN EQU 10STAC SEGMENT STACKDB 128 DUP(?)STAC ENDSDATA SEGMENTSOURCE DB N DUP(0)RESULT DB 2*N DUP(0)NAME0 DB INPUT1.DAT,0NAME1 DB OUTPUT1.DAT,0DATA ENDSCODE SEGMENTASSUME CS:CODE, DS:DATA, SS:STACSTART PROC FARPUSH DSXOR AX,AXPUSH AXMOV AX,DATAMOV DS,AXMOV ES,AX ;置附力
8、,段寄存器LEA DX,SOURCE ;数据区起始地址LEA SI,NANE0 ;原始数据文件名MOV CX,N ;字节数CALL LOAD ;从INPUT1.DAT 中读取数据; *BEGIN *LEA SI,SOURCEMOV DI,OFFSET RESULTMOV CX,NSERCH1: MOV (1) MOV AH,ALAND AH,0FHAND AL,0FOHPUSH CXMOV CL,4(2) (3) ADD AL,30H(4) OR AL,80HSERCH2: MOV DI,ALINC DI(5) JP SERCH3OR AH,80HSERCH3: MOV DI,AHINC DI
9、INC SI(6) SERCH1; * END *LEA DX,RESULT ; 结果数据区首址LEA SI,NAMEl ;结果文件名起始地址MOV CX,2*N ;字节数CALL SAVE ;保存结果到,OUTPUT1.DAT,文件中RETSTART ENDPCODE ENDSEND START(分数:100.00)_正确答案:(1)AL,SI (2)SHRAL,CL (3)POPCX(4)JP SERCH2 (5)ADDAH,30H (6)LOOP)解析:解析此程序要实现两个功能:将 N 个字节的压缩 BCD 码转换成 2N 个 ASCII 值,并在每个 ASCII 值的最高位增加偶校验位
10、。这里考查压缩 BCD 码与 ASCII 码之间的转换,特别是对 SHR 指令的理解和状态标志位 PF 的运用。程序的基本结构如下:堆栈段定义了一个 128 字节的堆栈区。堆栈段下面是数据段。数据段中定义了四个字节型变量:原始数据区 SOURCE、结果数据区 RESULT、原始数据文件名 NAME0、结果数据文件名 NAME1。数据段下面是代码段,在代码段开始告诉汇编程序,代码段、数据段和堆栈段分别属于段寄存器 CS、DS、SS。先将原始数据偏移地址装入到 SI 中,结果数据偏移地址送 DI。 CX 赋初值为 N,用于控制循环处理的次数。SERCH1 段的开始要填写第(1)空,将SI中的内容传
11、送到 AL。所以第(1)空填写“AL,SI”。将 AL 暂存在 AH 中。接着用两条逻辑“与”指令,将 AH 的高四位屏蔽掉,将 AL 的低四位屏蔽掉。CX 先压入堆栈中,再将 CL 赋值为 4,用以控制下面的移位指令的移位位数。将 AL 逻辑右移四位,则 AL 的原高四位数字移入到低四位,高四位现在变成了 0。第(2)空填写“SHRAL,CL”。有压入就必有弹出,与前面的“PUSH CX”指令相对应,第(3)空填写“POP CX”。然后将 AL 中的值加30H,就将压缩 BCD 码的高四位转换成相应的 ASCII 字符了。再由状态标志位 PF 求 AL 的偶校验位。若PF=1,说明 AL 中
12、有偶数个 1,则偶校验位为 0,AL 的最高位不变,转向 SERCH2 段。否则,PF=0,则 AL的偶校验位为 1,将偶校验位 1 加到 AL 的最高位,用指令“ORAL,80H”来实现,所以第(4)空填写“JPSERCH2”。SERCH2 段,将转换后的结果 AL 存入到DI中,DI 加 1。接着将压缩 BCD 码的低四位(已存放在 AH 中)转换成 ASCII 值,所以第(5)空填写“ADDAH,30H”。接下来两条指令,是同求高四位的偶校验位一样,来求低四位的偶校验位。SERCH3 段,将转换后的结果 AH 存放到DI中,DI 地址加 1,SI 地址加 1,然后循环到 SERCH1 入口处,继续处理下一个压缩 BCD 码,所以第(6)空填写“LOOP”。