汇编排序算法代码总结
1 冒泡排序
http://blog.csdn.net/a123443/article/details/6779137
;冒泡排序
;author JRH
;2011.7.10
assume ds:data
data segmenta dw 1,4,2,5,7,9,6,3
data ends
code segment
start:mov ax,datamov ds,axmov cx,8 dec cxlop1:push cxmov dx,0mov si,0lop2: mov bp,a[si]cmp bp,a[si+2]jnb go_onxchg bp,a[si+2]mov a[si],bpmov dx,1 ;标志位go_on:add si,2loop lop2pop cxcmp dx,0 jz overloop lop1over:mov ax,4c00hint 21h
code ends
end start
以下代码来自RadASM自带库;
2 递归排序
assort.asm
.486 ; force 32 bit code.model flat, stdcall ; memory model & calling conventionoption casemap :none ; case sensitiveasqsort PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORDacisort PROTO :DWORD,:DWORD.codeassort proc arr:DWORD,cnt:DWORD,rdi:DWORD.if rdi == 0mov rdi, 100 ; set default maximum recursion depth.endifmov eax, cntsub eax, 1invoke asqsort,arr,0,eax,0,rdixor eax, eax ; exit with EAX = 0 is quick sortedtest edx, edx ; if EDX = 0 quick sort failed byjnz @F ; exceeding maximum recursion depthinvoke acisort,arr,cntmov eax, 1 ; exit with EAX = 1 is CISORTed@@:retassort endpend
rdi为最大递归深度
本过程调用了asqsort和acisort
3 快速排序
asqsort.asm
.486 ; force 32 bit code.model flat, stdcall ; memory model & calling conventionoption casemap :none ; case sensitive.codeasqsort proc arr:DWORD,i:DWORD,j:DWORD,rec:DWORD,ind:DWORDtest edx, edxjz quitmov eax, icmp eax, jjge quitadd rec, 1 ; increment recursion depth indicatormov eax, reccmp eax, indjl @Fxor edx, edx ; set bailout indicatorjmp quit@@:mov [esp-8], ebxmov [esp-12], esimov [esp-16], edimov edi, arrmov esi, imov ebx, jmov [esp-20], ebp ; save EBPmov edx, [edi+ebx*4] ; pivot is from higher index valuesub ebx, 1cmp esi, ebxjg lbl5lbl0:sub esi, 1align 4lbl1:add esi, 1 ; increment lower index; ***************************mov ecx, [edi+esi*4] ; load lower index stringmov ebp, -1sts0:add ebp, 1mov al, [ecx+ebp] ; compare lower and pivot stringscmp al, [edx+ebp]jg nxt0jl lbl1test al, aljnz sts0nxt0:; ***************************align 4lbl2:; ***************************mov ecx, [edi+ebx*4] ; load upper index stringmov ebp, -1sts1:add ebp, 1mov al, [ecx+ebp] ; compare upper and pivot stringscmp al, [edx+ebp]jg nxt1jl lbl3test al, aljnz sts1nxt1:; ***************************sub ebx, 1 ; decrement upper indexcmp ebx, esijge lbl2lbl3:cmp esi, ebxjg lbl5mov eax, [edi+esi*4] ; swap pointersmov ecx, [edi+ebx*4]mov [edi+esi*4], ecxmov [edi+ebx*4], eaxadd esi, 1sub ebx, 1cmp esi, ebxjle lbl0lbl5:mov ebp, [esp-20] ; restore EBP before using LOCALmov eax, jmov edx, [edi+esi*4]mov ecx, [edi+eax*4]mov [edi+esi*4], ecxmov [edi+eax*4], edxmov eax, esimov ebx, [esp-8]mov esi, [esp-12]mov edi, [esp-16]push eaxsub eax, 1invoke asqsort,arr,i,eax,rec,ind@@:pop eaxadd eax, 1invoke asqsort,arr,eax,j,rec,indquit:retasqsort endpend
快速排序(Quicksort)是对冒泡排序的一种改进。
它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外
一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归
进行,以此达到整个数据变成有序序列。
输入参数为i,j,rec,ind;四个DWORD类型;
如果edx为0直接退出;
i小于j直接退出;
JGE:如果大于或等于(>=)则跳转
rec:递归深度指示变量
首先把ebx,esi,edi的值存入堆栈;
数组首址是arr,放入edi;
在lbl5段和@@段中调用了自身;
4 acisort
acisort.asm
.486 ; force 32 bit code.model flat, stdcall ; memory model & calling conventionoption casemap :none ; case sensitiveinclude \masm32\macros\macros.asmaissort PROTO :DWORD,:DWORD.codealign 4acisort proc arr:DWORD,cnt:DWORDLOCAL gap :DWORDLOCAL sflag :DWORDLOCAL hflag :DWORDLOCAL eflag :DWORDpush ebxpush esipush edimov eax, cntmov gap, eax ; copy cnt to gapmov ebx, arr ; address of 1st elementdec cnt; --------------------------------------------------; bi-directional COMB preordering pass; --------------------------------------------------setgap:fild gap ; load integer memory operand to dividefdiv FP8(1.35) ; divide gap by constantfistp gap ; store result back in integer memory operandsub gap, 1 ; round down by 1cmp gap, 10jg @Fcmp gap, 9 ; comb 11 codejl @Fmov gap, 11@@:cmp gap, 1jle nxt ; exit when gap <= 1mov edi, cntsub edi, gapmov eflag, edixor ecx, ecx ; low value indexinner:mov edx, ecxadd edx, gap ; high value indexpush ebpmov ebp, [ebx+ecx*4] ; lower valuemov esi, [ebx+edx*4] ; swap valuesmov edi, -1; ===========================================cmpstrings:add edi, 1mov al, [ebp+edi] ; compare both stringscmp al, [esi+edi]jl noswap ; ascending sortjg swap ; swap these two labels for descendingtest al, aljnz cmpstrings; ===========================================jmp noswapswap:mov [ebx+edx*4], ebpmov [ebx+ecx*4], esinoswap:pop ebpadd ecx, 1cmp ecx, eflagjle inner; *******************************fild gap ; load integer memory operand to dividefdiv FP8(1.4) ; divide gap by constantfistp gap ; store result back in integer memory operandsub gap, 1 ; round down by 1cmp gap, 10jg @Fcmp gap, 9 ; comb 11 codejl @Fmov gap, 11@@:cmp gap, 1jle nxt ; exit when gap <= 1mov ecx, cntsub ecx, gap ; calculate ECX as cnt - gaprinner:mov edx, ecxadd edx, gap ; high value indexpush ebpmov ebp, [ebx+ecx*4] ; lower valuemov esi, [ebx+edx*4] ; swap valuesmov edi, -1; ===========================================rcmpstrings:add edi, 1mov al, [ebp+edi] ; compare both stringscmp al, [esi+edi]jl rnoswap ; ascending sortjg rswap ; swap these two labels for descendingtest al, aljnz rcmpstrings; ===========================================jmp rnoswaprswap:mov [ebx+edx*4], ebpmov [ebx+ecx*4], esirnoswap:pop ebpsub ecx, 1jnz rinnerjmp setgapnxt:inc cntinvoke aissort,arr,cnt ; call the insertion sort to clean up the restdone:pop edipop esipop ebxretacisort endpend
输入参数:arr,cnt;数组和个数;
本地变量:gap,sflag,hflag,eflat;三个标志变量;
调用了插入排序(aissort)来清除rest;
rcmpstrings段:
比较ebp+edi指向的值和esi+edi指向的值,
小于转到rnoswap
大于转到rswap
rswap-交换:
把ebp存入ebx+edx*4的地址;
把esi存入ebx+ecx*4的地址;
5 插入排序(升序)
aissort.asm
.486 ; force 32 bit code.model flat, stdcall ; memory model & calling conventionoption casemap :none ; case sensitive.codeOPTION PROLOGUE:NONE
OPTION EPILOGUE:NONE align 4aissort proc arr:DWORD,cnt:DWORD; -------------------------------; ascending insertion string sort; -------------------------------mov [esp-8], ebxmov [esp-12], esimov [esp-16], edimov [esp-20], ebpmov edi, [esp+4] ; array addressmov edx, 1cmp edx, [esp+8] ; compare count to EDXjge quitxor eax, eax ; clear EAX of previous contententry:mov ebx, [edi+edx*4]mov esi, edxinner:mov ecx, [edi+esi*4-4]mov ebp, -1stcmp: ; string comparison loopadd ebp, 1mov al, [ecx+ebp]cmp al, [ebx+ebp]jl outerjg swaptest al, aljnz stcmpjmp outerswap:mov [edi+esi*4], ecxsub esi, 1jnz innerouter:mov [edi+esi*4], ebxadd edx, 1cmp edx, [esp+8] ; compare count to EDXjl entryquit:mov ebx, [esp-8]mov esi, [esp-12]mov edi, [esp-16]mov ebp, [esp-20]ret 8aissort endpOPTION PROLOGUE:PrologueDef
OPTION EPILOGUE:EpilogueDef end.486 ; force 32 bit code.model flat, stdcall ; memory model & calling conventionoption casemap :none ; case sensitive.codeOPTION PROLOGUE:NONE
OPTION EPILOGUE:NONE align 4aissort proc arr:DWORD,cnt:DWORD; -------------------------------; ascending insertion string sort; -------------------------------mov [esp-8], ebxmov [esp-12], esimov [esp-16], edimov [esp-20], ebpmov edi, [esp+4] ; array addressmov edx, 1cmp edx, [esp+8] ; compare count to EDXjge quitxor eax, eax ; clear EAX of previous contententry:mov ebx, [edi+edx*4]mov esi, edxinner:mov ecx, [edi+esi*4-4]mov ebp, -1stcmp: ; string comparison loopadd ebp, 1mov al, [ecx+ebp]cmp al, [ebx+ebp]jl outerjg swaptest al, aljnz stcmpjmp outerswap:mov [edi+esi*4], ecxsub esi, 1jnz innerouter:mov [edi+esi*4], ebxadd edx, 1cmp edx, [esp+8] ; compare count to EDXjl entryquit:mov ebx, [esp-8]mov esi, [esp-12]mov edi, [esp-16]mov ebp, [esp-20]ret 8aissort endpOPTION PROLOGUE:PrologueDef
OPTION EPILOGUE:EpilogueDef end
数组地址存入edi;
比较次数存入edx;
stcmp-字符串比较循环:比较的是ecx+ebp地址处的值和ebx+ebp地址处的值
6 插入排序(降序)
.486 ; force 32 bit code.model flat, stdcall ; memory model & calling conventionoption casemap :none ; case sensitive.codeOPTION PROLOGUE:NONE
OPTION EPILOGUE:NONE align 4dissort proc arr:DWORD,cnt:DWORD; --------------------------------; descending insertion string sort; --------------------------------mov [esp-8], ebxmov [esp-12], esimov [esp-16], edimov [esp-20], ebpmov edi, [esp+4] ; array addressmov edx, 1cmp edx, [esp+8] ; compare count to EDXjge quitxor eax, eax ; clear EAX of previous contententry:mov ebx, [edi+edx*4]mov esi, edxinner:mov ecx, [edi+esi*4-4]mov ebp, -1stcmp: ; string comparison loopadd ebp, 1mov al, [ecx+ebp]cmp al, [ebx+ebp]jg outerjl swaptest al, aljnz stcmpjmp outerswap:mov [edi+esi*4], ecxsub esi, 1jnz innerouter:mov [edi+esi*4], ebxadd edx, 1cmp edx, [esp+8] ; compare count to EDXjl entryquit:mov ebx, [esp-8]mov esi, [esp-12]mov edi, [esp-16]mov ebp, [esp-20]ret 8dissort endpOPTION PROLOGUE:PrologueDef
OPTION EPILOGUE:EpilogueDef end
汇编排序算法代码总结相关推荐
- php递归算法排序,php常用的排序算法代码[冒泡,递归排序-PHP源码
<script>ec(2);<script> php 常用的排序算法代码[冒泡,递归排序 冒泡排序算法 function bubblesort($arr) { $n=count ...
- python排序算法代码
python排序算法代码: def bubble_sort(nums):# 获取列表长度 size = len(nums)# 若列表长度为0或1,则直接返回if size <= 1:return ...
- java代码实现希尔排序_Java希尔排序算法代码实现
Java希尔排序算法代码实现 时间:2017-08-30 来源:华清远见JAVA学院 什么是Java希尔排序算法呢? 希尔排序算法实际上是一种分组插入的排序算法,又被称为缩小增量排序.今天华清 ...
- 十大排序算法代码集锦(java)
SortAlgorithm.java import java.util.*;class SortAlgorithm { //冒泡排序public int[] BubbleSort(int[] nums ...
- 考研408笔试之排序算法代码实现汇总
各种排序算法汇总 因为分开写太麻烦了QAQ,直接放在一起吧. 写在前面 本文不详细探讨各种排序的原理,只涉及具体的代码实现,了解算法原理,翻阅一些资料可以写出各种排序的代码实现.本文进行汇总,以题目的 ...
- java排序算法代码_Java实现八种排序算法(代码详细解释)
package八大排序算法;importjava.util.Arrays;importorg.junit.Test;/*** 1.插入排序 直接插入排序.希尔排序 折半插入排序 * 2.交换排序 冒泡 ...
- Java中常见的排序算法代码演示
package cn.xbz;import java.util.Arrays;/*** 各种排序法的演示* @author xbz**/ public class ArraySort {public ...
- 链表冒泡排序java_055-冒泡排序算法代码实现
2.网上数据结构和算法的课程不少,但存在两个问题: 1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了 2) ...
- 水桶平分 java_关于java:桶排序算法代码问题
我需要在Java中实现以下内容. 输入:整数数组 输出:重新排列数组以具有以下内容: 假设原始数组中的第一个元素的值为x 在新数组中,假设x在位置I,即data[I] = x.然后,对所有x和所有j ...
最新文章
- select每门可说大于90分_小女子风雨黑暗无惧 90分全自动反向折叠照明伞
- 119. Pascal's Triangle II (Graph; WFS)
- Django中url匹配规则的补充
- ARMV8/ARMV9指令集概述(翻译)
- photoshop cs3反应慢的原因
- 在java程序中使用protobuf
- Ollydbg使用教程学习总结(四)
- linux查看tcl版本_查看Linux内核版本的方法有几个?你也是这样操作吗?
- Docker exec 命令执行出错, 显示 the input device is not aTTY 的解决办法
- 智能门禁(3)---汉王智能人脸门禁系统
- redis设计与实现读书笔记(一)
- Python制作翻译软件(中英文互译)
- MySQL用户管理语句001
- php theexcerpt,wordpress使用the_excerpt函数显示文章的摘要信息
- 转载:bat批处理简易教程
- Java工作小组组名,起组名和口号大全
- 本体技术视点 | 数据的去中心化协作和可信流动(一)
- 刷(shui)题记录 2021.12
- 语言学句法分析树形图怎么画_语言学第四章树形图句法.doc
- 校园网能否实现wifi上网?
热门文章
- 小程序对象不去重合并
- 计算机系统的分类与发展方向
- DbVisualizer数据库连接工具默认查询结果只显示100条解决方法,dbvis如何展示更多行,如何显示全部数据
- c语言return 11,二级C语言教程章节测试11.对函数的进一步讨论
- idea使用ant将wsdl文件_文件曝光:奔驰GLC将使用E级同款1.5T发动机
- Fleury算法找欧拉环游
- \00在python中
- 人工智能算法--KNN算法(C++实现)
- 定义一个栈(Stack)类,用于模拟一种具有后进先出(LIFO)特性的数据结构
- 第二章:2.1 微分方程、差分方程求解(举例)