1、PC技术机试模拟试卷 16及答案与解析 一、程序设计题 1 请编制程序 PROG1.ASM,其功能是:内存中连续存放着 10个十六位二进制数,每个数的序号依次定义为 0, 1, 9 。统计每个数中位为 0的个数 N0,N1, , N9(均用一个字节表示 ),然后按序将 N0至 N9存入内存中,最后再用一个字节表示这 10个数中为 0的位的总数 n (n=N0+N1+N9) 。 例如: 内存中有 0000H, 000FH, FFFFH, 结果为 10H, 0CH, 00H, ,最后为 n 部分程序已给出,其中原 始数据由过程 LOAD从文件 INPUT1.DAT中读入SOURCE开始的内存单元中
2、。运算结果要求从 RESULT开始存放,由过程 SAVE保存到文件 OUTPUT1.DAT中。 填空 BEGIN和 END之间已给出的源程序使其完整 (空白已用横线标出,每行空白一般只需一条指令,但采用功能相当的多条指令亦可 ),或删除 BEGIN和 END之间原有的代码并自行编程来完成要求的功能。 对程序必须进行汇编,并与 IO.OBJ链接产生 PROG1.EXE执行文件,最终运行程序产生结果 (无结果或结果不正确者均不得分 )。调试中若 发现整个程序中存在错误之处,请加以修改。 PROG1.ASM文件内容如下: EXTRN LOAD: FAR, SAVE: FAR N EQU 10 STA
3、C SEGMENT STACK DB 128 DUP(?) STAC ENDS DATA SEGMENT SOURCE DW N DUP(?) RESULT DB N+1 DUP(0) NAME0 DB INPUT1.DAT, 0 NAME1 DB OUTPUT1.DAT, 0 DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA, SS: STAC START PROC FAR PUSH DS XOR AX, AX PUSH AX MOV AX, DATA MOV DS, AX LEA DX, SOURCE ;数据区起始地址 LEA SI, NAM
4、E0 ;原始数据文件名 MOV CX, N*2 ;字节数 CALL LOAD ;从 INPUT1.DAT中读取数据 ; * * * * BECIN * * * * MOV DI, OFFSET RESULT MOV CL, N MOV BX, 0 MOV DH, 0 PRO: MOV DL, 0 MOV AX, SOURCEBX MOV CH, _ COUNT: _ _ _ JUMP INC DL JUMP: DEC CH JNZ _ MOV DI, DL ADD DH, DL INC DI ADD _ DEC CL JNZ PRO MOV _ ; * * * * END * * * * LE
5、A DX, RESULT ;结果数据区首址 LEA SI, NAME1 ;结果文件名 MOV CX, N+1 ;结果字节数 CALL SAVE ;保存结果到文件 RET START ENDP CODE ENDS END START PC技术机试模拟试卷 16答案与解析 一、程序设计题 1 【正确答案】 ; *BEGIN* MOV DI, OFFSET RESULT ;目的存储区首址 DI MOV CL, N ;设置外层循环次数为 N(即 10次 ) MOV BX, 0 ;源数据区起始地址 MOV DH, 0 ; DH用于累计 0个数的总个数 PRO: MOV DL, 0 ; DL用于累计每行
6、0个数 MOV AX, SOURCEBX MOV CH, 10H ;设置左移次数 16次 COUNT: SHL AX,1 ;左移,把最高位移到 CF JC JUMP ;若 CP为 1,则 DL不计数 INC DL ; CF为 0,为则 DL计数 JUMP: DEC CH JNZ COUNT ; 16位未统计完,则跳到 COUNT继续 MOV DI, DL ;目的存储区存入 0的个数 ADD DH, DL ; DH累计 0个数的总个数 INC DI ; DI指向下一个存储单元 ADD BX,2 ; BX指向下一个存储单元 DEC CL JNZ PRO MOV 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 0F00 08 08 08 08 04 0F 0F 61