问答题 从DAT单元起有一组字节数据序列,长度为10个字节。试分别用交换排序、选择排序、插入排序完成升序排列,并将排序结果送CRT显示。
【正确答案】交换排序(冒泡法):
   SSEG    SEGMENT PARA STACK'STACK'
           DB 100DUP(?)
   SSEG    ENDS
   DATA    SEGMENT
   DAT     DB 2,67,33,12,56,89,54,20,98,10
   DATA    ENDS
   CODE    SECMENT
     ASSUME  CS: CODE,DS: DATA,SS: SSEG
   STA:     MOV AX,DATA
            MOV DS,AX
            LEA SI,DAT    ;置数据区地址指针
            MOV CX,10   ;置计数初值
   NEXT:    MOV DX,CX    ;置内循环计数初值
            PUSHSI
   LP1:     MOV AL,[SI]
            CMP AL,[SI+1]
            JBE  LP2
            XCHGAL,[SI+1]
            MOV [SI],AL
   LP2:     INC SI    ;调整指针
            DEC DX    ;内循环计数值减1
            JNZ LP1   ;未完,转LP1
            POP SI
            LOOP NEXT    ;未完,转NEXT
            MOV CX,10
            LEA SI,DAT
   NXT:     MOV AL,[SI]
            MOV AH,0
            MOV BL,10
            DIV BL
            MOV DL,AL
            MOV DH,AH
            ADD DL,30H
            MOV AH,02H
            INT 21H
            MOV DL,DH
            ADD DL,30H
            INT 21H
            MOV DL,','
            INT 21H
            INC SI
            LOOP NXT
            MOV AH,4CH
            INT 21H
    CODE    ENDS
    END     STA
   选择排序:
   DATA    SEGMENT
   DAT     DB 2,5,79,12,24.35,98,45,35,96
   DATA    ENDS
   CODE    SEGMENT
     ASSUME CS: CODE,DS: DATA
   START:     MOV AX,DATA
              MOV DS,AX
              MOV AX,0
              MOV CX,AX
              LEA DI,DAT
              MOV CL,10
              DEC CX
   LP:        MOV BX,CX    ;置内循环循环次数
              MOV SI,D1   ;置内循环开始比较的数据地址
              MOV AL,[DI]    ;取未排序的第一个数
              CALL LK    ;调用子程序
              MOV [DI],AL    ;置已排序数列最大数于队首
              INC DI    ;调整指针
              LOOP LP    ;数列未排完则继续
              LEA  DI,DAT    ;否则显示输出
              MOV CL,10
   SC:        MOV AX,0
              MOV BH,2
              MOV AL,[DI]
              MOV BL,10
              DIV BL
              ADD AX,3030H
              MOV DL,AL
              MOV DH,AH
              MOV AH,02H
              INT 21H
              MOV DL,DH
              INT 21H
              MOV DL,','
              INT 21H
              INC DI
              LOOP SC
              MOV AH,4CH
              INT 21H
              LK  PROC
   LP1:       INC SI
              CMP AL,[SI]    ;比较
              JB  NEXT    ;大于,比较下一个数
              XCHGAL,[SI]    ;交换
   NEXT:      DEC  BX
              JNZ  LP1   ;未完,转到LP1
              RET    ;返回主程序
              LK  ENDP
   CODE       ENDS
   END        START
   插入排序:
   DATA    SEGMENT
   DAT     DB 2,5,79,12,24,35,98,45,35,96
   DATA    ENDS
   CODE    SEGMENT
     ASSUME CS: CODE,DS: DATA
   START:     MOV AX,DATA
              MOV DS,AX
              MOV AX,0
              MOV CX,AX
              LEA DI,DAT
              MOV CL,10
              DEC CX
              INC DI
   LP:        MOV SI,DI
              DEC SI
              MOV AL,[DI]
              PUSHDI
              CALL LK
              LOOP LP
              LEA DI,DAT
              MOV CL,10
   SC:        MOV AX,0
              MOV BH,2
              MOV AL,[DI]
              MOV BL,10
              DIV BL
              ADD AX,3030H
              MOV DL,AL
              MOV DH,AH
              MOV AH,02H
              INT 21H
              MOV DL,DH
              INT 21H
              MOV DL,','
              INT 21H
              INC  DI
              LOOP SC
              MOV  AH,4CH
              INT  21H
              LK   PROC
              MOV  BL,10
              SUB  BL,CL
   LP1:       CMP  AL,[SI]
              JA   RTT
              MOV  DL,[SI]
              MOV  [DI],DL
              MOV  [SI],AL
   RTT:       DEC  SI
              DEC  DI
              DEC  CL
              JNZ  LP1
              RET
              LK  ENDP
   CODE       ENDS
   END        START
【答案解析】