`
Ydoing
  • 浏览: 106049 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

汇编语言学习系列 冒泡排序实现

 
阅读更多

假如汇编语言要实现如下C语言的功能,编译环境Ubuntu14.04(32位)。

复制代码
#include<stdio.h>

void swap(int *p, int *q)
{
    int tmp = *p;
    *p = *q;
    *q = tmp;
}

int main()
{
    int a[] = {3, 0, 5, 1, 4, 6, 2, 9, 8, 7};
    
    int i ,j;
    
    for(i = 0; i < 10; i++)
    {
        for(j = i + 1; j < 10;j++)
        {
            if(a[i] > a[j]){
                    swap(&a[i], &a[j]);
            }
        }
    }
    
    int k;
    for(k = 0; k < 10; k++)
    {
        printf("%d\n", a[k]);
    }
    
    return 0;
}
复制代码
  • 汇编代码sort.s
复制代码
.section .data
        array: .int 3, 0, 5, 1, 4, 6, 2, 9, 8, 7
        len: .int 10
        format: .asciz "%d\n"
.section .text
.global _start
_start:
        pushl %ebp
        movl %esp, %ebp
        subl $20, %esp    #allocate space
        
        movl $array, %eax
        movl %eax, (%esp)    #store &array on the stack
        
        movl len, %eax
        movl %eax, 4(%esp)    #store len on the stack
        
        call sort
        
        call parray
        
        movl $0, (%esp)    #deallocate space
        call exit
sort:                    #3, 0, 5, 1, 4, 6, 2, 9, 8, 7
        pushl %ebp
        movl %esp, %ebp
        pushl %ebx
        subl $20, %esp  #allocate space
        
        movl 8(%ebp), %edx    #get &array
        movl 12(%ebp), %ebx    #get len
        
        movl $0, %ecx    #init i=0
        cmp %ecx, %ebx
        jle .done

        leal 1(%ecx), %eax #init j=i+1

        cmp %eax, %ebx
        jle .L1    
.L2:
        movl (%edx, %ecx, 4), %esi    #get a[i]
        movl (%edx, %eax, 4), %edi    #get a[j]
        
        cmp %edi, %esi
        
        jl .C1
        
        leal (%edx, %ecx, 4), %esi
        movl %esi, (%esp)
        leal (%edx, %eax, 4), %esi
        movl %esi, 4(%esp)        
        
        call swap
        inc %eax
        cmp %eax, %ebx
        jle .L1        
        jmp .L2    
.C1:
        inc %eax
        cmp %eax, %ebx
        jle .L1
        
        jmp .L2
.L1: 
        inc %ecx
        cmp %ecx, %ebx
        jle .done
        
        leal 1(%ecx), %eax #init j=i+1
        cmp %eax, %ebx
        jle .L1
        jmp .L2
swap:
        pushl %ebp
        movl %esp, %ebp
        pushl %eax
        pushl %ebx
        pushl %ecx
        pushl %edx
        
        movl 8(%ebp), %edx    #get p
        movl 12(%ebp), %ecx    #get q
        
        movl (%edx), %ebx   
        movl (%ecx), %eax    
        
        movl %eax, (%edx)
        movl %ebx, (%ecx)
        
        popl %edx
        popl %ecx
        popl %ebx
        popl %eax
        
        popl %ebp
        ret    
.done:
        addl $20, %esp
        popl %ebx
        popl %ebp
        ret    

parray:  #打印数组
        pushl %ebp
        movl %esp, %ebp
        push %ebx        
        
        movl 8(%ebp), %edx    #get &array
        movl 12(%ebp), %ebx    #get len
        
        movl $0, %ecx
        cmp %ecx, %ebx
        jle .done2
.loop:
        movl (%edx, %ecx, 4), %eax
        
        call print
        
        inc %ecx
        cmp %ecx, %ebx
        jg .loop        
.done2:
        popl %ebx
        popl %ebp
        ret    
print:
        pushl %edx
        pushl %ecx
        
        pushl %eax
        pushl $format
        call printf
        
        addl $8, %esp
        popl %ecx
        popl %edx
        
        ret
复制代码
  • 编译

as sort.s -o sort.o

  • 链接

ld -lc -I /lib/ld-linux.so.2 sort.o -osort

  • 执行

./sort

版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

    win32汇编语言实现冒泡排序

    ### Win32汇编语言实现冒泡排序 #### 一、背景 随着现代软件开发的不断进步和发展,大型软件项目通常不再使用汇编语言作为主要编程语言,这主要是因为汇编语言编写耗时且不易维护。然而,在某些特定场景下,如硬件...

    汇编语言课程设计冒泡排序

    在汇编语言中实现冒泡排序,需要对汇编语言的基本语法、数据处理以及循环结构有深入的理解。 在汇编语言中,我们首先需要定义一个存储输入数字的数组。由于题目要求输入10个有符号十进制整数,我们可以分配一段内存...

    汇编语言实现的冒泡排序

    汇编语言编写的冒泡排序,代码简单明了,容易看懂

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

    汇编语言编写的冒泡排序程序代码,从小到大排序,并以十进制字符串的形式输出排序结果。

    汇编语言实现冒泡排序

    用汇编语言编写的冒泡排序,从键盘上输入若干数字,进行冒泡排序后将结果显示在屏幕上

    MIPS-汇编语言-冒泡排序-含伪代码以及完整注释

    MIPS-汇编语言-冒泡排序-含伪代码以及完整注释,可以直接使用

    汇编语言实现冒泡法排序

    综上所述,通过汇编语言实现冒泡法排序是一个很好的学习汇编基础知识和算法实现的过程。从标签中我们可以看出,这个主题涵盖了汇编语言的基础知识,排序算法的原理,以及详细的解释,非常适合想要在IT领域深化学习的...

    汇编冒泡排序实验报告.docx

    本实验的主要目的是掌握汇编语言的基本编程技术,包括子程序编程、函数嵌套、循环嵌套、串处理等,并通过冒泡排序算法的实现来加深对汇编语言的理解。 二、实验内容 本实验的主要内容包括: 1. 程序设计 程序由 1...

    汇编语言,冒泡排序程序设计

    总之,这份课程设计报告不仅提供了汇编语言下冒泡排序程序的具体实现方案,更重要的是,它引导学生通过实践学习,掌握了汇编语言编程的基础,理解了算法设计的核心思想,为今后更深层次的计算机科学学习打下了坚实的...

    汇编语言实现冒泡排序,完美运行

    x8086汇编语言实现冒泡排序,实现原理BCD码加ASCII码,输入个数任意,最大支持四位数

    汇编语言课程设计冒泡法排序

    通过对程序代码的详细解析,我们可以更深入地理解冒泡排序的工作机制以及如何在汇编语言环境中实现这样的排序算法。对于学习计算机科学的学生或者从事相关领域的开发者而言,这不仅是一次编程实践的体验,也是对...

    arm汇编冒泡排序实现

    **冒泡排序是一种基础但实用的排序算法,其基本思想是通过不断交换相邻的逆序元素,逐步将待排序序列...通过对这段代码的分析,你将进一步理解ARM汇编语言如何实现冒泡排序的逻辑,并可能学习到一些特定的优化技巧。

    汇编语言程序代码冒泡排序

    汇编语言程序代码20个带符号数最大,最小,平均值问题

    汇编语言冒泡排序

    汇编语言冒泡排序汇编语言冒泡排序汇编语言冒泡排序

    汇编语言 冒泡法排序

    标题与描述概述的知识点是关于使用汇编语言实现冒泡排序算法的过程。在这个特定的上下文中,代码示例展示了如何在汇编语言中编写程序来输入一个数字序列,使用冒泡排序对其进行排序,并输出排序后的结果。下面将深入...

    采用汇编语言冒泡法排序

    采用汇编语言冒泡法排序 本资源主要介绍了使用汇编语言实现冒泡法排序的过程,同时也包括8255的初始化程序和8259A的初始化编程。 Knowledge Point 1:汇编语言冒泡法排序 冒泡法排序是一种简单的排序算法,通过...

    汇编语言中冒泡排序算法的实现与解析

    内容概要:本文详细介绍了如何使用 x86 汇编语言实现冒泡排序算法。首先阐述了冒泡排序的基本原理和步骤,然后通过具体的代码示例展示了汇编语言的编写过程,最后提供了环境准备、编译运行的方法以及验证结果的建议...

    arm 汇编冒泡排序

    本篇汇编代码实现了ARM架构下的冒泡排序算法,通过巧妙利用ARM汇编语言中的各种指令来完成排序任务。这种排序方式虽然简单,但对于理解低级别编程和处理器架构具有重要意义。此外,通过实践这类代码,可以加深对ARM...

    在keil中汇编语言实现冒泡排序

    在keil中汇编语言实现冒泡排序,实现一个数的冒泡排序方法,这个是汇编源代码,大家可以借鉴一下

    汇编语言冒泡法排序

    ### 汇编语言冒泡法排序 #### 知识点概述 本篇文章将详细介绍如何在汇编语言中实现冒泡排序算法,并通过一个具体的示例程序来展示其工作原理。该程序包含了丰富的注释,有助于读者更好地理解和学习汇编语言中的...

Global site tag (gtag.js) - Google Analytics