1、三级 PC 技术机试-157 及答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.编制一个程序,实现如下功能:将内存中连续存放的 10 个八位二进制无符号数按照从大到小的顺序排列。例如:内存中有:3EH,0FEH,5DH(假设后面的 7 个数都小于 3EH)结果为: 0FEH,5DH,3EH(后面跟 7 个字,按照从大到小的顺序排列)。部分程序已经给出,其中原始数据由过程 LOAD 从文件 INPUTDAT 中读入以 SOURCE 开始的内存单元中。运算结果要求从 RESULT 开始的内存单元存放,由过程 SAVE 保存到文件 OUTPUT.D
2、AT 中。请填空 BEGIN 和 END 之间已给出的源程序使其完整,空白已经用横线标出,每行空白一般只需要一条指令,但采用功能相当的多条指令也行,考生也可以删除 BEGIN 和 END 之间原有的代码并自行编程来完成要求的功能。对程序必须进行汇编,并与 IOOBJ 链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。【试题程序】EXTRN LOAD:FAR,SAVE:FARN EQU 10SSEG SEGMENT STACKDB 256 DUP (?)SSEG ENDSDSEG SEGMENTSOURCE DB N DUP (?)RESULT DB N
3、DUP (0)NAME0 DB INPUT.DAT,0NAME1 DB OUTPUT.DAT,0DSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG,SS:SSEGSTART PROC FARPUSH DSXOR AX,AXPUSH AXMOV AX,DSEGMOV DS,AXLEA DX, SOURCELEA SI,NAME0MOV CX,NCALL LOAD;* BEGIN *MOV SI,OFFSET SOURCEMOV DI,OFFSET RESULTMOV CX,NAGAIN0: MOV AX, SIMOV DI,AXADD SI, (1) (2
4、)LOOP AGAIN0CLDMOV BX,N-1AGAIN1: MOV SI,OFFSET RESULTMOV CX,BXAGAIN2: LODSBCMP SI,AX(3) XCHG SI,AX(4) NEXT: LOOP AGAIN2(5) JNZ AGAIN1;* END *LEA DX,RESULTLEA SI,NAME1MOV CX,NCALL SAVERETSTART ENDPCSEG ENDSEND START(分数:100.00)_三级 PC 技术机试-157 答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.编制一个程序,实现
5、如下功能:将内存中连续存放的 10 个八位二进制无符号数按照从大到小的顺序排列。例如:内存中有:3EH,0FEH,5DH(假设后面的 7 个数都小于 3EH)结果为: 0FEH,5DH,3EH(后面跟 7 个字,按照从大到小的顺序排列)。部分程序已经给出,其中原始数据由过程 LOAD 从文件 INPUTDAT 中读入以 SOURCE 开始的内存单元中。运算结果要求从 RESULT 开始的内存单元存放,由过程 SAVE 保存到文件 OUTPUT.DAT 中。请填空 BEGIN 和 END 之间已给出的源程序使其完整,空白已经用横线标出,每行空白一般只需要一条指令,但采用功能相当的多条指令也行,考
6、生也可以删除 BEGIN 和 END 之间原有的代码并自行编程来完成要求的功能。对程序必须进行汇编,并与 IOOBJ 链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。【试题程序】EXTRN LOAD:FAR,SAVE:FARN EQU 10SSEG SEGMENT STACKDB 256 DUP (?)SSEG ENDSDSEG SEGMENTSOURCE DB N DUP (?)RESULT DB N DUP (0)NAME0 DB INPUT.DAT,0NAME1 DB OUTPUT.DAT,0DSEG ENDS CSEG SEGMENT ASSU
7、ME CS:CSEG,DS:DSEG,SS:SSEGSTART PROC FARPUSH DSXOR AX,AXPUSH AXMOV AX,DSEGMOV DS,AXLEA DX, SOURCELEA SI,NAME0MOV CX,NCALL LOAD;* BEGIN *MOV SI,OFFSET SOURCEMOV DI,OFFSET RESULTMOV CX,NAGAIN0: MOV AX, SIMOV DI,AXADD SI, (1) (2)LOOP AGAIN0CLDMOV BX,N-1AGAIN1: MOV SI,OFFSET RESULTMOV CX,BXAGAIN2: LODSB
8、CMP SI,AX(3) XCHG SI,AX(4) NEXT: LOOP AGAIN2(5) JNZ AGAIN1;* END *LEA DX,RESULTLEA SI,NAME1MOV CX,NCALL SAVERETSTART ENDPCSEG ENDSEND START(分数:100.00)_正确答案:(1)1 (2)ADD DI,1 (3)JBE NEXT(4)MOVSI-1,AX (5)DEC BX)解析:解析本题是一道降序排列题,程序首先是将以 SOURCE 开始的内存单元中的数据传送到 RESULT 中,利用循环AGAIN0 实现。在循环中,需要不断地改变指针,但由于题中的变量
9、为字节型,因此指针的改变为 1,即第一个空白处应填 1。指向 SOURCE 的指针增加 1 的时候,指向 RESULT 的指针也应该增加 1,所以第二个空白处应填 ADD DI,1。接下来的程序便是对数据进行从大到小排列,CLD 使指针向着增加的方向移动。在对两个数据进行比较后,因为要求从大到小排列,所以小的数据要往后移,若后面的数据较小,则不需要交换,直接进行下一次比较,所以第三个空白处应填 JBE NEXT。若后面的数据大,则在进行数据交换以后需要将大的数据装入前面的存储单元,因此第四个空白处应填 MOVSI-1,AX。每一轮比较后,参加比较的数据的较小者都被放到了最后,这样只需要 N-1 轮比较就可以得到正确的排序。排序轮次的控制由 BX 寄存器来实现,因此最后一个空白处应填 DEC BX。