c语言如何记录循环次数count,汇编排序知识之冒泡排序

这里简单介绍汇编中是如何进行冒泡排序的,首先先回顾C语言中的冒泡排序知识及算法,再讲解汇编实现的过程,更好的巩固和联系了编程的思想。

一. C语言——冒泡排序

冒泡排序的基本概念: 依次比较相邻的两个数,将小数放在前面,大数放在后面。每完成一遍查找都会找到一个最大数,直至排序结束.

0818b9ca8b590ca3270a3433284dd417.png

由上表可见每轮排序都能确定一个最大数,直至排序结束,它相对应的C语言代码如下:其中j参数设置为N-i-1简化了排序的复杂度,也可以是N-1.

0818b9ca8b590ca3270a3433284dd417.png

二.汇编——冒泡排序

相对应的汇编冒泡排序如下图所示:

DATAS SEGMENT

A DW0,15,70,30,32,89,12,12,34,4,38,23,45,13,43,24,54,24,54,1

Count EQU($-A)/2 ;数组中元素的个数(字节)

DATAS ENDS

CODES SEGMENT

ASSUME CS:CODES,DS:DATAS

START:

MOV AX,DATAS

MOV DS,AX

;-------------------------------------------------------------------------

;冒泡排序核心算法 A排序

MOV CX,Count-1 ;外层循环执行n-1次

I10:

XOR SI,SI ;异或清零

XOR DI,DI

I20:

MOV AX,A[SI]

MOV BX,A[SI+2]

CMP AX,BX

;比较AX和BX大小:AX

JL I30

MOV A[SI],BX

MOV A[SI+2],AX ;交换位置

I30:

ADD SI,2 ;SI加2:移动一个数字位置

INC DI ;DI加1

CMP DI,CX

;比较CX和DI大小:DI

JB I20

Loop I10 ;循环调至I10,Loop循环CX执行一次减1

;-------------------------------------------------------------------------

MOV AH,4CH

INT 21H

CODES ENDS

END START

其中先在数据段中定义一个数组A并存储20个数,而Count=($-A)/2存储数组中元素的个数,其中$表示当前位置,即数组A中最后一个数位置减去A的起始位置,由于A是DW(2字节),所以除以2转换为数组个数:20.

依次比较A中相邻两个数,存储至AX=A[SI]和BX=A[SI+2]中,比较成立即交换否则跳转至SI加2,继续比较下一个相邻两数。

同时CX中记录外层循环次数Count-1.利用Loop循环,Loop每循环依次默认的CX寄存器会减1,直至为0,循环停止。DI中记录排序好的个数,每次加1与CX比较,直至排序结束。

输出如下图结果,这里就省略了输出函数。只是想讲讲冒泡排序的过程,见谅!!!

0818b9ca8b590ca3270a3433284dd417.png

希望能帮助大家更好的理解C语言与汇编中的冒泡排序的联系与思想,谢谢!不足之处望读者谅解。By:Eastmount

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值