1、三级 PC技术机试-193 及答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.编制一个程序,使其实现如下功能:将内存中连续存放的 10个十六位二进制无符号数按照从小到大的顺序排列。例如:内存中有:3456H,2345H,5643H,(假设后面的 7个数都大于 5643H)结果为: 2345H,3456H,5643H,(后面跟 7个字,按照从小到大的顺序排列)。部分程序已经给出,其中原始数据由过程 LOAD从文件 INPUTDAT 中读入以 SOURCE开始的内存单元中。运算结果要求从 RESULT开始的内存单元存放,由过程 SAVE保存到文件
2、 OUTPUTDAT中。请填空 BEGIN和 END之间已给出的源程序使其完整,空白已经用横线标出,每行空白一般只需要一条指令,但采用功能相当的多条指令亦可,考生也可以删除 BEGIN和 END之间原有的代码并自行编程来完成要求的功能。对程序必须进行汇编,并与 IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。试题程序EXTRN LOAD:FAR,SAVE:FARN EOU 10SSEG SEGMENT STACKDB 256 DUP (?)SSEG ENDSDSEG SEGMENTSOURCE DW N DUP (?)RESULT DW N
3、 DUP (0)NAME0 DB INPUTDAT,0NAME1 DB OUTPUTDAT,0DSEG ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DSEG,SS:SSEGSTART PROC FARPUSH DSXOR AX,AXPUSH AXMOV AX,DSEGMOV DS,AXLEA DX,SOURCELEA SI,NAME0MOV CX,N*2CALL LOAD; * BEGIN *MOV SI,OFFSET SOURCEMOV DI, (1) MOV CX,NAGAIN0: MOV AX,SIMOV DI,AXADD SI,2ADD DI,2LOOP AGA
4、IN0CLDMOV BX,N-1AGAIN1: MOV SI,OFFSET RESULTMOV CX,BXAGAIN2: LODSWCMP SI, (2) JAE NEXT(3) MOV SI-2,AXNEXT: LOOP (4) DEC BXJNZ (5) ; * END *LEA DX,RESULTLEA SI,NAME1MOV CX,N*2CALL SAVERETSTART ENDPCSEG ENDSEND START(分数:100.00)_三级 PC技术机试-193 答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.编制一个程序,使其实
5、现如下功能:将内存中连续存放的 10个十六位二进制无符号数按照从小到大的顺序排列。例如:内存中有:3456H,2345H,5643H,(假设后面的 7个数都大于 5643H)结果为: 2345H,3456H,5643H,(后面跟 7个字,按照从小到大的顺序排列)。部分程序已经给出,其中原始数据由过程 LOAD从文件 INPUTDAT 中读入以 SOURCE开始的内存单元中。运算结果要求从 RESULT开始的内存单元存放,由过程 SAVE保存到文件 OUTPUTDAT中。请填空 BEGIN和 END之间已给出的源程序使其完整,空白已经用横线标出,每行空白一般只需要一条指令,但采用功能相当的多条指
6、令亦可,考生也可以删除 BEGIN和 END之间原有的代码并自行编程来完成要求的功能。对程序必须进行汇编,并与 IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。试题程序EXTRN LOAD:FAR,SAVE:FARN EOU 10SSEG SEGMENT STACKDB 256 DUP (?)SSEG ENDSDSEG SEGMENTSOURCE DW N DUP (?)RESULT DW N DUP (0)NAME0 DB INPUTDAT,0NAME1 DB OUTPUTDAT,0DSEG ENDSCSEG SEGMENTASSUME
7、CS:CSEG,DS:DSEG,SS:SSEGSTART PROC FARPUSH DSXOR AX,AXPUSH AXMOV AX,DSEGMOV DS,AXLEA DX,SOURCELEA SI,NAME0MOV CX,N*2CALL LOAD; * BEGIN *MOV SI,OFFSET SOURCEMOV DI, (1) MOV CX,NAGAIN0: MOV AX,SIMOV DI,AXADD SI,2ADD DI,2LOOP AGAIN0CLDMOV BX,N-1AGAIN1: MOV SI,OFFSET RESULTMOV CX,BXAGAIN2: LODSWCMP SI, (
8、2) JAE NEXT(3) MOV SI-2,AXNEXT: LOOP (4) DEC BXJNZ (5) ; * END *LEA DX,RESULTLEA SI,NAME1MOV CX,N*2CALL SAVERETSTART ENDPCSEG ENDSEND START(分数:100.00)_正确答案:(1)OFFSET RESULT (2)AX (3)XCHG SI,AX (4)AGAIN2 (5)AGAIN1)解析:解析从整个程序可以看出,程序所采用的方法是先将从 SOURCE开始的内存单元的内容送到从 RESULT开始的内存单元中,然后对从 RESULT内存单元开始的数据进行排序
9、。程序第一个循环的作用是完成数据传送,由此可以判断传送到 DI中的应该是 RESm。丁存储单元的偏移地址,即第一个空白处应填 OFFSET RESULT。当数据全部传送到从 RESULT开始的单元以后,便对其进行从小到大的排序。在排序的过程中,使用的是取字符串指令 LODSW,所以比较的数应该在 AX寄存器中,即第二个空应填 AX。接下来的程序实现的是比较功能,程序采用的是逐项比较的算法,当后面的元素大于前面的元素时,直接进行下一次循环,而当后面的元素较小的话,就需要和前面的元素进行交换,因此需要填写的指令是 XCHGSI,AX。当程序执行完一次排序以后,最大的数已经在最后面,因此下一次只需要对前 N-1个数进行比较,并且循环应该从第一个数据开始,所以后两个空应该分别填 AGAIN2和 AGAIN1。