编制一个程序,使其实现如下功能:将内存中连续存放的10个十六位二进制无符号数按照从小到大的顺序排列。 例如: 内存中有:3456H,2345H,5643H,…(假设后面的7个数都大于5643H) 结果为: 2345H,3456H,564

admin2010-09-01  38

问题 编制一个程序,使其实现如下功能:将内存中连续存放的10个十六位二进制无符号数按照从小到大的顺序排列。
   例如:
   内存中有:3456H,2345H,5643H,…(假设后面的7个数都大于5643H)
   结果为:  2345H,3456H,5643H,…(后面跟7个字,按照从小到大的顺序排列)。
   部分程序已经给出,其中原始数据由过程LOAD从文件INPUT.DAT中读入以SOURCE开始的内存单元中。运算结果要求从RESULT开始的内存单元存放,由过程SAVE保存到文件OUTPUTDAT中。
   请填空BEGIN和END之间已给出的源程序使其完整,空白已经用横线标出,每行空白一般只需要一条指令,但采用功能相当的多条指令亦可,考生也可以删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。
   对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。
   [试题程序]
            EXTRN    LOAD:FAR,SAVE:FAR
   N        EOU      10
   SSEG     SEGMENT STACK
            DB       256 DUP  (?)
   SSEG     ENDS
   DSEG     SEGMENT
   SOURCE   DW       N  DUP  (?)
   RESULT   DW       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*2
            CALL     LOAD
   ;    ********  BEGIN  ********
            MOV      SI,OFFSET  SOURCE
            MOV      DI,  (1)  
            MOV      CX,N
   AGAIN0: MOV      AX,[SI]
            MOV      [DI],AX
            ADD      SI,2
            ADD      DI,2
            LOOP     AGAIN0
            CLD
            MOV      BX,N-1
   AGAIN1: MOV      SI,OFFSET  RESULT
            MOV      CX,BX
   AGAIN2: LODSW
            CMP      [SI],  (2)  
            JAE      NEXT
             (3)  
            MOV      [SI-2],AX
   NEXT:   LOOP      (4)  
            DEC      BX
            JNZ        (5)  
   ;    ********  END  ********
            LEA      DX,RESULT
            LEA      SI,NAME1
            MOV      CX,N*2
            CALL     SAVE
            RET
   START    ENDP
   CSEG     ENDS
            END      START

选项

答案(1)OFFSET RESULT (2)AX (3)XCHG [SI],AX (4)AGAIN2 (5)AGAIN1

解析 从整个程序可以看出,程序所采用的方法是先将从SOURCE开始的内存单元的内容送到从RESULT开始的内存单元中,然后对从RESULT内存单元开始的数据进行排序。程序第一个循环的作用是完成数据传送,由此可以判断传送到DI中的应该是RESm。丁存储单元的偏移地址,即第一个空白处应填OFFSET RESULT。当数据全部传送到从RESULT开始的单元以后,便对其进行从小到大的排序。在排序的过程中,使用的是取字符串指令LODSW,所以比较的数应该在AX寄存器中,即第二个空应填AX。接下来的程序实现的是比较功能,程序采用的是逐项比较的算法,当后面的元素大于前面的元素时,直接进行下一次循环,而当后面的元素较小的话,就需要和前面的元素进行交换,因此需要填写的指令是XCHG[SI],AX。当程序执行完一次排序以后,最大的数已经在最后面,因此下一次只需要对前N-1个数进行比较,并且循环应该从第一个数据开始,所以后两个空应该分别填AGAIN2和AGAIN1。
转载请注明原文地址:https://kaotiyun.com/show/eTgZ777K
0

最新回复(0)