1、三级 PC技术机试-103 及答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.编制一个程序,其功能为:内存中以 8位无符号数形式连续存放着 10个数据,这数据来自于一个自动抄表系统记录的 10个用户某月天然气的使用量(立方米),天然气费计算公式如下(其中,X 表示天然气用量,Y 表示应交天然气费): a)YX80 X6 b)YX120 6X10 c)YX160 X10计算每个用户需要交的天然气费,结果用字表示,并将结果存入指定单元。例如:用天然气量:05H,07H,12H天然气费: 0190H,0348H,0780H部分程序已经给出,其中原始
2、数据由过程 LOAD从文件 INPUT.DAT中读入以 SOURCE开始的内存单元中。运算结果要求从 RESULT开始的内存单元存放, 由过程 SAVE保存到文件 OUTPUT.DAT中。请填空 BEGIN和 END之间已给出的源程序使其完整,空白已经用横线标出,每行空白一般只需要一条指令,但采用功能相当的多条指令亦可,考生也可以删除 BEGIN和 END之间原有的代码并自行编程来完成要求的功能。对程序必须进行汇编,并与 IO.OBJ链接产生执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。试题程序EXTRN LOAD:FAR,SAVE:FARN EQU 10DS
3、EG SEGMENTSOURCE DB N DUP(?)RESULT DW N DUP(0)A DB 80B DB 120C DB 160NAME0 DB INPUTDAT,0NAME1 DB OUTPUTDAT,0DSEG ENDSSSEG SECMENT STACKDB 256 DUP(?)SSEG ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DSEG,SS:SSEGSTART PROC FARPUSH DSXOR AX,AXPUSH AXMOV AX,DSEGMOV DS,AXLEA DX,SOURCELEA SI,NAME0MOV CX,NCALL LOAD;
4、* BEGIN *LEA SI,SOURCELEA DI,RESULTCLDMOV CX,NAGAIN: MOV AL,SICMP AL,6JA (1) (2) JMP NEXTLIMIT6:CMP AL,10JA (3) (4) JMP NEXTLIMIT10: (5) NEXT: MOV DI,AXINC SIADD DI,2LOOP AGAIN; * END *LEA DX,RESULTLEA SI,NAME1MOV CX,N*2CALL SAVERETSTART ENDPCSEG ENDSEND START(分数:100.00)_三级 PC技术机试-103 答案解析(总分:100.00
5、,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.编制一个程序,其功能为:内存中以 8位无符号数形式连续存放着 10个数据,这数据来自于一个自动抄表系统记录的 10个用户某月天然气的使用量(立方米),天然气费计算公式如下(其中,X 表示天然气用量,Y 表示应交天然气费): a)YX80 X6 b)YX120 6X10 c)YX160 X10计算每个用户需要交的天然气费,结果用字表示,并将结果存入指定单元。例如:用天然气量:05H,07H,12H天然气费: 0190H,0348H,0780H部分程序已经给出,其中原始数据由过程 LOAD从文件 INPUT.DAT中读入以 S
6、OURCE开始的内存单元中。运算结果要求从 RESULT开始的内存单元存放, 由过程 SAVE保存到文件 OUTPUT.DAT中。请填空 BEGIN和 END之间已给出的源程序使其完整,空白已经用横线标出,每行空白一般只需要一条指令,但采用功能相当的多条指令亦可,考生也可以删除 BEGIN和 END之间原有的代码并自行编程来完成要求的功能。对程序必须进行汇编,并与 IO.OBJ链接产生执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。试题程序EXTRN LOAD:FAR,SAVE:FARN EQU 10DSEG SEGMENTSOURCE DB N DUP(?)R
7、ESULT DW N DUP(0)A DB 80B DB 120C DB 160NAME0 DB INPUTDAT,0NAME1 DB OUTPUTDAT,0DSEG ENDSSSEG SECMENT STACKDB 256 DUP(?)SSEG ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DSEG,SS:SSEGSTART PROC FARPUSH DSXOR AX,AXPUSH AXMOV AX,DSEGMOV DS,AXLEA DX,SOURCELEA SI,NAME0MOV CX,NCALL LOAD; * BEGIN *LEA SI,SOURCELEA DI,
8、RESULTCLDMOV CX,NAGAIN: MOV AL,SICMP AL,6JA (1) (2) JMP NEXTLIMIT6:CMP AL,10JA (3) (4) JMP NEXTLIMIT10: (5) NEXT: MOV DI,AXINC SIADD DI,2LOOP AGAIN; * END *LEA DX,RESULTLEA SI,NAME1MOV CX,N*2CALL SAVERETSTART ENDPCSEG ENDSEND START(分数:100.00)_正确答案:(1)LIMIT6 (2)MUL A (3)LMIT10 (4)MUL B (5)MUL C)解析:解析
9、本题一个分段函数的问题,根据数据大小的不同,再采用不同的计算方法求出结果。其中所需要的一些常量在数据段中已经进行了定义,在程序中直接使用即可。但由于对每个数据进行处理的算法是相同的,因此用一个循环即可实现对所有数据的处理。另外,由于要分成不同的情况进行计算,所以循环中采用的是分支程序来实现。进入循环以后,将数据取入 AL中,并将其与 6进行比较,如果大于 6的话就需要进行跳转,否则将执行下面的操作。由于小于 6时天然气费计算的方法是乘以 80,因此第二个空白处应该填的内容是 MUL A。第一个空白处应填跳转到哪条语句继续执行,有两个选择 LMIT6或 LIMIT10,但由于当数据大于 6的时候,还有一个上限 10需要比较,因此跳转的方向应该是和 10进行比较的语句,从程序中可以知道应该是LIMIT6。第三个和第四个空白是数据和 10进行比较后所需要的处理,大于 10的时候跳转,小于 10的时候继续执行。前面已经与 6进行过比较,大于 6的数才执行到这里,而数据又小于 10,因此此时的天然气费计算方法是乘以 120,即第四个空白处应填 MUlB。由于大于 10的时候天然气费的计算方法为乘以160,因此最后一个空白处的语句是 MUL C。