编制一个程序,实现如下功能:将内存中连续存放的10个八位二进制无符号数按照从大到小的顺序排列。 例如: 内存中有:3EH,0FEH,5DH……(假设后面的7个数都小于3EH) 结果为: 0FEH,5DH,3EH……(后面跟7个字,按照从

admin2010-12-14  42

问题 编制一个程序,实现如下功能:将内存中连续存放的10个八位二进制无符号数按照从大到小的顺序排列。
   例如:
   内存中有:3EH,0FEH,5DH……(假设后面的7个数都小于3EH)
   结果为:  0FEH,5DH,3EH……(后面跟7个字,按照从大到小的顺序排列)。
   部分程序已经给出,其中原始数据由过程LOAD从文件INPUT.DAT中读入以SOURCE开始的内存单元中。运算结果要求从RESULT开始的内存单元存放,由过程SAVE保存到文件OUTPUT.DAT中。
   请填空BEGIN和END之间已给出的源程序使其完整,空白已经用横线标出,每行空白一般只需要一条指令,但采用功能相当的多条指令也行,考生也可以删除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’,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        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

选项

答案(1)1 (2)ADD DI,1 (3)JBE NEXT (4)MOV[SI-1],AX (5)DEC BX

解析 本题是一道降序排列题,程序首先是将以SOURCE开始的内存单元中的数据传送到RESULT中,利用循环AGAIN0实现。在循环中,需要不断地改变指针,但由于题中的变量为字节型,因此指针的改变为1,即第一个空白处应填1。指向SOURCE的指针增加1的时候,指向RESULT的指针也应该增加1,所以第二个空白处应填ADD DI,1。
   接下来的程序便是对数据进行从大到小排列,CLD使指针向着增加的方向移动。在对两个数据进行比较后,因为要求从大到小排列,所以小的数据要往后移,若后面的数据较小,则不需要交换,直接进行下一次比较,所以第三个空白处应填JBE NEXT。若后面的数据大,则在进行数据交换以后需要将大的数据装入前面的存储单元,因此第四个空白处应填MOV[SI-1],AX。每一轮比较后,参加比较的数据的较小者都被放到了最后,这样只需要N-1轮比较就可以得到正确的排序。排序轮次的控制由BX寄存器来实现,因此最后一个空白处应填DEC BX。
转载请注明原文地址:https://jikaoti.com/ti/qs27FFFM
0

最新回复(0)