冒泡排序(正向+逆向) 汇编语言课程设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
交换
6 4 9 7 2 3 8 10 0 20
交换
第二轮: 6 4 9 7 2 3 8 10 20 0
交换
6 9 4 7 2 3 8 10 20
0
交换
6 9 7 4 2 3 8 10
不交换
20 0
6 9 7 4 2 3 8 10
交换
20 0
、6 9 7 4 3 2 8 10
交换
20 0
6 9 7 4 3 8 2 10
si,2
enter
crlf
;输出报错信息
dx,mess2
ah,09
;9号调用,显示字符串,输入数据
9
int 21h
call crlf
mov ax,-1d
;以AX中的值作为出错标志
jmp exit3
exit2: mov num[si],bx ;将BX中内容存入以num为首的存储单元中
call crlf
push bx
push cx
push si
push di
mov cx,10000d
call dec_div
mov cx,1000d
call dec_div
mov
cx,100d
call dec_div
mov
cx,10d
call dec_div
mov
cx,1d
call dec_div
add dl,flag2
output endp decibin proc
mov mov newchar: mov int mov cmp jnz mov jmp next2: sub jl cmp jg cbw xchg mov mul xchg add jmp next3: cmp jne neg exit1: ret
binidec dl,',' ah,02 21h si,2 di next1 crlf
mess1
db '***Please input ten
integers(-32768---32767)***',13,10
db '***seperate them with comma and end
input with Enter :***$'
mess2
db '***Input error!Please input
课程设计报告
设计题目: 名 称: 班 级: 姓 名: 学 号: 设计时间: 指导教师:
汇编冒泡排序算法分析 微机原理与接口课程设计 信息工程学院 通信 0902
杨旭 2009012325 2011-12-16 至 2011-12-25
徐明娟
评 语:
评阅成绩:
评阅教师:
1
一、课程设计的性质和目的:
通过课程设计,进行程设计方法和技能的基本训练,巩固在课堂上学到的有 关软件程序设计的基本知识和基本方法,通过实际动手能力的培养,进一步熟悉 汇编语言的结构和使用方法,达到能独立阅读、编制和调试一定规模的汇编语言 程序的水平。
交换
6 4 7 9 2 0 3 8 10 20
交换
6 4 7 9 2 0 3 8 10 20
不交换
6 4 9 7 2 0 3 8 10 20
交换
6 4 9 7 2 0 3 8 10 20
6
不交换
6 4 9 7 2 0 3 8 10 20
交换
6 4 9 7 2 3 0 8 10 20
交换
6 4 9 7 2 3 8 0 10 20
again!***$'
Leabharlann Baidu
mess3
db '***The source numbers are as
follows:***$'
mess4
db '***The sorted numbers are as
follows:***$'
data ends
prognam segment
main proc far
assume cs:prognam,ds:data
next2 flag1,1 newchar al,30h next3 al,9d next3
ax,bx cx,10d cx ax,bx bx,ax newchar flag1,1 exit1 bx
;数据加r ;对bx中的内容进行求补
11
decibin endp
binidec proc ;将BX中的二进制数以十进制形式输出在屏幕上
jle lg3
xchg ax,num[si+2] ;进行数据交换
mov num[si],ax
lg3: add si,2
loop lg2
;判断CX==0,循环
mov cx,di
;还原CX的值
loop lg1
;判断CX==0,循环
ret
bubblesort endp
output proc
;将num[]里的数据以十进制输出在屏幕上
dx,0
div
cx
mov
bx,dx
mov
dl,al
add
dl,30h
;转换成ASCII码
12
cmp
flag2,0
jne
lg4
cmp
dl,30h ;判断十进制数是否为0,以判断是否输出
je
lg5
mov flag2,1
lg4: mov
ah,02h ;2号调用,输出十进制数
int
21h
lg5: ret
dec_div endp
1、正确输出结果:
13
2、当输入不合法时,程序会自动跳到初始位置,并给出了出错提醒,要求重新输 入数据:
3、当输入不足10个数时,就会自动补0:
14
九、心得体会:
经过九天左右的汇编语言课程设计,使我对汇编语言有了更进一步的认识和 了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,通过 实践,我也发现我的好多不足之处,首先是自己在汇编语言认识上还不足,通过 学习也有所改进;还有对汇编语言中经常出现的错误也不了解,通过实践,使我 在这几个方面的认识有所提高。汇编语言比高级语言更加底层,要求用户能够了 解每一个细节性的东西。汇编程序采用指令助记符来完成一个又一个操作,程序 十分简短,但功能却很强大。
2
五、课题分析及设计思路:
冒泡排序: 依 次 比 较 相 邻 的 两 个 数 ,将 小 数 放 在 前 面 ,大 数 放 在 后 面 。即 在 第 一 趟 :
首先比较第 1 个和第 2 个数,将小数放前,大数放后。然后比较第 2 个数和第 3 个数,将小数放前,大数放后,如此继续,直至比较最后两 个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最 后。在第二趟:仍从第一对数开始比较(因为可能由于第 2 个数和第 3 个数的交换,使得第 1 个数不再小于第 2 个数),将小数放前,大数放 后 , 一 直 比 较 到 倒 数 第 二 个 数 ( 倒 数 第 一 的 位 置 上 已 经 是 最 大 的 ), 第 二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列 中 是 第 二 大 的 数 )。 如 此 下 去 , 重 复 以 上 过 程 , 直 至 最 终 完 成 排 序 。 冒泡排序可分为正向和逆向两种排序.通过主程序对子程序的调用来 完成输入输出,排序,循环,转化等功能。
call crlf
;回车,换行
mov si,0
mov di,count
next1: mov bx,num[si]
test bx,8000h ;判断正负
jz
next4
mov dl,'-'
mov ah,2
;2号调用,显示单字符负号'-'
int 21h
neg bx
;求补
10
next4: call mov mov int add dec jnz call ret
start:
push ds
;把原数据存放到段寄存器
sub ax,ax
push ax
mov ax,datarea
mov ds,ax
8
redo:call cmp je lea mov int call call lea mov int call mov int
main endp input proc
lea mov int call mov mov enter: call dec cmp je cmp je jne store: mov add jmp error: call lea mov
data ends code segment
assume cs:code,ds:data start:mov ax,data
mov ds,ax mov cx ,10 dec cx lop1:mov dx,cx mov bx,0 lop2:mov ax,buf[bx] cmp ax,buf[bx+2] jge lop3 xchg ax ,buf[bx+2] mov buf[bx],ax
这次的冒泡排序程序设计中,我不仅复习了冒泡算法,还复习了汇编程序中 子程序的使用。就设计结构而言,本次课设还是采用功能分解、逐步求精的思想, 一步步的实现要求的功能,并在一些已有的程序上作进一步的改进,来达到要求 实现的的功能。就这两点而言,这和高级语言C++很像,实现起来的过程也十分 相似。
crlf proc
; 向 终 端 发 出 回 车 、换 行 符 ,完 成 一 次 回 车 换 行 操 作
mov
dl,0ah
mov
ah,02h ;显示功能
int
21h
mov
dl,0dh ;回车
mov
ah,02h ;显示功能
int
21h
ret
crlf
endp
prognam ends
end start
正向排序程序截图:
5
lop3:add bx,2 dec cx jne lop2 mov cx ,dx loop lop1 mov ah,4ch int 21h code ends end start
逆向排序程序截图:
将 4,6,7,9,2,0,3,8,10,20 按降序排序 第一轮:
4 6 7 9 2 0 3 8 10 20
ah,4ch
21h
;输入原始数据
dx,mess1
ah,09
21h
;9号调用,显示字符串,请求输入数据
crlf
;回车,换行
si,0
cx,count
decibin
cx
dl,','
;进行分隔符判断,以逗号为分隔符
store
dl,13
;进行换行判断
exit2
error
num[si],bx ;将BX中的二进制数存储到num中
二、课程设计的要求: 1、遵循模块化、结构化的程序设计方法。 2、要求程序必须正确。 3、程序简明易懂,多运用输入输出提示,有出错信息及必要的注释。 4、要求程序结构合理,语句使用得当。 5、适当追求编程技巧和程序运行效率。
三、主要仪器设备及软件:
PC机、MASM汇编软件。
四、课程设计题目及要求:
题目:汇编冒泡排序算法分析 要求:用汇编语言编写冒泡排序的算法,并比较冒泡排序正向和逆向排序的 算法的优缺点和适用情况。
;回车换行
exit3: ret
input endp
bubblesort proc
;将num[]中存储的数进行冒泡排序
mov cx,count
;初始化计数器CX
dec cx
lg1: mov di,cx
;保存CX的值
mov si,0
lg2: mov ax,num[si]
;相邻的两数进行比较大小
cmp ax,num[si+2]
input
;输入原始数据
ax,-1d
;判断是否出错
redo
;出错,退出
dx,mess3
ah,09
;9号调用,显示字符串,请求输出数据
21h
output
;输出原始数据
bubblesort ;对原始数据进行冒泡排序
dx,mess4
ah,09
;9号调用,显示字符串,请求输出数据
21h
output
;输出排序后的数据
cmp dl,30h ;判断这个数是否是0,以免没有输出0
jne lg6
mov
ah,02h
int
21h
lg6:pop
di
pop
si
pop
cx
pop
bx
mov
flag2,0 ;还原0标志
ret
binidec endp
dec_div proc ;将BX中的需转换的十进制数,输出在屏幕上
mov
ax,bx
mov
;将BX中的二进制数用十进制在屏幕上输出 ;2号调用,输出分隔符','
;从键盘中取得十进制数转化为二进制,并存入BX中 bx,0 flag1,0;符号位标志flag1,0为正数,1为负数 ah,1 ;1号调用,单字符输入,送入al 21h dl,al al,2dh ;与符号减号'-'的ASCII码作比较
交换
20 0
7
6 9 7 4 3 8 10 6 9 7 4 3 8 10
如此下去最终排序为:20,10,9,8,7,6,4,3,2,0
2
20 0
交换
20
20
不交换
冒泡正向排序:
data segment
num
dw 50 dup(?)
count
dw 10
flag1
db 0
;符号标志
flag2
db 0
;首位0标志
3
六、程序主要流程图:
开始 初始化 I=0
地址加 2
数 i>=数 i+1
二数交换位置
内循环计数器 CX-1
N
CX =0
外循环计数器 DX-1
N
DX=0
4
结束
七、程序主要代码与分析(关键代码要有注释):
BUF 为首址的字符区存放 10 个无符号数,从大到小进行排序(逆向)
data segment buf dw 3,-4,6,7,9,2,-8,-10,20,0
6 4 9 7 2 3 8 10 0 20
交换
第二轮: 6 4 9 7 2 3 8 10 20 0
交换
6 9 4 7 2 3 8 10 20
0
交换
6 9 7 4 2 3 8 10
不交换
20 0
6 9 7 4 2 3 8 10
交换
20 0
、6 9 7 4 3 2 8 10
交换
20 0
6 9 7 4 3 8 2 10
si,2
enter
crlf
;输出报错信息
dx,mess2
ah,09
;9号调用,显示字符串,输入数据
9
int 21h
call crlf
mov ax,-1d
;以AX中的值作为出错标志
jmp exit3
exit2: mov num[si],bx ;将BX中内容存入以num为首的存储单元中
call crlf
push bx
push cx
push si
push di
mov cx,10000d
call dec_div
mov cx,1000d
call dec_div
mov
cx,100d
call dec_div
mov
cx,10d
call dec_div
mov
cx,1d
call dec_div
add dl,flag2
output endp decibin proc
mov mov newchar: mov int mov cmp jnz mov jmp next2: sub jl cmp jg cbw xchg mov mul xchg add jmp next3: cmp jne neg exit1: ret
binidec dl,',' ah,02 21h si,2 di next1 crlf
mess1
db '***Please input ten
integers(-32768---32767)***',13,10
db '***seperate them with comma and end
input with Enter :***$'
mess2
db '***Input error!Please input
课程设计报告
设计题目: 名 称: 班 级: 姓 名: 学 号: 设计时间: 指导教师:
汇编冒泡排序算法分析 微机原理与接口课程设计 信息工程学院 通信 0902
杨旭 2009012325 2011-12-16 至 2011-12-25
徐明娟
评 语:
评阅成绩:
评阅教师:
1
一、课程设计的性质和目的:
通过课程设计,进行程设计方法和技能的基本训练,巩固在课堂上学到的有 关软件程序设计的基本知识和基本方法,通过实际动手能力的培养,进一步熟悉 汇编语言的结构和使用方法,达到能独立阅读、编制和调试一定规模的汇编语言 程序的水平。
交换
6 4 7 9 2 0 3 8 10 20
交换
6 4 7 9 2 0 3 8 10 20
不交换
6 4 9 7 2 0 3 8 10 20
交换
6 4 9 7 2 0 3 8 10 20
6
不交换
6 4 9 7 2 0 3 8 10 20
交换
6 4 9 7 2 3 0 8 10 20
交换
6 4 9 7 2 3 8 0 10 20
again!***$'
Leabharlann Baidu
mess3
db '***The source numbers are as
follows:***$'
mess4
db '***The sorted numbers are as
follows:***$'
data ends
prognam segment
main proc far
assume cs:prognam,ds:data
next2 flag1,1 newchar al,30h next3 al,9d next3
ax,bx cx,10d cx ax,bx bx,ax newchar flag1,1 exit1 bx
;数据加r ;对bx中的内容进行求补
11
decibin endp
binidec proc ;将BX中的二进制数以十进制形式输出在屏幕上
jle lg3
xchg ax,num[si+2] ;进行数据交换
mov num[si],ax
lg3: add si,2
loop lg2
;判断CX==0,循环
mov cx,di
;还原CX的值
loop lg1
;判断CX==0,循环
ret
bubblesort endp
output proc
;将num[]里的数据以十进制输出在屏幕上
dx,0
div
cx
mov
bx,dx
mov
dl,al
add
dl,30h
;转换成ASCII码
12
cmp
flag2,0
jne
lg4
cmp
dl,30h ;判断十进制数是否为0,以判断是否输出
je
lg5
mov flag2,1
lg4: mov
ah,02h ;2号调用,输出十进制数
int
21h
lg5: ret
dec_div endp
1、正确输出结果:
13
2、当输入不合法时,程序会自动跳到初始位置,并给出了出错提醒,要求重新输 入数据:
3、当输入不足10个数时,就会自动补0:
14
九、心得体会:
经过九天左右的汇编语言课程设计,使我对汇编语言有了更进一步的认识和 了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,通过 实践,我也发现我的好多不足之处,首先是自己在汇编语言认识上还不足,通过 学习也有所改进;还有对汇编语言中经常出现的错误也不了解,通过实践,使我 在这几个方面的认识有所提高。汇编语言比高级语言更加底层,要求用户能够了 解每一个细节性的东西。汇编程序采用指令助记符来完成一个又一个操作,程序 十分简短,但功能却很强大。
2
五、课题分析及设计思路:
冒泡排序: 依 次 比 较 相 邻 的 两 个 数 ,将 小 数 放 在 前 面 ,大 数 放 在 后 面 。即 在 第 一 趟 :
首先比较第 1 个和第 2 个数,将小数放前,大数放后。然后比较第 2 个数和第 3 个数,将小数放前,大数放后,如此继续,直至比较最后两 个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最 后。在第二趟:仍从第一对数开始比较(因为可能由于第 2 个数和第 3 个数的交换,使得第 1 个数不再小于第 2 个数),将小数放前,大数放 后 , 一 直 比 较 到 倒 数 第 二 个 数 ( 倒 数 第 一 的 位 置 上 已 经 是 最 大 的 ), 第 二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列 中 是 第 二 大 的 数 )。 如 此 下 去 , 重 复 以 上 过 程 , 直 至 最 终 完 成 排 序 。 冒泡排序可分为正向和逆向两种排序.通过主程序对子程序的调用来 完成输入输出,排序,循环,转化等功能。
call crlf
;回车,换行
mov si,0
mov di,count
next1: mov bx,num[si]
test bx,8000h ;判断正负
jz
next4
mov dl,'-'
mov ah,2
;2号调用,显示单字符负号'-'
int 21h
neg bx
;求补
10
next4: call mov mov int add dec jnz call ret
start:
push ds
;把原数据存放到段寄存器
sub ax,ax
push ax
mov ax,datarea
mov ds,ax
8
redo:call cmp je lea mov int call call lea mov int call mov int
main endp input proc
lea mov int call mov mov enter: call dec cmp je cmp je jne store: mov add jmp error: call lea mov
data ends code segment
assume cs:code,ds:data start:mov ax,data
mov ds,ax mov cx ,10 dec cx lop1:mov dx,cx mov bx,0 lop2:mov ax,buf[bx] cmp ax,buf[bx+2] jge lop3 xchg ax ,buf[bx+2] mov buf[bx],ax
这次的冒泡排序程序设计中,我不仅复习了冒泡算法,还复习了汇编程序中 子程序的使用。就设计结构而言,本次课设还是采用功能分解、逐步求精的思想, 一步步的实现要求的功能,并在一些已有的程序上作进一步的改进,来达到要求 实现的的功能。就这两点而言,这和高级语言C++很像,实现起来的过程也十分 相似。
crlf proc
; 向 终 端 发 出 回 车 、换 行 符 ,完 成 一 次 回 车 换 行 操 作
mov
dl,0ah
mov
ah,02h ;显示功能
int
21h
mov
dl,0dh ;回车
mov
ah,02h ;显示功能
int
21h
ret
crlf
endp
prognam ends
end start
正向排序程序截图:
5
lop3:add bx,2 dec cx jne lop2 mov cx ,dx loop lop1 mov ah,4ch int 21h code ends end start
逆向排序程序截图:
将 4,6,7,9,2,0,3,8,10,20 按降序排序 第一轮:
4 6 7 9 2 0 3 8 10 20
ah,4ch
21h
;输入原始数据
dx,mess1
ah,09
21h
;9号调用,显示字符串,请求输入数据
crlf
;回车,换行
si,0
cx,count
decibin
cx
dl,','
;进行分隔符判断,以逗号为分隔符
store
dl,13
;进行换行判断
exit2
error
num[si],bx ;将BX中的二进制数存储到num中
二、课程设计的要求: 1、遵循模块化、结构化的程序设计方法。 2、要求程序必须正确。 3、程序简明易懂,多运用输入输出提示,有出错信息及必要的注释。 4、要求程序结构合理,语句使用得当。 5、适当追求编程技巧和程序运行效率。
三、主要仪器设备及软件:
PC机、MASM汇编软件。
四、课程设计题目及要求:
题目:汇编冒泡排序算法分析 要求:用汇编语言编写冒泡排序的算法,并比较冒泡排序正向和逆向排序的 算法的优缺点和适用情况。
;回车换行
exit3: ret
input endp
bubblesort proc
;将num[]中存储的数进行冒泡排序
mov cx,count
;初始化计数器CX
dec cx
lg1: mov di,cx
;保存CX的值
mov si,0
lg2: mov ax,num[si]
;相邻的两数进行比较大小
cmp ax,num[si+2]
input
;输入原始数据
ax,-1d
;判断是否出错
redo
;出错,退出
dx,mess3
ah,09
;9号调用,显示字符串,请求输出数据
21h
output
;输出原始数据
bubblesort ;对原始数据进行冒泡排序
dx,mess4
ah,09
;9号调用,显示字符串,请求输出数据
21h
output
;输出排序后的数据
cmp dl,30h ;判断这个数是否是0,以免没有输出0
jne lg6
mov
ah,02h
int
21h
lg6:pop
di
pop
si
pop
cx
pop
bx
mov
flag2,0 ;还原0标志
ret
binidec endp
dec_div proc ;将BX中的需转换的十进制数,输出在屏幕上
mov
ax,bx
mov
;将BX中的二进制数用十进制在屏幕上输出 ;2号调用,输出分隔符','
;从键盘中取得十进制数转化为二进制,并存入BX中 bx,0 flag1,0;符号位标志flag1,0为正数,1为负数 ah,1 ;1号调用,单字符输入,送入al 21h dl,al al,2dh ;与符号减号'-'的ASCII码作比较
交换
20 0
7
6 9 7 4 3 8 10 6 9 7 4 3 8 10
如此下去最终排序为:20,10,9,8,7,6,4,3,2,0
2
20 0
交换
20
20
不交换
冒泡正向排序:
data segment
num
dw 50 dup(?)
count
dw 10
flag1
db 0
;符号标志
flag2
db 0
;首位0标志
3
六、程序主要流程图:
开始 初始化 I=0
地址加 2
数 i>=数 i+1
二数交换位置
内循环计数器 CX-1
N
CX =0
外循环计数器 DX-1
N
DX=0
4
结束
七、程序主要代码与分析(关键代码要有注释):
BUF 为首址的字符区存放 10 个无符号数,从大到小进行排序(逆向)
data segment buf dw 3,-4,6,7,9,2,-8,-10,20,0