win32汇编语言实现冒泡排序

2023-11-16

1、背景

现在大多数的大规模程序并不是由汇编语言来编写,原因很简单,因为太耗时了,但是汇编语言仍然被广泛运用在配置硬件设备以及优化程序的执行速度和尺寸大小等方面,特别是在逆向工程方面,更需要深入理解与熟练掌握汇编语言。
针对现阶段,看汇编基本能看的明白,但是写起来需要查资料看语法的阶段,亟需多多练习汇编语言程序设计,夯实基础。结合早期学习C语言的经历,独立写一个冒泡排序的程序,从而促进汇编的掌握。

2、使用开发环境

代码编辑器:EmEditor
编译器:masm 6.0
调试工具:IDA 6.6

3、编写思路与实现

因为编写的是排序功能过程,在windows下输入输出的编写不能够像C语言学习时使用printf函数打印结果那样直接,且为了结果输出能够更直观,所以选择windows32位编汇语言窗口程序的框架,在窗口消息处理函数中的PAINT消息中加入排序的功能函数,将传入的数组进行重新排序,后输出到windows窗口中。
本程序只是为了汇编程序的练习,至于算法中的优劣,以及汇编语言的效率并未考虑进去,有很大的可能是效率不如C语言编写后的release版本,因为现阶段编译器的对高级语言的优化已经比较完善。再一点常见的情况是汇编代码都认识,但是组合到一起变得很难理解,除了是因为算法复杂的原因,也有一部分原因便是编译器的优化,把代码变得生涩。

3.1 C语言冒泡排序算法

void    SortNum(int array[]; int length )
{
    int i = 0;
    int j = 0;
    int tmp = 0;

    for (i = 0; i < length; i++ ){
        for (j = length - 1; j >= i + 1; j--){
            if (array[j] < array[j - 1]){
                tmp = array[j - 1];
                array[j - 1] = array[j];
                array[j] = tmp;
            }
        }
    }

    return;
}

算法比较简单,排序使用了for语句的双层循环,外层循环控制次数,共循环length次,内层循环将一个最小的值像气泡一样,一步步的排到最前面,外层循环第一次运行,则排出一个最小的,第二次,排出剩下的数中最小的,依次类推,则把剩下的数字从小到大排好。实际上外层循环用不上length次,只需要length-1次就可以了,但是这次代码只是做演示作用,不做深入考究。

3.2 汇编语言for语句框架

汇编语言从正常的学习来说,并没有for语句框架这一概念,尽管MASM汇编中包含.WHILE、.REPEAT .WHILE等循环的伪指令,但是为了理解for语句在汇编中的运行机制,将其结构框架列出对于汇编的循环理解是很有必要的。
for循环比while语句、 do while语句都要复杂,将其在C语言中的结构拆分,可以得到以下4步(对应C语言中的Debug版本):

①赋初值
②设置循环条件
③设置循环步长
④循环体代码

3.2 冒泡排序的汇编语言实现

数组的定义

        .data
array           DWORD   12, 8, -5, 7, 100                           ;数组定义
arraryLength    DWORD   ($ - offset array) / sizeof(DWORD)         ;数组长度

冒泡排序过程

_SortNum proc uses eax edx esi edi, pArray: PTR DWORD, dwArrayNum:DWORD
    LOCAL   @tmpNum:DWORD                       ; int tmp = 0
    LOCAL   @indexStep:DWORD                    ; int i = 0
    LOCAL   @indexNum:DWORD                     ; int j = 0
                                                ;外层循环进行第①步赋初值
        mov @indexStep, 0                       ;i = 0
        jmp STEPCMPOUT

    LOOPSTEPOUT:
                                                ;外层循环进行第③步设置循环步长
        add @indexStep, 1                       ;i++

    STEPCMPOUT:                                 ;外层循环进行第②步设置循环条件
        mov eax, dwArrayNum                     ;i < length
        cmp @indexStep, eax 
        jg  RETURN                              ;如果外层循环结束,直接跳转到结束

        mov eax, dwArrayNum                     ;设置内层循环第①步赋初值,也是
                                                ;外层循环的第④步循环体代码
        dec eax                                 ; length - 1
        mov @indexNum, eax
        jmp STEPCMPIN

    LOOPSTEPIN:                                 ;内层循环进行第③步设置循环步长
        dec @indexNum                           ;j--

    STEPCMPIN:                                  ;内层循环进行第②步设置循环条件
        mov eax, @indexStep                     ;j >= i + 1
        inc eax
        mov edx, @indexNum
        cmp edx, eax
        jl  LOOPSTEPOUT                         ;如果内层循环完毕,则跳转到外层循环
                                                ; ③步设置循环步长
                                                ;内层循环第④步循环体代码
        mov esi, pArray                         ;取出array[j]与array[j - 1]
        mov edi, pArray
        mov eax, @indexNum
        mov edx, sizeof(DWORD)
        mul edx
        add esi, eax
        sub eax, sizeof(DWORD)
        add edi, eax

        mov eax, [esi]                          ; if (array[j] < array[j - 1])
        cmp eax, [edi]
        jge LOOPSTEPIN                          ;如果array[j] < array[j - 1]
                                                ;不成立则跳转到设置循环步长操作
                                                ;如果如何上述的表达式,进行交换操作
        mov eax, [edi]                          ; tmp = array[j - 1]
        mov @tmpNum, eax
        mov eax, [esi]                          ; array[j - 1] = array[j]
        mov [edi], eax
        mov eax, @tmpNum                        ; array[j] = tmp
        mov [esi], eax

        jmp LOOPSTEPIN                          ;内层循环循环体执行完毕进行跳转

        jmp LOOPSTEPOUT                         ;外层循环循环体执行完毕进行跳转

    RETURN: 

    ret
_SortNum endp

4、结束语

以上内容为冒泡排序的过程,可能值得完善的地方还有很多,起码对于array[j]与array[j - 1]值就未必是通用做法,但是参照此框架对于多层循环的for语句汇编实现,逆向多层for循环的代码,还是有一定的实际意义。

最后完整的源码文件:
http://download.csdn.net/detail/wdzzf123/9708520

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

win32汇编语言实现冒泡排序 的相关文章

  • ARM汇编语言 - 简介 [一]

    origin https zhuanlan zhihu com p 82490125 ARM汇编语言 简介 一 兰新宇 talk is cheap 说明 xff1a 本系列文章将主要以ARMv7和ARMv8架构为例 xff0c 介绍ARM汇
  • ARM汇编语言 - 简介 [二]

    上文介绍了ARM的数据传送指令 xff0c 本文将主要介绍ARM中的移位 序转和位操作等数据处理指令 移位指令 移位包括逻辑移位和算术移位 xff0c 所谓 逻辑 就是将寄存器中存放的内容仅仅视为一串bits xff0c 移位的时候只需要将
  • U-boot引导流程分析一

    U Boot 全称 Universal Boot Loader 即通用引导程序 是遵循GPL条款的开放源码项目 它的源码目录 编译形式与Linux内核很相似 事实上 不少U Boot源码就是相应的Linux内核源程序的简化 尤其是一些设备的
  • 你知道 1 + 1 等于几吗?

    阅读本文需要 4 分钟 前言 当有人问你1 1等于几的时候 你会觉着这是对你的一种侮辱 这种弱智问题 居然拿来问我 听起来好像你说的没错 1 1是挺简单的 可是如果让你证明的话 可能你这一辈子都证明不出来 稍微知道一点的人 可能会联想到我国
  • CPU的标志寄存器

    1 ZF 零标志位 执行指令后结果为0 ZF 1 否则ZF 0 2 PF 奇偶标识位 它记录相关指令执行后 其结果的所有二进制位中1的个数是否为偶数 如果是偶数 PF 1 否则PF 1 3 SF 符号标识位 它记录相关指令执行后 其结果是否
  • 多种方法实现数组元素从大到小排序;冒泡排序

    实现数组由大到小排列 实现一 数组 最小数冒泡到最右边 int sort int a int n int i j temp for i 0 i
  • 用汇编语言实现从键盘输入一个字符,输出其对应的ASCII码

    Hello 大家好呀 这是本人的第一篇博客 这学期正好在学汇编语言 上周老师布置了一个作业 用汇编语言实现从键盘输入一个字符 输出其对应的ASCII码 说实话 这个问题最开始的时候令我不知从何下手 明明用c语言只需要几行代码 用汇编来实现却
  • MIPS汇编语言实现选择排序算法

    MIPS汇编语言实现选择排序算法 1 流程图 2 C代码 3 MIPS代码 附注释 MIPS汇编语言实现选择排序算法 1 流程图 2 C代码 include
  • 【汇编语言05】第4章 第一个程序

    目录 0 前言 1 源程序从编写到执行 1 1 第1步 编写汇编源程序 1 2 第2步 对源程序进行编译连接 1 3 第3步 执行可执行文件中的程序 2 简单源程序示例及其组成 2 1 简单源程序示例 2 2 伪指令 2 3 源程序与程序
  • IDA反汇编之栈帧例释

    目录 1 例释环境和预备知识 1 1 运行环境 1 2 IDA版本 1 3 预备知识 2 函数调用约定 3 函数局部变量布局 4 函数栈帧示例 5 IDA栈视图 1 例释环境和预备知识 1 1 运行环境 本示例运行环境为Windows 10
  • 王爽老师汇编13.3对int iret和栈的深入理解 在屏幕中间显示80个叹号字符

    6666 问题 用7ch中断例程完成loop指令的功能 个人自学思考编写的 不知道和书中的要表达的意思是否相同 先编译运行第一个代码 再编译运行第二个显示代码 下面为写入内存0 200出的中断代码 iret指令为跳转指令 跳转到显示代码处
  • [bx]和loop指令

    1 bx 的含义 bx 表示一个内存单元 它的偏移地址在bx中 比如 mov ax bx 会将一个内存单元的内容送入ax 这个内存单元的长度是2个字节 存放一个字 偏移地址存放在bx中 段地址在ds中 mov al bx 则是移动半个字 2
  • Ubuntu/Linux下安装DosBox配置汇编环境

    Ubuntu Linux下安装DosBox配置汇编环境 微信关注公众号 夜寒信息 致力于为每一位用户免费提供更优质技术帮助与资源供给 感谢支持 一 首先我们去DosBox官网下载DosBox 0 73 或者直接启用终端命令行输入以下代码 s
  • 汇编语言 第3版 王爽 检测点答案及详细解析

    第一章 基础知识 检测点1 1 1 1个CPU的寻址能力为8KB 那么它的地址总线的宽度为 13位 2 1KB的存储器有 1024 个存储单元 存储单元的编号从 0 到 1023 3 1KB的存储器可以存储 8192 2 13 个bit 1
  • 计算机组成原理——单周期CPU

    单周期CPU 项目代码 实验原理 MIPS指令 rom coe文件 代码 顶层模块SingleCycleCPU display外围模块 PC instructionMemory Alu模块 DataMemory ControlUnit 旧的
  • 冒泡排序和鸡尾酒排序

    传统冒泡排序 import java util Arrays author 新新 ClassName BubbleSort Description 冒泡排序 date 2022年03月17日 public class BubbleSort1
  • win32汇编语言实现冒泡排序

    1 背景 现在大多数的大规模程序并不是由汇编语言来编写 原因很简单 因为太耗时了 但是汇编语言仍然被广泛运用在配置硬件设备以及优化程序的执行速度和尺寸大小等方面 特别是在逆向工程方面 更需要深入理解与熟练掌握汇编语言 针对现阶段 看汇编基本
  • 【汇编程序】试编写一程序,要求比较两个字符串STRING1和STRING2所含字符是否相同,若相同则显示“MATCH”,若不相同则显示“NO MATCH”

    STACKS SEGMENT STACK DW 100H DUP TOP LABEL WORD STACKS ENDS DATAS SEGMENT STRING1 DB abcd123 STRING2 DB abcd133 定义两个不同的字
  • 汇编:表格显示(含多个子程序)

    代码如下 assume cs code data segment db 1975 1976 1977 1978 1979 1980 1981 1982 1983 db 1984 1985 1986 1987 1988 1989 1990 1
  • DOSBOX 快捷键及 MS-DOS 命令

    1 全屏 退出全屏 alt enter 2 释放鼠标 ctrl F10 3 exit 退出DOSBOX 4 dir 显示目录内容 可选参数 w 只显示文件名 P 显示部分内容 exe 筛选出可执行文件 5 cd 进入目录 cd 退回上一级目

随机推荐

  • 一文了解什么是web3

    一 web1 0和web2 0 Web 1 0和Web 2 0指的是万维网历史上的时代 因为它通过各种技术和格式发展 Web 1 0 大致指的是从 1991 年到 2004 年期间 大部分网站由静态页面组成 绝大多数用户是内容的消费者 而不
  • win10 64位下载64位python

    下载步骤 1 打开Python官网 https www python org 如果是32位的可以直接点击download下载 否则点击downloads 点击windows 2 选择安装版本 eg 选择安装版 然后一直默认下一步 安装 期间
  • K8s存储管理——volume、pv、pvc

    目录 介绍 前言 emptyDir存储卷 hostPath存储卷 本地 NFS共享存储卷 PV PVC NFS使用pv pvc 介绍 来自官方文档 存储的管理是一个与计算实例的管理完全不同的问题 PersistentVolume 子系统为用
  • java基础——内存和变量

    目录 前言 一 java的内存 1 栈内存 2 堆内存 3 方法区内存 二 成员变量与局部变量 1 成员变量 2 局部变量 3 成语变量和局部变量的区别 前言 介绍Java的三种内存分配 栈 堆 方法区 成员变量和局部变量 一 java的内
  • 渗透漏洞 Bugku CTF-Web5

    Bugku CTF Web5 一 开启环境 点击链接 二 查看源代码 发现PHP弱类型 三 构造出 payload 提交获得 flag 一 开启环境 点击链接 二 查看源代码 发现PHP弱类型 1 PHP 比较 2 个值是否相等可以用 或
  • 神策学堂“训练营+特训营”,种子学员招募中,来一起出圈呀!

    2020 年难吗 难 失业 瓶颈 焦虑包围着互联网人 面对这个现状 神策学堂准备了一系列精品课程 芒种训练营 高级特训营 让大家逆流 出圈 神策数据分析芒种训练营 突破瓶颈 晋升高阶岗位 3 场直播 6 实战案例 教你用数据高效赋能业务 1
  • oracle数据库找不到主库,Oracle DG 主库丢失归档

    DG 主库丢失归档 主要原因就是备库没有APP呢 主库就误把归档删除了 常见的这种情况都是主库RMAN做备份的时候把归档删除了 丢失归档解决方法 用RMAN 增量备份恢复 还有恢复控制文件 备库 SQL gt select sequence
  • Centos7.4制作简易RPM包

    准备nginx 1 10 1 tar gz 准备php 7 1 7 tar bz2 这两个源码编译tar包 1 准备制作环境 yum y install rpm build 安装rpm build软件 rpmbuild ba xx spec
  • SpringSecurity最全实战讲解

    文章目录 Spring Security 专题 一 基本概念 认证 授权 会话 RBAC模型 二 一个自己实现的权限模型 BasicAuth 三 SpringBoot Security 快速上手 1 项目搭建步骤 2 用SpringBoot
  • AIF360入门教学

    1 AIF360简介 AI Fairness 360 工具包 AIF360 是一个开源软件工具包 可以帮助检测和缓解整个AI应用程序生命周期中机器学习模型中的偏见 在整个机器学习的过程中 偏见可能存在于初始训练数据 创建分类器的算法或分类器
  • MessageDigest(加密)

    MessageDigest类 MessageDigest 类是一个引擎类 它是为了提供诸如 SHA1 或 MD5 等密码上安全的报文摘要功能而设计的 密码上安全的报文摘要可接受任意大小的输入 一个字节数组 并产生固定大小的输出 该输出称为一
  • 使用 Cloudflare Zero Trust 通过 SSH 连接到 GitHub Actions 的 Runner 机器以进行调试

    GitHub Actions 的 Runner Images 包含了很多常用的开发环境 使用它来构建一些软件是很方便的 不过 构建过程难免会遇到问题 而在 GitHub Actions 上进行构建和在本地有很多不同之处 首先 Runner
  • 服务器装系统都会有哪些坑,小白装机避坑——电脑装系统篇 二

    装机系统分区 首先你需要安装好你的固态硬盘 开机 进入系统 一般用的分区工具都是 DiskGenius 这个软件 粗暴的组装 不需要机箱 一台电脑里面只能设置一个盘作为系统盘 也就是我们的主分区 切记 先对硬件进行测试组装 看看能不能正常启
  • 1125 斐波那契数列

    题目描述 输入整数n 输出斐波那契数列的前n项 输入要求 输入一个整数n 1 lt n lt 12 输出要求 输出斐波那契数列的前n项 每个数后面都有空格 输入样例 6 输出样例 1 1 2 3 5 8 提示 斐波那契数列的排列规则为 第1
  • echarts legend文字颜色

    legend textStyle color fft
  • 一个有意思的let面试题

    今天看到一个面试题 let des 我在外边 let obj des 我在里面 foo function console log this des let bar obj foo bar 这个bar 调用后会打印出什么 本以为是考 this
  • 查看微信小程序的appID和secret

    https mp weixin qq com wxopen devprofile action get profile token 1504304474 lang zh CN 转载于 https www cnblogs com fuckin
  • springmvc源码学习(三十)@ControllerAdvice 全局异常处理

    目录 前言 一 示例 二 原理 前言 在请求到达了 DispatcherServlet 的处理流程 进入 doDispatch 以及后续流程处理业务的过程中出现异常 会进入到 processDispatchResult 处理异常 此时 如果
  • C++-- 如何在类外访问一个类中私有的成员变量?

    如何在类外访问一个类中私有的成员变量 我在网上搜答案的时候看到大部分回答都是在类内部创建一个接口 所以此方法我就不再多做赘述 今天我说的是利用指针 边看代码边理解 上代码 class Test private int a 10 int b
  • win32汇编语言实现冒泡排序

    1 背景 现在大多数的大规模程序并不是由汇编语言来编写 原因很简单 因为太耗时了 但是汇编语言仍然被广泛运用在配置硬件设备以及优化程序的执行速度和尺寸大小等方面 特别是在逆向工程方面 更需要深入理解与熟练掌握汇编语言 针对现阶段 看汇编基本