【正确答案】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,否则为偶数。第一个为奇数的有四种组合,第一个为偶数的也有四种组合。为便于观看结果,在程序的最后将三个数显示在屏幕上。