1、三级 PC技术机试-229 及答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.请编制程序 PROG1.ASM,其功能是:内存中连续存放着 10个十六位二进制数,每个数的序号依次定义为 0,1,9。统计每个数中位为 0的个数 N0,N 1,N 9(均用一个字节表示),然后按序将 N0至 N9存入内存中,最后再用一个字节表示这 10个数中为 0的位的总数 n (n=N0+N1+N9)。例如:内存中有 0000H,000FH,FFFFH,结果为 10H,0CH,00H,最后为 n部分程序已给出,其中原始数据由过程 LOAD从文件 INPUT1.DA
2、T中读入 SOURCE开始的内存单元中。运算结果要求从 RESULT开始存放,由过程 SAVE保存到文件 OUTPUT1.DAT中。填空 BEGIN和 END之间已给出的源程序使其完整(空白已用横线标出,每行空白一般只需一条指令,但采用功能相当的多条指令亦可),或删除 BEGIN和 END之间原有的代码并自行编程来完成要求的功能。对程序必须进行汇编,并与 IO.OBJ链接产生 PROG1.EXE执行文件,最终运行程序产生结果 (无结果或结果不正确者均不得分)。调试中若发现整个程序中存在错误之处,请加以修改。PROG1.ASM文件内容如下:EXTRN LOAD:FAR,SAVE:FARN EQU
3、 10STAC SEGMENT STACKDB 128 DUP(?)STAC ENDSDATA SEGMENTSOURCE DW N DUP(?)RESULT DB N+1 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,AXLEA DX,SOURCE ;数据区起始地址LEA SI,NAME0 ;原始数据文件名MOV CX,N*2 ;字
4、节数CALL LOAD ;从INPUT1.DAT中读取数据;* * * * BEGIN * * * *MOV DI,OFFSET RESULTMOV CL,NMOV BX,0MOV DH,0PRO: MOV DL,0MOV AX,SOURCEBXMOV CH,_COUNT: _ _ JUMPINC DLJUMP: DEC CHJNZ _MOV DI,DLADD DH,DLINC DIADD _DEC CLJNZ PROMOV _;* * * * END * * * *LEA DX,RESULT ;结果数据区首址LEA SI,NAME1 ;结果文件名MOV CX,N+1 ;结果字节数CALL S
5、AVE ;保存结果到文件RETSTART ENDPCODE ENDSEND START(分数:100.00)_三级 PC技术机试-229 答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.请编制程序 PROG1.ASM,其功能是:内存中连续存放着 10个十六位二进制数,每个数的序号依次定义为 0,1,9。统计每个数中位为 0的个数 N0,N 1,N 9(均用一个字节表示),然后按序将 N0至 N9存入内存中,最后再用一个字节表示这 10个数中为 0的位的总数 n (n=N0+N1+N9)。例如:内存中有 0000H,000FH,FFFFH,结果
6、为 10H,0CH,00H,最后为 n部分程序已给出,其中原始数据由过程 LOAD从文件 INPUT1.DAT中读入 SOURCE开始的内存单元中。运算结果要求从 RESULT开始存放,由过程 SAVE保存到文件 OUTPUT1.DAT中。填空 BEGIN和 END之间已给出的源程序使其完整(空白已用横线标出,每行空白一般只需一条指令,但采用功能相当的多条指令亦可),或删除 BEGIN和 END之间原有的代码并自行编程来完成要求的功能。对程序必须进行汇编,并与 IO.OBJ链接产生 PROG1.EXE执行文件,最终运行程序产生结果 (无结果或结果不正确者均不得分)。调试中若发现整个程序中存在错
7、误之处,请加以修改。PROG1.ASM文件内容如下:EXTRN LOAD:FAR,SAVE:FARN EQU 10STAC SEGMENT STACKDB 128 DUP(?)STAC ENDSDATA SEGMENTSOURCE DW N DUP(?)RESULT DB N+1 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,AXLE
8、A DX,SOURCE ;数据区起始地址LEA SI,NAME0 ;原始数据文件名MOV CX,N*2 ;字节数CALL LOAD ;从INPUT1.DAT中读取数据;* * * * BEGIN * * * *MOV DI,OFFSET RESULTMOV CL,NMOV BX,0MOV DH,0PRO: MOV DL,0MOV AX,SOURCEBXMOV CH,_COUNT: _ _ JUMPINC DLJUMP: DEC CHJNZ _MOV DI,DLADD DH,DLINC DIADD _DEC CLJNZ PROMOV _;* * * * END * * * *LEA DX,RES
9、ULT ;结果数据区首址LEA SI,NAME1 ;结果文件名MOV CX,N+1 ;结果字节数CALL SAVE ;保存结果到文件RETSTART ENDPCODE ENDSEND START(分数:100.00)_正确答案:(;*BEGIN*MOV DI,OFFSET RESULT;目的存储区首址DIMOV CL,N ;设置外层循环次数为 N(即 10次)MOV BX,0 ;源数据区起始地址MOV DH,0 ;DH 用于累计 0个数的总个数PRO:MOV DL,0 ;DL 用于累计每行 0个数MOV AX,SOURCEBXMOV CH,10H ;设置左移次数 16次COUNT:SHL AX
10、,1 ;左移,把最高位移到 CFJC JUMP ;若 CP为 1,则 DL不计数INC DL ;CF 为 0,为则 DL计数JUMP:DEC CHJNZ COUNT ;16 位未统计完,则跳到 COUNT继续MOV DI,DL ;目的存储区存入 0的个数ADD DH,DL ;DH 累计 0个数的总个数INC DI ;DI 指向下一个存储单元ADD BX,2 ;BX 指向下一个存储单元DEC CLJNZ PROMOV DI,DH ;存入 0的总个数; * * * * END * * * *输入数据:00 00 01 00 FF FF AA AA 55 55 55 AA 33 33 77 77 00 10 10 00输出数据:10 0F 00 08 08 08 08 04 0F 0F 61)解析: