DOS汇编练习(7)——无符号数排序及有符号数排序

三个数排序,可用三个变量之间相互比较,按大小要求排序。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wayne_Fine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值