来自于《Intel汇编语言程序设计》(第四版)第九章。
以下为冒泡排序的原文代码:
;---------------------------------------------------------
BubbleSort PROC USES eax ecx esi,
pArray:PTR DWORD, ; pointer to array
Count:DWORD ; array size
;
; Sort an array of 32-bit signed integers in ascending
; order , using the bubble sort algorithm
; Receives : pointer to array,array size
; Returns: nothing
;---------------------------------------------------------
mov ecx,count
dec ecx ; decrement count by 1
L1: push ecx ; save outer loop count
mov esi,pArray ; point to first value
L2: mov eax,[esi] ; get array value
cmp [esi+4],eax ; compare a pair of values
jge L3 ; if [esi] <= [edi] , don't exch
xchg eax,[esi+4] ; exchange the pair
mov [esi],eax
L3: add esi,4 ; move both pointers forward
loop L2 ; inner loop
pop ecx ; retrieve outer loop count
loop L1 ; else repeat outer loop
L4: ret
BubbleSort ENDP
我们知道冒泡排序是一种每次循环都会把此次循环中最大的一个数放到最后的排序算法。最少要执行n-1次外部循环,时间复杂度为O(N*N)。也即排序时间与数组的个数是平方的关系。当少量数组时,可以使用冒泡。而当数组数量十万以上时,排序时间将变得过于漫长。
我们来看一下冒泡的汇编代码:
其实这里使用到了汇编语言对于二维数组的处理,由此涉及到了另外两个概念:
基址变址操作数和相对基址变址操作数。
基址变址操作数将两个寄存器的值相加(称为基址和变址)来产生偏移地址,操作数中可使用任意两个32位通用寄存器。
基址变址操作数很像我们用一维数组来模拟二维数组时的行列索引,这样说的话,应该就很好理解了。例如:
[ row*row_num + col ]
代表第row行第col列的元素。
相对基址变址操作数 在以上的基础上,多了一个偏移地址(displacement),最常见的两种形式为:
[ base + index + displacement ]
displacement [ base + index]
其中的displacement(偏移)可以是变量的名字或者常量表达式。例如:
tableB[ebx+esi]
让我们来看一下冒泡排序的汇编代码:
mov ecx,count ; 将要比较的个数传入ecx
dec ecx ; 减1
L1: push ecx ; 将ecx压入堆栈保存为外部循环计数器
mov esi,pArray ; 将数组首地址传入ESI
L2: mov eax,[esi] ; 得到ESI此时的值,保存到EAX中
cmp [esi+4],eax ; 将EAX此时保存的值与其后面的一个元素比较
jge L3 ; 如果EAX中的值小于下一个元素值,则不需要交换位置,进入L3
xchg eax,[esi+4] ; 否则交换两元素的位置
mov [esi],eax
L3: add esi,4 ; 将内循环的指针移向下一个元素
loop L2 ; 继续执行这次比较(即内循环)
pop ecx ; 一次内循环比较完毕,重新得到ecx的值
loop L1 ; 执行下一次外循环
L4: ret
代码结束。
分享到:
相关推荐
基于这样的背景,本文将介绍如何使用Win32汇编语言实现冒泡排序算法。虽然汇编语言的学习曲线较为陡峭,但通过实践可以加深对计算机底层工作原理的理解,并有助于提高程序的执行效率。 #### 二、使用开发环境 - **...
汇编语言编写的冒泡排序程序代码,从小到大排序,并以十进制字符串的形式输出排序结果。
通过分析这段汇编语言代码,我们深入了解了如何在低级编程环境中实现冒泡排序算法。虽然汇编语言相比高级语言更加繁琐和细节密集,但这种实践加深了对计算机底层操作的理解,包括内存管理、输入/输出操作和算法实现...
内容概要:本文详细介绍了如何使用 x86 汇编语言实现冒泡排序算法。首先阐述了冒泡排序的基本原理和步骤,然后通过具体的代码示例展示了汇编语言的编写过程,最后提供了环境准备、编译运行的方法以及验证结果的建议...
本实验的主要目的是掌握汇编语言的基本编程技术,包括子程序编程、函数嵌套、循环嵌套、串处理等,并通过冒泡排序算法的实现来加深对汇编语言的理解。 二、实验内容 本实验的主要内容包括: 1. 程序设计 程序由 1...
采用汇编语言冒泡法排序 本资源主要介绍了使用汇编语言实现冒泡法排序的过程,同时也包括8255的初始化程序和8259A的初始化编程。 Knowledge Point 1:汇编语言冒泡法排序 冒泡法排序是一种简单的排序算法,通过...
### 汇编语言实现冒泡排序算法 #### 概述 本文主要介绍了一种使用x86架构下的汇编语言实现冒泡排序算法的方法。冒泡排序是一种简单直观的排序算法,它通过重复地遍历待排序的列表,比较每一对相邻元素,如果顺序...
本节将详细分析给定的汇编语言代码段,该代码实现了冒泡排序算法,并在排序完成后将结果输出到标准输出。 ##### 数据定义 ```assembly section.data array db 5,1,4,2,8,3,7,6 ; 待排序的数组 array_size equ ($ - ...
5. 冒泡排序算法:理解冒泡排序的工作原理,并能用汇编语言实现。 6. 数组操作:如何在汇编语言中比较和交换数组中的元素。 7. 条件判断:通过比较指令和条件跳转指令实现元素交换的条件判断。 8. 注释和程序结构:...
本课程设计报告聚焦于汇编语言下的冒泡排序算法实现,旨在通过实际编程实践,加深对数据结构和算法的理解,同时熟练掌握汇编语言的语法和特性。 #### 二、冒泡排序算法原理与应用 冒泡排序是一种简单的排序算法,...
本文将深入解析一篇关于ARM汇编程序设计中实现冒泡排序的文章,旨在帮助读者理解和掌握ARM汇编语言在数据处理和算法实现方面的技巧。 #### 冒泡排序简介 冒泡排序是一种简单的排序算法,其基本思想是重复地走访要...
### 汇编语言冒泡法排序 #### 知识点概述 本篇文章将详细介绍如何在汇编语言中实现冒泡排序算法,并通过一个具体的示例程序来展示其工作原理。该程序包含了丰富的注释,有助于读者更好地理解和学习汇编语言中的...
本篇汇编代码实现了ARM架构下的冒泡排序算法,通过巧妙利用ARM汇编语言中的各种指令来完成排序任务。这种排序方式虽然简单,但对于理解低级别编程和处理器架构具有重要意义。此外,通过实践这类代码,可以加深对ARM...
通过实践编写这样的代码,可以加深对冒泡排序算法的理解,并且对汇编语言的基本操作有更深入的认识。 综上所述,通过汇编语言实现冒泡法排序是一个很好的学习汇编基础知识和算法实现的过程。从标签中我们可以看出,...
本例展示了一个典型的Windows 32位汇编语言程序,用于实现冒泡排序算法。通过对程序代码的详细解析,我们可以更深入地理解冒泡排序的工作机制以及如何在汇编语言环境中实现这样的排序算法。对于学习计算机科学的学生...
1. **用汇编实现冒泡排序算法**:这是本次实验的核心内容,要求学生使用汇编语言实现冒泡排序算法。 2. **在实验三的代码基础上,利用冒泡排序将 DEST 中数据从小到大重新排序**:在已有代码的基础上进行扩展,完成...
- 使用冒泡排序算法对`num`数组进行升序排序。 - **输出最大值(initmax:)** - 输出字符串`char1`,提示用户最大值的信息。 - 将最大值转换为BCD码形式,并逐位输出。 - **输出最小值(initmin:)** - 输出字符串`...
汇编语言实现冒泡排序 ...本文详细讲解了汇编语言实现冒泡排序的知识点,包括冒泡排序算法、CS单片机、汇编语言、寄存器的使用、冒泡排序的实现、子程序的使用、字符串的输出、循环的使用和堆栈的使用等。
由于汇编语言的低级特性,编写冒泡排序的汇编程序需要对内存管理、指令集以及流程控制有深刻的理解。 首先,我们要了解冒泡排序的基本步骤: 1. **初始化**:设置循环次数,通常为序列长度减一,因为每次循环可以将...
标题与描述解析:《汇编排序(冒泡法)》一文主要介绍了一种使用汇编语言实现的排序算法——冒泡排序。冒泡排序是一种简单的排序算法,通过重复地遍历要排序的数列,比较每对相邻的元素,如果它们的顺序错误就把它们...