三个数排序,可用三个变量之间相互比较,按大小要求排序。
C语言伪代码:
if(a>b) /*如果a大于b,借助中间变量t实现a与b值的互换*/
{
t = a;
a = b;
b = t;
}
if(a>c) /*如果a大于c,借助中间变景t实现a与c值的互换*/
{
t = a;
a = c;
c = t;
}
if(b>c) /*如果b大于c,借助中间变量t实现b与c值的互换*/
{
t = b;
b = c;
c = t;
}
例1: 编程将(AX)=2387、(BX)=192FH、(CX)=9256中的无符号数按由大到小的顺序排序,上机编程调试出程序,并将排序结果记录在下面。
无符号数排序,可以用CMP指令比较大小后,JB或JC指令跳转至交换实现:
CODE SEGMENT
ASSUME CS:CODE
START:
MOV AX,2387;注意这里题目要求不是16进制
MOV BX,192FH
MOV CX,9256
cmp AX,BX ;相当于相减指令,不返回结果
JC CH1 ;若(AX)<(CX),则相减后产生借位,跳转至交换部分
NEXT1:
cmp AX,CX
JC CH2
NEXT2:
cmp BX,CX
JC CH3
JMP EXIT
CH1:
XCHG AX,BX
JMP NEXT1
CH2:
XCHG AX,CX
JMP NEXT2
CH3:
XCHG BX,CX
EXIT:
MOV AH,4CH
INT 21H
CODE ENDS
END START
通过多次单步执行后观察寄存器值变化,可得出:
(AX)=2428>(BX)=192FH>(CX)=0953,已自动转换为16进制,
即从大到小排序:(AX)=9256D == 2428H > (BX)=192FH > (CX)=2387 == 0953H。
若改为从小到大排序,只需将JB或JC命令换为JA命令。
若为有符号数排序,则使用JLE或JGE命令实现:
例2: 编程将(AX)=9387H、(BX)=192FH、(CX)=9256H中的无符号数按由小到大的顺序排序,上机编程调试出程序,并将排序结果记录在下面。
CODE SEGMENT
ASSUME CS:CODE
START:
MOV AX,9387H;注意这里题目要求不是16进制
MOV BX,192FH
MOV CX,9256H
cmp AX,BX ;相当于相减指令,不返回结果
JGE CH1 ;若(AX)>(CX),则跳转至交换部分
NEXT1:
cmp AX,CX
JGE CH2
NEXT2:
cmp BX,CX
JGE CH3
JMP EXIT
CH1:
XCHG AX,BX
JMP NEXT1
CH2:
XCHG AX,CX
JMP NEXT2
CH3:
XCHG BX,CX
EXIT:
MOV AH,4CH
INT 21H
CODE ENDS
END START
DEBUG执行后可看到结果:
已知:
9256H
补码:1110110110101010 (第一位为符号位)
十进制:-28074
9387H
补码:1110110010111001(第一位为符号位)
十进制:-27833
故转换正确,若改为从大到小排序,只需将JGE改为JLE。