1、1课 程 设 计 报 告设 计 题 目 : 汇 编 冒 泡 排 序 算 法 分 析名 称 : 微 机 原 理 与 接 口 课 程 设 计班 级 : 信 息 工 程 学 院 通 信 0902姓 名 : 杨 旭学 号 : 2009012325设 计 时 间 : 2011-12-16 至 2011-12-25指 导 教 师 : 徐 明 娟评 语 :评 阅 成 绩 : 评 阅 教 师 :2一 、 课 程 设 计 的 性 质 和 目 的 :通 过 课 程 设 计 , 进 行 程 设 计 方 法 和 技 能 的 基 本 训 练 , 巩 固 在 课 堂 上 学 到 的 有关 软 件 程 序 设 计 的 基
2、本 知 识 和 基 本 方 法 , 通 过 实 际 动 手 能 力 的 培 养 , 进 一 步 熟 悉汇 编 语 言 的 结 构 和 使 用 方 法 , 达 到 能 独 立 阅 读 、 编 制 和 调 试 一 定 规 模 的 汇 编 语 言程 序 的 水 平 。二 、 课 程 设 计 的 要 求 :1、 遵 循 模 块 化 、 结 构 化 的 程 序 设 计 方 法 。2、 要 求 程 序 必 须 正 确 。3、 程 序 简 明 易 懂 , 多 运 用 输 入 输 出 提 示 , 有 出 错 信 息 及 必 要 的 注 释 。4、 要 求 程 序 结 构 合 理 , 语 句 使 用 得 当 。
3、5、 适 当 追 求 编 程 技 巧 和 程 序 运 行 效 率 。三 、 主 要 仪 器 设 备 及 软 件 :PC机 、 MASM汇 编 软 件 。四 、 课 程 设 计 题 目 及 要 求 :题 目 : 汇 编 冒 泡 排 序 算 法 分 析要 求 : 用 汇 编 语 言 编 写 冒 泡 排 序 的 算 法 , 并 比 较 冒 泡 排 序 正 向 和 逆 向 排 序 的算 法 的 优 缺 点 和 适 用 情 况 。3五 、 课 题 分 析 及 设 计 思 路 :冒 泡 排 序 :依 次 比 较 相 邻 的 两 个 数 , 将 小 数 放 在 前 面 , 大 数 放 在 后 面 。 即 在
4、 第 一 趟 :首 先 比 较 第 1 个 和 第 2 个 数 , 将 小 数 放 前 , 大 数 放 后 。 然 后 比 较 第 2个 数 和 第 3 个 数 , 将 小 数 放 前 , 大 数 放 后 , 如 此 继 续 , 直 至 比 较 最 后 两个 数 , 将 小 数 放 前 , 大 数 放 后 。 至 此 第 一 趟 结 束 , 将 最 大 的 数 放 到 了 最后 。 在 第 二 趟 : 仍 从 第 一 对 数 开 始 比 较 ( 因 为 可 能 由 于 第 2 个 数 和 第 3个 数 的 交 换 , 使 得 第 1 个 数 不 再 小 于 第 2 个 数 ) , 将 小 数
5、放 前 , 大 数 放后 , 一 直 比 较 到 倒 数 第 二 个 数 ( 倒 数 第 一 的 位 置 上 已 经 是 最 大 的 ) , 第二 趟 结 束 , 在 倒 数 第 二 的 位 置 上 得 到 一 个 新 的 最 大 数 ( 其 实 在 整 个 数 列中 是 第 二 大 的 数 ) 。 如 此 下 去 , 重 复 以 上 过 程 , 直 至 最 终 完 成 排 序 。冒 泡 排 序 可 分 为 正 向 和 逆 向 两 种 排 序 .通 过 主 程 序 对 子 程 序 的 调 用 来完 成 输 入 输 出 , 排 序 , 循 环 , 转 化 等 功 能 。4六 、 程 序 主 要
6、流 程 图 :NN 外 循 环 计 数 器 DX-1DX=0结 束开 始初 始 化I=0地 址 加 2数 i=数 i+1二 数 交 换 位 置内 循 环 计 数 器CX-1CX =05七 、 程 序 主 要 代 码 与 分 析 ( 关 键 代 码 要 有 注 释 ) :BUF为 首 址 的 字 符 区 存 放 10个 无 符 号 数 , 从 大 到 小 进 行 排 序 ( 逆 向 )data segmentbuf dw 3,-4,6,7,9,2,-8,-10,20,0data endscode segmentassume cs:code,ds:datastart:mov ax,datamov
7、ds,axmov cx ,10dec cxlop1:mov dx,cxmov bx,0lop2:mov ax,bufbxcmp ax,bufbx+2jge lop3xchg ax ,bufbx+2mov bufbx,ax6lop3:add bx,2dec cxjne lop2mov cx ,dxloop lop1mov ah,4chint 21hcode endsend start逆 向 排 序 程 序 截 图 :将 4,6,7,9,2,0, 3,8,10,20按 降 序 排 序第 一 轮 :4 6 7 9 2 0 3 8 10 206 4 7 9 2 0 3 8 10 206 4 7 9 2
8、 0 3 8 10 206 4 9 7 2 0 3 8 10 206 4 9 7 2 0 3 8 10 20不 交 换交 换 交 换交 换76 4 9 7 2 0 3 8 10 206 4 9 7 2 3 0 8 10 206 4 9 7 2 3 8 0 10 206 4 9 7 2 3 8 10 0 20第 二 轮 :6 4 9 7 2 3 8 10 20 06 9 4 7 2 3 8 10 20 06 9 7 4 2 3 8 10 20 06 9 7 4 2 3 8 10 20 0、 6 9 7 4 3 2 8 10 20 06 9 7 4 3 8 2 10 20 0交 换不 交 换 交
9、换交 换 交 换交 换交 换不 交 换 交 换 交 换 交 换86 9 7 4 3 8 10 2 20 06 9 7 4 3 8 10 20 2 0如 此 下 去 最 终 排 序 为 :20,10,9,8,7,6,4,3,2,0冒 泡 正 向 排 序 :data segmentnum dw 50 dup(?)count dw 10flag1 db 0 ;符 号 标 志flag2 db 0 ;首 位 0标 志mess1 db *Please input tenintegers(-32768-32767)*,13,10db *seperate them with comma and endinpu
10、t with Enter :*$mess2 db *Input error!Please inputagain!*$mess3 db *The source numbers are asfollows:*$mess4 db *The sorted numbers are asfollows:*$data endsprognam segmentmain proc farassume cs:prognam,ds:datastart: push ds ;把 原 数 据 存 放 到 段 寄 存 器sub ax,axpush axmov ax,datareamov ds,ax交 换 不 交 换9redo
11、:call input ;输 入 原 始 数 据cmp ax,-1d ;判 断 是 否 出 错je redo ;出 错 , 退 出lea dx,mess3mov ah,09 ;9号 调 用 , 显 示 字 符 串 , 请 求 输 出 数 据int 21hcall output ;输 出 原 始 数 据call bubblesort ;对 原 始 数 据 进 行 冒 泡 排 序lea dx,mess4mov ah,09 ;9号 调 用 , 显 示 字 符 串 , 请 求 输 出 数 据int 21hcall output ;输 出 排 序 后 的 数 据mov ah,4chint 21hmain
12、 endpinput proc ;输 入 原 始 数 据lea dx,mess1mov ah,09int 21h ;9号 调 用 , 显 示 字 符 串 , 请 求 输 入 数 据call crlf ;回 车 , 换 行mov si,0mov cx,countenter: call decibindec cxcmp dl, ;进 行 分 隔 符 判 断 , 以 逗 号 为 分 隔 符je storecmp dl,13 ;进 行 换 行 判 断je exit2jne errorstore: mov numsi,bx ;将 BX中 的 二 进 制 数 存 储 到 num中add si,2jmp e
13、ntererror: call crlf ;输 出 报 错 信 息lea dx,mess2mov ah,09 ;9号 调 用 , 显 示 字 符 串 , 输 入 数 据10int 21hcall crlfmov ax,-1d ;以 AX中 的 值 作 为 出 错 标 志jmp exit3exit2: mov numsi,bx ;将 BX中 内 容 存 入 以 num为 首 的 存 储 单 元 中call crlf ;回 车 换 行exit3: retinput endpbubblesort proc ;将 num中 存 储 的 数 进 行 冒 泡 排 序mov cx,count ;初 始 化
14、计 数 器 CXdec cxlg1: mov di,cx ;保 存 CX的 值mov si,0lg2: mov ax,numsi ;相 邻 的 两 数 进 行 比 较 大 小cmp ax,numsi+2jle lg3xchg ax,numsi+2 ;进 行 数 据 交 换mov numsi,axlg3: add si,2loop lg2 ;判 断 CX=0, 循 环mov cx,di ;还 原 CX的 值loop lg1 ;判 断 CX=0, 循 环retbubblesort endpoutput proc ;将 num里 的 数 据 以 十 进 制 输 出 在 屏 幕 上call crlf
15、;回 车 , 换 行mov si,0mov di,countnext1: mov bx,numsitest bx,8000h ;判 断 正 负jz next4mov dl,-mov ah,2 ;2号 调 用 , 显 示 单 字 符 负 号 -int 21hneg bx ;求 补11next4: call binidec ;将 BX中 的 二 进 制 数 用 十 进 制 在 屏 幕 上 输 出mov dl,mov ah,02 ;2号 调 用 , 输 出 分 隔 符 , int 21hadd si,2dec dijnz next1call crlfretoutput endpdecibin pro
16、c ;从 键 盘 中 取 得 十 进 制 数 转 化 为 二 进 制 , 并 存 入 BX中mov bx,0mov flag1,0;符 号 位 标 志 flag1,0为 正 数 , 1为 负 数newchar: mov ah,1 ;1号 调 用 , 单 字 符 输 入 ,送 入 alint 21hmov dl,alcmp al,2dh ;与 符 号 减 号 -的 ASCII码 作 比 较jnz next2mov flag1,1jmp newcharnext2: sub al,30hjl next3cmp al,9djg next3cbwxchg ax,bxmov cx,10dmul cxxch
17、g ax,bxadd bx,ax ; 数 据 加 rjmp newcharnext3: cmp flag1,1jne exit1neg bx ;对 bx中 的 内 容 进 行 求 补exit1: ret12decibin endpbinidec proc ;将 BX中 的 二 进 制 数 以 十 进 制 形 式 输 出 在 屏 幕 上push bxpush cxpush sipush dimov cx,10000dcall dec_divmov cx,1000dcall dec_divmov cx,100dcall dec_divmov cx,10dcall dec_divmov cx,1dc
18、all dec_divadd dl,flag2cmp dl,30h ;判 断 这 个 数 是 否 是 0, 以 免 没 有 输 出 0jne lg6mov ah,02hint 21hlg6:pop dipop sipop cxpop bxmov flag2,0 ;还 原 0标 志retbinidec endpdec_div proc ;将 BX中 的 需 转 换 的 十 进 制 数 , 输 出 在 屏 幕 上mov ax,bxmov dx,0div cxmov bx,dxmov dl,aladd dl,30h ;转 换 成 ASCII码13cmp flag2,0jne lg4cmp dl,30
19、h ;判 断 十 进 制 数 是 否 为 0, 以 判 断 是 否 输 出je lg5mov flag2,1lg4: mov ah,02h ;2号 调 用 , 输 出 十 进 制 数int 21hlg5: retdec_div endpcrlf proc ;向 终 端 发 出 回 车 、 换 行 符 , 完 成 一 次 回 车 换 行 操 作mov dl,0ahmov ah,02h ;显 示 功 能int 21hmov dl,0dh ;回 车mov ah,02h ;显 示 功 能int 21hretcrlf endpprognam endsend start正 向 排 序 程 序 截 图 :1
20、、 正 确 输 出 结 果 :142、 当 输 入 不 合 法 时 ,程 序 会 自 动 跳 到 初 始 位 置 ,并 给 出 了 出 错 提 醒 , 要 求 重 新 输入 数 据 :3、 当 输 入 不 足 10个 数 时 ,就 会 自 动 补 0:15九 、 心 得 体 会 :经 过 九 天 左 右 的 汇 编 语 言 课 程 设 计 , 使 我 对 汇 编 语 言 有 了 更 进 一 步 的 认 识 和了 解 , 要 想 学 好 它 要 重 在 实 践 , 要 通 过 不 断 的 上 机 操 作 才 能 更 好 地 学 习 它 , 通 过实 践 , 我 也 发 现 我 的 好 多 不 足
21、 之 处 , 首 先 是 自 己 在 汇 编 语 言 认 识 上 还 不 足 , 通 过学 习 也 有 所 改 进 ; 还 有 对 汇 编 语 言 中 经 常 出 现 的 错 误 也 不 了 解 , 通 过 实 践 , 使 我在 这 几 个 方 面 的 认 识 有 所 提 高 。 汇 编 语 言 比 高 级 语 言 更 加 底 层 , 要 求 用 户 能 够 了解 每 一 个 细 节 性 的 东 西 。 汇 编 程 序 采 用 指 令 助 记 符 来 完 成 一 个 又 一 个 操 作 , 程 序十 分 简 短 , 但 功 能 却 很 强 大 。这 次 的 冒 泡 排 序 程 序 设 计 中
22、, 我 不 仅 复 习 了 冒 泡 算 法 , 还 复 习 了 汇 编 程 序 中子 程 序 的 使 用 。 就 设 计 结 构 而 言 , 本 次 课 设 还 是 采 用 功 能 分 解 、 逐 步 求 精 的 思 想 ,一 步 步 的 实 现 要 求 的 功 能 , 并 在 一 些 已 有 的 程 序 上 作 进 一 步 的 改 进 , 来 达 到 要 求实 现 的 的 功 能 。 就 这 两 点 而 言 , 这 和 高 级 语 言 C+很 像 , 实 现 起 来 的 过 程 也 十 分相 似 。回 顾 起 此 课 程 设 计 , 至 今 我 仍 感 慨 颇 多 , 从 理 论 到 实 践
23、 , 在 这 段 日 子 里 , 可以 说 得 是 苦 多 于 甜 , 但 是 可 以 学 到 很 多 很 多 的 东 西 , 同 时 不 仅 可 以 巩 固 了 以 前 所学 过 的 知 识 , 而 且 学 到 了 很 多 在 书 本 上 所 没 有 学 到 过 的 知 识 。 通 过 这 次 课 程 设 计使 我 懂 得 了 理 论 与 实 际 相 结 合 是 很 重 要 的 , 只 有 理 论 知 识 是 远 远 不 够 的 , 只 有 把所 学 的 理 论 知 识 与 实 践 相 结 合 起 来 , 从 理 论 中 得 出 结 论 , 才 能 真 正 为 社 会 服 务 ,从 而 提 高 自 己 的 实 际 动 手 能 力 和 独 立 思 考 的 能 力 。实 验 过 程 中 , 也 对 团 队 精 神 的 进 行 了 考 察 , 让 我 们 在 合 作 起 来 更 加 默 契 , 在成 功 后 一 起 体 会 喜 悦 的 心 情 。 此 次 设 计 也 让 我 明 白 了 思 路 即 出 路 , 有 什 么 不 懂 不明 白 的 地 方 要 及 时 请 教 或 上 网 查 询 , 只 要 认 真 钻 研 , 动 脑 思 考 , 动 手 实 践 , 就 没有 弄 不 懂 的 知 识 , 收 获 颇 丰 。