目前网络上似乎还没有比较令人满意的MASM32的冒泡排序实现代码,曾经的我也为此而感到头痛,经过一年的学习我又回过头来,着手编写了这段MASM32的可执行冒泡排序代码,供广大同学学习。
一、MASM32冒泡排序
下图是程序运行后的效果:
降序排序版:
升序排序版:
下附降序排序代码:
倘若要获得升序排序代码只需将“jb follow”那行改为“ja follow”即可。
;x86(32位)汇编语言程序 冒泡法排序程序 sort1_x86.asm 降序排列,从大到小
.486 ; create 32 bit code
.model flat, stdcall ; 32 bit memory model
option casemap :none ; case sensitive
include \masm32\macros\macros.asm
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\wsock32.lib
includelib \masm32\lib\msvcrt.lib
include \masm32\include\msvcrt.inc
include \masm32\include\masm32.inc
include \masm32\include\gdi32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
.data
arr dd 8, 1, 5, 2, 7, 9, 6, 4, 3, 10 ; 10个原始数据,数据可以改变,排好后,还放在这里
len1 byte ?
len2 byte ?
fmt byte '%d ',0
.code
main: ;-------------------显示原始数据----------------------------
mov len1,lengthof arr ;获取数据长度
mov ebx,offset arr ;获取数据的起始地址
xor ecx,ecx
mov al,len1
prt1:
movsx ebx,al
cmp ecx,ebx
jnb fina1
mov edx, arr[(type arr)*ecx]
pushad
invoke crt_printf,offset fmt,edx ;显示一个数据
popad
inc ecx
jmp prt1
fina1:
print chr$(" ",13,10) ;显示回车、换行
print chr$(" ",13,10) ;显示回车、换行
;----------------------------------------------排序--------------------
mov len1,lengthof arr ;数据长度 -> len1
mov ebx,offset arr ;数据偏移地址(首地址) -> ebx
mov al,0h ; al=0
lp:
cmp al,len1
jnb done ; 排序结束,转done
mov ah, 1h ; ah=1
inner:
mov cl,len1 ; cl <- len1=数据长度
mov len2,cl ; len2 <- cl
sub len2,al ; len2 <- len2-al
cmp ah,len2 ; 比较ah 和 len2
jnb last ; 跳出内循环
movsx esi,ah ; esi <- ah
mov bl,ah ; bl = ah
sub bl,1 ; bl <1 bl-1
movsx edi,bl ; edi <- bl
mov ecx, arr[(type arr)*esi] ;ecx <- [esi]
mov edx, arr[(type arr)*edi] ;edx <_ [edi]
cmp ecx,edx ;比较ecx和edx
jb follow ;小于则转 降序排序 从大到小
mov edx,arr[(type arr)*esi] ;edx <- [esi]
xchg edx,arr[(type arr)*edi] ;edx与[edi]交换
xchg edx,arr[(type arr)*esi] ;edx与[esi]交换
follow:
inc ah ; ah +1 -> ah
jmp inner ; 转内循环
last:
inc al ; al+1 -> al
jmp lp ;转外循环
;----------------------------------显示排序后的数据------------------------
done:
xor ecx,ecx
mov al,len1
prt:
movsx ebx,al
cmp ecx,ebx
jnb fina
mov edx, arr[(type arr)*ecx]
pushad
invoke crt_printf,offset fmt,edx
popad
inc ecx
jmp prt
fina:
exit
end main
二、MASM32汇编程序运行
可能有童鞋还不知道要如何运行MASM32汇编程序,可以参考下面的教程:
1、首先要下载masm32保存到任意盘中(一般是D盘,我操作演示时是用D盘),还需要有一个x86的配套文件夹(相关的配置问题,在此不再过多赘述,可上网查找资料)。
2、然后点击运行\masm32目录中的“qeditor.exe”
会出现MASM32的界面:
3、点击左上角的File,Open位于D盘x86目录下的.asm文件
特别要注意的是:.asm文件必须要放在D盘的x86文件夹下,在这里我将待运行文件命名为“sort1_x86.asm”。
打开后会显示程序的代码内容,有些乱码属于正常现象
4、然后点击Project下的Console Assemble &Link进行编译和连接
若该步骤成功,则出现下图:
5、运行:点击右上方这个黑黑的按钮
出现如下图的控制台弹窗:
毛东西没有,但莫要慌,敲入文件名,将后缀.asm改为.exe,如下图:
如下图就是降序排序的结果:
实验结束: