`
qdujunjie
  • 浏览: 108728 次
  • 性别: Icon_minigender_1
  • 来自: Mars
社区版块
存档分类
最新评论

汇编语言冒泡排序算法代码分析(12)

阅读更多

 

 

来自于《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汇编语言实现冒泡排序

    win32汇编语言实现冒泡排序,全部的代码插入在文档的最下面。

    汇编语言实现冒泡排序算法(源码)

    随后,通过具体的代码示例,展示了冒泡排序算法在汇编语言中的实现细节。代码中包含了详细的注释,解释了每一步的操作和逻辑,使得读者能够清晰地理解算法的执行过程。 在算法实现中,使用了外层循环和内层循环的...

    汇编语言实现冒泡排序算法

    下面是用汇编语言编写的一个冒泡排序算法的示例。 这段代码实现了一个冒泡排序算法,用于对一个数组进行排序。排序完成后,会将排序后的数组输出到标准输出,并在数组末尾添加一个换行符。

    关于冒泡法排序 汇编程序

    很好冒泡排序,包括输入和输出,代码很简单

    汇编 冒泡代码

    微机原理 汇编语言 冒泡算法 初学者可以借鉴

    汇编语言实验报告5.doc

    实验报告:利用冒泡法排序算法,将内存单元存储的数35H,78H,25H,13H,8H,D2H由小到大进行排序

    MIPS汇编实验:整数排序

    用户输入要排序的字符串,各个数字之间用空格隔开,以换行结束,把空格过滤出,把其中数字转化为整数型存入内存中,输出输入的数字个...已通过Mars测试,内含思路流程图,冒泡排序部分的c代码,完整MIPS代码和测试结果

    微嵌实验1-实验报告.doc

    实现冒泡排序算法(汇编编程,选做) 微处理器系统结构与嵌入式系统设计实验报告 三、实验步骤 1.学习使用keil开发工具 1. 点击"Keil uVision5"打开软件主窗口。 2. 点击Project-&gt;New uVision Project建立新工程。 ...

    北语15春《计算机科学导论》作业3.doc

    程序设计语言中的汇编语言是一种高级语言。 A. 错误 B. 正确 -----------------选择: 5. 程序源代码经过编译得到的目标程序不可以脱离其语言环境独立执行。 A. 错误 B. 正确 -----------------选择: 6. 死锁是指...

    C语言讲义.doc

    1.13 汇编语言 18 1.13.1 I386汇编简介 18 1.13.2 VS反汇编 19 1.14 IDE工具 19 1.14.1 QT常用快捷键 19 1.14.2 VS常用快捷键 19 1.14.3 VS断点,调试 19 2 C语言中的数据类型 19 2.1 常量 19 2.1.1 #define 19 ...

    C++大学教程,一本适合初学者的入门教材(part2)

    6 机器语言、汇编语言和高级语言 1.7 C语言与C++的历史 1.8 C++标准库 1.9 Java、Internet与万维网 1.10 其他高级语言 1.11 结构化编程 1.12 典型C++环境基础 1.13 C++与本书的一般说明 1.14 C++编程简介 ...

    C++大学教程,一本适合初学者的入门教材(part1)

    6 机器语言、汇编语言和高级语言 1.7 C语言与C++的历史 1.8 C++标准库 1.9 Java、Internet与万维网 1.10 其他高级语言 1.11 结构化编程 1.12 典型C++环境基础 1.13 C++与本书的一般说明 1.14 C++编程简介 ...

    delphi 开发经验技巧宝典源码

    0085 利用冒泡法对数字进行排序 58 0086 用回溯法找出n个自然数中取r个数的所有组合 58 0087 0~N位数的任意组合 59 0088 在数组中快速查找近似值 60 0089 实现直接插入法排序 61 第4章 函数应用 63 4.1...

    delphi 开发经验技巧宝典源码06

    0085 利用冒泡法对数字进行排序 58 0086 用回溯法找出n个自然数中取r个数的所有组合 58 0087 0~N位数的任意组合 59 0088 在数组中快速查找近似值 60 0089 实现直接插入法排序 61 第4章 函数应用 63 4.1...

    C++大学教程

    1.6 机器语言、汇编语言和高级语言--------------------------------------5 1.7 C语言与C++的历史--------------------------------------------------6 1.8 C++标准库--------------------------------------...

Global site tag (gtag.js) - Google Analytics