汇编——实现冒泡排序+讲解

article/2025/9/18 5:10:11

题目描述&代码

有一个首地址为A的N字数组,编写程序采用冒泡排序使该数组中的数按照从大到小的次序整序。

数据存储在A的数组中(即内存中),我们需要利用冒泡排序实现从大到小排序。

;description
data SEGMENT USE16a    dw  8,16,41,22,50n    equ ($-a)/2
data ENDS
;description
stack SEGMENT USE16dw 32 dup(?)
stack ENDS
;description
code SEGMENT USE16ASSUME CS:CODE, DS:DATA, SS:STACKstart:mov    ax,datamov    ds,ax;存储n-1到cxmov    cx,ndec    cxloop2:;存储cx到dxmov    dx,cxshl    dx,1mov    si,0loop1:mov    ax,a[si]CMP    word ptr ax,a[si+2]ja     next;bx相当于是中间变量,交换mov    bx,axmov    ax,a[si+2]mov    a[si+2],bxmov    a[si],axnext: add    si,2cmp    si,dxjnz    loop1loop   loop2mov    ah,4chint    21h
code ENDS
end start

冒泡排序

对于一个数组,我们的冒泡排序是这样的:
比较相邻两项,将小的放在后面,重复n-1次,就能得到有序序列

这是一趟:
在这里插入图片描述
很明显,我们这样就能将最小的元素排在我们想要的位置。
然后进行第二轮,同理我们可以将第二小的元素排在合适的位置。

然后是第三轮、第四轮……,直到第n-1轮整体有序。
每一次最小的元素被选出来,就像是交换到了水面上,所以叫做冒泡排序。

这里再做一个优化,我们可以看出来,每一次需要排序的元素个数都会少一个。
实现部分我是用cx寄存器存储循环的n-1次,每一轮减一,刚好和需要排序的个数相同。

实现

数据准备

首先,我们已知数据存储在a数组中,这里我们计算元素个数的方式是采用了地址计数器"$",他的作用是保存当前正在汇编的指令的偏移地址
还有伪指令equ,有一点像等号,其实就是一个赋值操作,不过只能做一次。
在赋值的时候,地址计数器刚好将数组存入内存,并且地址计数器保存的是指令的第一个字节位置
图示:(这里的数据为十六进制)
在这里插入图片描述
这样我们用地址计数器减去a(这里是一个地址)就能得到该数组包含的字节个数,然后除以2就是字的个数了。

双重循环

这里的循环很明显是两层,如果都是loop指令就需要进行将cx寄存器压栈,我们采用的是cx和dx分别作为外层和内层的计数器。

在外层循环中,我们需要将cx的值递减(loop指令完成),同时需要给dx寄存器赋值,原因在上面说过了,我们想要优化一下排序次数。
因为数组的数据类型为dw,所以si下标一次加2,我们需要将dx乘二(左移一位)从而和si比较

在内层循环中,需要比较a[si]和a[si+2],但是因为两个不能都是内存寻址,这里我们先将a[si]放在ax中,然后和a[si+2]比较,注意在换的过程中是需要中间变量的,而且是修改数组的值。(我个憨憨最开始就只修改了ax寄存器的值)
在每一次交换之后,将si寄存器内容加2,和dx的值比较一下,如果不同说明没有达到最后,否则停止进入外层循环。
这里声明一下,内存中的数据都是以字节为单位进行操作的,所以我们将si加2(dw类型)

因为懒得写输出结果,所以我就直接debug查看内存了:
在这里插入图片描述
先使用g运行程序,然后找到存储data段的地址,因为我们的数组a是最开始的,所以偏移地址为0000。

因为地址从左到右是从低到高,所以3200表示的其实是0032,也就是十进制的50,以此类推。

对debug感兴趣的可以看这篇博客。


http://chatgpt.dhexx.cn/article/fAFuYWj5.shtml

相关文章

实现一个通用的冒泡排序 - C语言

一、前言 在对一组数组进行排序是,我们经常用到冒泡排序,它是一种较简单的排序算法。 冒泡排序的原理如下: 比较相邻的两个元素。如果第一个比第二个大,就交换它们两个。对每一对相邻元素做同样的工作,从开始第一对到…

第三次项目需求文档

北京理工大学大学疫苗接种系统 文章目录 一.UML图1.用例图2.类图3.活动图4.顺序图 二.需求规格说明文档1.需求和功能说明1.1.获取的功能需求.2.功能划分1.2.1.登录界面1.2.2.预约服务1.2.3.接种查询 2.工作量展示2.1.需求获取2.1.1.项目前景和范围2.1.2.涉众分析2.1.4.面谈 2.…

项目文档编写规范

此文件是 项目文档编写规范 的 readme 编写范例,点击 我要改进 即可查看其 Markdown 内容。 项目概述 产品名称:LaraBBS 项目代号:larabbs 官方地址: https://learnku.com/laravel/t/6592 LaraBBS 是一个简洁的论坛应用…

项目文档管理

项目文档管理&#xff08;Project Documents Management&#xff09; 目录 [隐藏 ] 1 项目文档管理的概述 2 文档管理在项目进程中的重要作用 3 如何建立项目文档管理规定 4 参考文献 <script type"text/javascript"> if (window.showTocToggle) { var …

项目文档如何管理?

在项目进行过程中&#xff0c;会产生很多相关文档文件。通常会散落的分布在不同员工的设备中以及聊天记录中&#xff0c;这种管理方式不仅增大了文件丢失的风险&#xff0c;而且不利于团队文件协作&#xff0c;以及项目经验知识沉淀。 项目文件的管理是项目管理中不可缺少的一…

项目部署文档

1.前提环境 名称版本jdkjdk1.7(建议不要超过1.8)mysql5.7tomcat7(建议不要超过8) 输入 java -version出现如下为jdk安装成功 2.Java环境安装与配置 参见&#xff1a;https://www.linuxidc.com/Linux/2017-01/139212.htm 3.Tomcat安装部署说明 以使用提供的tomcat为例tar z…

如何写项目文档?项目文档有哪些?

软件新人经常问我一个项目应该到底有哪些文档&#xff0c;在此结合工作实际把我一般形成的文档作一列表&#xff0c;仅供诸位参考。 一、项目立项建议书 项目立项建议书主要用于分析项目要求与各种资源是否能够匹配&#xff0c;用来决策层决定是否最终立项。 主要要素包括&…

synplify成功运行起designware的方法,巨坑

因为手头FPGA是zynq ultrascale。所以更新了synplify到2019版本。手里的项目必须要用designware来做验证。各种研究&#xff0c;填了N多的坑。终于搞定。 先说原理&#xff1a; 1. 电脑上有design compile&#xff0c;license各种都搞定&#xff0c;dw库可用。可以装在虚拟机…

VIVADO2018与SYNPLIFY联合使用

VIVADO2018与SYNPLIFY联合使用 1、synplify生成网表文件.edf ①新建工程&#xff0c;设置所选的FPGA型号。 ②添加源文件&#xff0c;可以源文件&#xff0c;也可以是包括很多源文件的文件列表&#xff08;.v/.sv&#xff09;。 ③根据需要添加约束文件.fdc。 ④点击RUN生成网…

ModelSim,synplify,ISE后仿真流程

首先&#xff0c;我把我用到的软件说明一下。如果你发现根据我的操作&#xff0c;你还是解决不了ModelSim后仿真的问题&#xff0c;那就可能是软件版本的问题。 1&#xff0c; ModelSim Se 6.1b 2&#xff0c; Synplify Pro 7.5.1 3&#xff0c; ISE 5.2i &#xff08;这个…

Python 中的Sympy详细介绍

Python 中的Sympy详细使用 遇到复杂计算找python绝对不让你失望&#xff0c;sympy是一个Python的科学计算库&#xff0c;用一套强大的符号计算体系完成诸如多项式求值、求极限、解方程、求积分、微分方程、级数展开、矩阵运算等等计算问题。虽然Matlab的类似科学计算能力也很强…

如何使用synplify综合ISE Core Generate生成的IP核

Xilinx的ISE软件有自带的综合工具XST&#xff0c;但是我们有时候需要使用第三方的综合工具&#xff08;例如Synopsys的Synplify Pro,Synplify Primier&#xff0c;其中&#xff0c;Synplify Primier可以综合synopsys的DesignWare库&#xff09;&#xff0c;这时候就需要在synpl…

synplify 9.6.2 download

现在这种工具太难找了&#xff0c;找了一上午才搞定&#xff1b;唉&#xff0c;还是贡献出来吧&#xff0c;最好别被河蟹掉 链接&#xff1a;http://pan.baidu.com/s/1pJv7ovx 密码&#xff1a;um2k 里面的破解方法有点问题&#xff0c; 一、install exe&#xff0c;选Fl…

如何破解Synplify Pro 9.6.2? (SOC) (Synplify)

软件安装与注意事项如下&#xff1a; Introduction Step 1&#xff1a; 安裝Synplify Pro Step 2&#xff1a; 選擇Floating (License is on a license server) Step 3&#xff1a; 稍後會設定SYNPLCTYD_LICENSE_FILE&#xff08;我认为是LM_LICENSE_FILE&#xff09;系統變數&…

lattice 的Synplify pro综合工具,以及RTL寄存器查看

对于diamond来说&#xff0c;查看RTL级的示图时&#xff0c;必须以LSE&#xff08;自带的综合工具&#xff09;来编译综合代码。 而经常会出现Synplify pro编译通过&#xff0c;LSE编译出现bug的情况&#xff0c;所以用LSE编译代码&#xff0c;总不让人放心。 默认使用Synpli…

Synaplify综合的常用命令(1)

在芯片设计中大都绕不开用Synaplify来对数字代码进行综合&#xff0c;特别是在大系统中&#xff0c;资源很多&#xff0c;这样会导致FPGA中的资源不够用&#xff0c;就需要我们在综合中加一些限定来解决一些问题&#xff0c;这篇文章先介绍一些自己遇到的和资源相关的问题以及相…

ISE工程导入Vivado

在介绍工程模式下的设计方式时&#xff0c;提到了Vivado一个选项Imported Project能够导入本由synplify、xst或者ISE设计套件所创建的RTL工程数据。参见&#xff1a;https://blog.csdn.net/qq_26652069/article/details/91562652 下面尝试将ISE中的一个实现UART回显的工程导入…

Synaplify综合报错Signal 011 error in m_xilinx

在用Synaplify2020的版本综合的时候会报出错误&#xff0c;E:Internal Error in m_xilinx Stack trace或者是Signal 011 error in m_xilinx Stack trace。乍一看像是环境问题&#xff0c;其实是你的代码里面用到的ram的问题&#xff0c;当然也可能是rom的问题&#xff0c;总之和…

Synaplify综合Removing

记录一下用Synaplify综合出现的Removing警告问题&#xff0c;在用Synaplify综合的时候&#xff0c;你可能综合完之后发现有的port不见了&#xff0c;或者instance不见了&#xff0c;这都是很常见的问题&#xff0c;这个时候你只要去搜索log关键词Removing&#xff0c;再和你要找…

Vivado与Synplify联合设计FPGA

这篇文章主要记录近几天在使用Vivado以及Synplify工具进行FPGA的Synthesis、Implementation、以及BitStream出现的相关问题。 一、工具使用 RTL代码编辑&#xff1a;修改Vivido内置编辑器为VSCode编辑器&#xff0c;个人习惯&#xff0c;偏好VSCode。修改内置编辑器&#xff…