问答题 A、B、C单元各有一个数。若三个数均为奇数,按递增顺序排序。若三个数均为偶数,按递减顺序排序。若有奇数和偶数,则奇数在前,偶数在后,且同类数按升序排序。
【正确答案】DATA    SEGMENT
     A  DB  '3'
     B  DB  '6'
     C  DB  '7'
   DATA    ENDS
   CODE    SEGMENT
     ASSUME  CS:CODE,DS:DATA
   START:MOV  AX,DATA
          MOV  DS,AX
          MOV  AL,A
          AND  AL,01H    ;判断第一个数是否为偶数
          JZ   EVEN    ;是则转第一个数为偶数部分
          MOV  AL,B
          AND  AL,01H    ;判断第二个数是否为偶数
          JZ   PEVEN    ;是则转第一个数为奇数、第二个数为偶数部分
          MOV  AL,C
          AND  AL,01H    ;判断第三个数是否为偶数
          JZ   PEV01   ;是则转第一、二个数为奇数、第三个数为偶数部分
                        ;三个数均为奇数,按升序排列
          MOV  AL,A    ;取第一个操作数
          CMP  AL,B    ;比较第一个操作数和第二个操作数
          JC   AB1   ;第一个数小于第二个数不交换
          XCHG AL,B    ;交换
          MOV  A,AL    ;将AL中的数存入A
     AB1: CMP  AL,C
          JC   CA    ;A中为最小数
          XCHG AL,C
          MOV  A,AL    ;经过2次比较,A中为最小数
     CA:  MOV  AL,B    ;比较剩余的两数,完成排序
          CMP  AL,C
          JC   AA
          XCHG AL,C
          MOV  B,AL    ;A、B、c为升序排列
    AA:   JMP  OVER
          ;第一个数为偶数
   EVEN: MOV  AL,B
          AND  AL, 01H    ;判断第二个数是否为偶数
          JNZ  PEV05   ;不是则转第一个数为偶数,第二个数为奇数部分
          MOV  AL,C
          AND  AL,01H    ;判断第三个数是否为偶数
          JNZ  PEV06   ;不是则转第一、第二个数为偶、第三个数为奇数部分
                        ;三个数均为偶数,按降序排列
          MOV  AL,A    ;偶数按降序排列,取第一个操作数
          CMP  AL,B    ;比较第一个操作数和第二个操作数
          JNC  AB    ;第一个数大于第二个数不交换
          XCHG AL,B    ;交换
          MOV  A,AL    ;将AL中数存入A,A中存大数
    AB:  CMP  AL,C
          JNC  CA    ;A中为最大数
          XCHG AL,C
          MOV  A,AL    ;经过2次比较,A中为最大数
   CA:   MOV  AL,B    ;比较剩余的两数,完成排序
          CMP  AL,C
          JC   AA
          XCHG AL,C
          MOV  B,AL
          JMP  0VER
           ;第一个数为奇数,第二个数为偶数
   PEVEN:MOV  AL,C
          AND  AL,01H
          JNZ  PEV02   ;转第一个数为奇数、第二个数为偶数,第三个数为奇数部分;第一个数为奇数,第二、第三个数为偶数
   PEV03:MOV  AL,B    ;取第二个操作数
          CMP  AL,C    ;比较两个偶数
          JNC  AB3   ;第二个数大于第三个数不交换
          XCHG AL,B    ;交换
   AB3:  MOV  C,AL    ;将AL中数存入A+2
          JMP  OVER    ;已降序,转OVER;第一、二个数为奇数,奇数按升序排列,偶数不动
   PEV01:MOV  AL,A    ;取第一个操作数
          CMP  AL,B    ;比较第一个操作数和第二个操作数
          JC   AB1   ;第一个数小于第二个数不交换
         XCHG  AL,B    ;交换
   AB1: MOV   A,AL    ;将AL中数存入A
         JMP   OVER
          ;第一、三个数为偶数,偶数按升序排列,奇数占第一个位置
   PEV05:MOV  AL,B    ;取第二个操作数
          XCHG AL,A    ;交换,A中变为奇数
          CMP  AL,C    ;比较第二个操作数和第三个操作数
          JC   AB5   ;第一个数小于第二个数不交换
          XCHG AL,C    ;交换
   AB5:  MOV  B,AL    ;将AL中数存入A+1单元
          JMP  OVER
                     ;第一、三个数为奇数,第二个数为偶数
   PEV02:MOV  AL,B    ;取第二个操作数
          XCHG AL,C    ;交换,偶数在最后面
          CMP  AL,A    ;比较第一个和第二个操作数
          JC   AB2   ;第一个数小于第二个数不交换
          XCHG AL,B    ;交换
   AB2:   MOV  A,AL    ;将AL中数存入A
          JMP  OVER    ;已升序,转OVER
                   ;第一、二个数为偶数,第三个数为奇数
   PEV06: MOV  AL,C    ;取第三个操作数
          XCHG AL,A    ;第一和第三个数交换,A中为奇数,AL中为偶数
          CMP  AL,B    ;比较两个偶数
          JNC  AB6   ;第三个数大于第二个数不交换
          XCHG AL,B    ;交换
   AB6:   MOV  C,AL    ;将AL中数存入A+2
   JMP    OVER    ;已降序,转OVER
            ;第一个数为偶数,第二、三个数为奇数
   PEV04: MOV  AL,C    ;取第三个操作数
          XCHG AL,A    ;第一和第三个数交换,A中为奇数,AL中为偶数
          MOV  C,AL    ;将偶数存于C中
          MOV  AL,A    ;取第一个奇数到AL中
          CMP  AL,B    ;比较两个奇数
          JC   AB4   ;第二个数小于第三个数不交换(升序)
          XCHG AL,B    ;交换
   AB4:   MOV  C,AL    ;将AL中数存入C
          JMP  OVER    ;已降序,转OVER
   OVER:  MOV  AH,02H
          MOV  DL,A
          INT  21H
          MOV  DL,A+1
          INT  21H
          MOV  DL,A+2
          INT  21H
          MOV  AH,4CH
          INT  21H
   CODE ENDS
   END START
   说明:本题中是用AND AL,01H来判断操作数的奇偶性的,也可以使用TEST AL,01H完成奇偶性的判断。
【答案解析】本题实际上是一种组合求解。三个数只有八种组合,除了奇奇奇、偶偶偶外,还有奇奇偶、奇偶奇、奇偶偶、偶奇奇、偶奇偶、偶偶奇六种组合,分别对应的程序段为:PEV01、PEV02、PEV03、PEV04、PEV05、PEV06。一个二进制数若为奇数,则其最后一位必为1,否则为偶数。第一个为奇数的有四种组合,第一个为偶数的也有四种组合。为便于观看结果,在程序的最后将三个数显示在屏幕上。