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