1、三级 PC 技术机试-174 及答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.请编制程序 ex4.ASM,其功能是:内存中连续存放着两个有符号字节数序列 Ak和 Bk(k=0,9),求序列 Ck,C k=Ak+Bk(Ck以有符号的形式按 C0,C 9的顺序连续存放)。例如:序列 Ak:80H,31H,61H,7FH,;序列 Bk:80H,01H,F1H,7FH,。结果 Ck为:FF00H,0032H,0052H,00FEH,。部分程序已经给出,其中原始数据由过程 LOAD 从文件 INPUT1.DAT 中读入 SOURCE 开始的内存单元中
2、,运算结果要求从 RESULT 开始存放,由过程 SAVE 保存到文件 OUTPUT1.DAT 中。填空 BEGIN 和 END 之间已给出的源程序使其完整,空白处已用横线标出,每行空白一般只需一条指令,但采用功能相当的多条指令亦可,或删去 BEGIN 和 END 之间原有的代码并自行编程来完成所要求的功能。对程序必须进行汇编,并与 IO.OBJ 连接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序存在错误之处,请加以修改。试题程序 EXTRN LOAD:FAR,SAVE:FARN EQU 10 ;每个序列的长度STAC SEGMENT STACKDB 128DUP(?)STAC E
3、NDSDATA SEGMENTSOURCE DB N*2 DUP(?) ;顺序存放 A0,A9;B0,B9RESULT DW NDUP(0) ;顺序存放 C0,C9NAME0 DB INPUT1.DAT,0NAME1 DB OUTPUT1.DAT,0DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACSTART PROC EARPUSH DSXORAX,AXPUSH AXMOV AX,DATAMOV DS,AXLEA DX,SOURCE ;数据区起始地址LEA SI,NAME0 ;原始数据文件名MOV CX,N*2 ;字节数CALL LOAD
4、;从INPUT1.DAT中读取数据;*BEGIN*MOV DI,OFFSET RESULTMOV BX,0MOV CX,NPRO: MOV AH,0MOV AL, _MOV DL,AL_ AL,SOURCEBXJNO STAYJUMP1: MOV AH,00ADD DL,0JNS JUMPMOV AH, _JMP _STAY: _JUMP: MOV DI,AXADDDI,2INC BXDEC CXJNZ PRO;*END*LEA DX,RESULT ;结果数据区首址LEA SI,NAME1 ;结果文件名MOV CX,N*2 ;结果字节数CALL SAVE ;保存结果到文件RETSTART EN
5、DPCODE ENDSEND START(分数:100.00)_三级 PC 技术机试-174 答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.请编制程序 ex4.ASM,其功能是:内存中连续存放着两个有符号字节数序列 Ak和 Bk(k=0,9),求序列 Ck,C k=Ak+Bk(Ck以有符号的形式按 C0,C 9的顺序连续存放)。例如:序列 Ak:80H,31H,61H,7FH,;序列 Bk:80H,01H,F1H,7FH,。结果 Ck为:FF00H,0032H,0052H,00FEH,。部分程序已经给出,其中原始数据由过程 LOAD 从文件
6、 INPUT1.DAT 中读入 SOURCE 开始的内存单元中,运算结果要求从 RESULT 开始存放,由过程 SAVE 保存到文件 OUTPUT1.DAT 中。填空 BEGIN 和 END 之间已给出的源程序使其完整,空白处已用横线标出,每行空白一般只需一条指令,但采用功能相当的多条指令亦可,或删去 BEGIN 和 END 之间原有的代码并自行编程来完成所要求的功能。对程序必须进行汇编,并与 IO.OBJ 连接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序存在错误之处,请加以修改。试题程序 EXTRN LOAD:FAR,SAVE:FARN EQU 10 ;每个序列的长度STAC
7、SEGMENT STACKDB 128DUP(?)STAC ENDSDATA SEGMENTSOURCE DB N*2 DUP(?) ;顺序存放 A0,A9;B0,B9RESULT DW NDUP(0) ;顺序存放 C0,C9NAME0 DB INPUT1.DAT,0NAME1 DB OUTPUT1.DAT,0DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACSTART PROC EARPUSH DSXORAX,AXPUSH AXMOV AX,DATAMOV DS,AXLEA DX,SOURCE ;数据区起始地址LEA SI,NAME0 ;原
8、始数据文件名MOV CX,N*2 ;字节数CALL LOAD ;从INPUT1.DAT中读取数据;*BEGIN*MOV DI,OFFSET RESULTMOV BX,0MOV CX,NPRO: MOV AH,0MOV AL, _MOV DL,AL_ AL,SOURCEBXJNO STAYJUMP1: MOV AH,00ADD DL,0JNS JUMPMOV AH, _JMP _STAY: _JUMP: MOV DI,AXADDDI,2INC BXDEC CXJNZ PRO;*END*LEA DX,RESULT ;结果数据区首址LEA SI,NAME1 ;结果文件名MOV CX,N*2 ;结果字
9、节数CALL SAVE ;保存结果到文件RETSTART ENDPCODE ENDSEND START(分数:100.00)_正确答案:(;*BEGIN*MOV DI,OFFSET RESULT ;结果从 RESULT 开始存放MOV BX,0MOV CX,N ;设定循环次数PRO: MOV AH,0MOV AL, SOURCEBX+N ;序列 Bk中的一个字节MOV DL,AL ;暂存 BkADD AL,SOURCE BX ;C k=Bk+AkJNO STAY ;无溢出转 STAYJUMP1: MOV AH,00 ;有溢出ADD DL,0 ;用来判断 Bk的符号JNS JUMP ;B k是正
10、数(为一个正数加上一个正数,结果为负数的溢出情况)JUMP(AH 已为 00H)MOV AH,0FFH ;B k是负数(为一个负数加上一个负数,结果为正数的溢出情况)将结果变为有符号字的形式(为负)JMP JUMPSTAY: CBW ;AL 中数的符号扩展到 AH,无符号字节变成无符号字,有符号字节变成有符号字JUMP: MOV DI,AH ;修改此处,以使显示的结果是高字节在前,低字节在后ADD DI,1MOV DI,ALADD DI,1INC BXDEC CXJNZ PRO;*END*)解析:解析 本题主要考查对数组的求和实现问题。考生需要注意 A0A9 存放在内存单元的SOURCESOURCE+9 单元;B 0B 9存放在内存单元的 SOURCE+10SOURCE+19 单元。C i=Ai+Bi=(SOURCE+i)+(SOURCE+N+i)。本题难点在于具体求和的实现,如 JNS JUMP 此时 Bk是正数(为一个正数加上一个正数,结果为负数的溢出情况)转 JUMP(AH 已为 00H);MOV AH,0FFH 此时 Bk是负数(为一个负数加上一个负数,结果为正数的溢出情况)将结果变为有符号字的形式(为负)。