汇编排序算法代码总结
生活随笔
收集整理的這篇文章主要介紹了
汇编排序算法代码总结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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總結
以上是生活随笔為你收集整理的汇编排序算法代码总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RSA加密算法原理和java简单实现
- 下一篇: 图解在8086模拟器中运行汇编hello