太原理工大学微机原理实验报告_第1页
太原理工大学微机原理实验报告_第2页
太原理工大学微机原理实验报告_第3页
太原理工大学微机原理实验报告_第4页
太原理工大学微机原理实验报告_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本科实验报告本科实验报告 课程名称 微机原理及应用 实验项目 实验地点 专业班级 机械 xxx 班 学号 xxxxxxxxxx 学生姓名 xx 指导教师 2016 年 12 月 28 日 实验一实验一 汇编语言程序开发环境与程序调试汇编语言程序开发环境与程序调试 一 实验要求和目的一 实验要求和目的 1 熟悉在微机上编辑 汇编 连接 调试和运行汇编语言程序的过程 掌握 PC 环境 下命令行方式的特点 2 熟悉汇编过程中一些常见出错信息 3 熟悉程序调试的方法 DOS 命令窗口的 debug 的常用命令 二 实验内容二 实验内容 1 项目要求 在屏幕上显示字符串 Hello world 2 程序设计思想 运用 DOS 系统功能调用 INT 21H 的 9 号功能 DOS 系统功能调用的 9 号功能是显 示字符串 它调用的参数 DS DX 串地址 且字符串以 结束 程序流程图如图 1 1 图 1 1 程序流程图 3 程序清单 完整指令代码如下 简化段定义格式 程序开始 段的初始化 设置显示字符串的段地址 设置字符串的偏移地址 DOS 系统功能调用 返回 DOS 程序结束 model small 定义程序的存储模式 486 说明使用的 80 x86 微处理器指令 stack 定义堆栈段 data 定义数据段 String db Hello world code 定义代码段 startup 程序执行开始 Mov ax seg String 把 String 的段地址送 ax Mov ds ax ax 送 ds ds 取得 string 的段地址 mov dx offset String String 的偏移地址送dx mov ah 9 字符串显示功能 int 21h DOS 功能调用 mov ax 4c00h int 21h 返回 DOS exit end 三 结果与分析三 结果与分析 指导教师 年 月 实验二实验二 内存数据的移动内存数据的移动 一 实验要求与目的 一 实验要求与目的 1 实验要求 编写程序实现把数据段的字符串数据移动到附加段中 2 实验目的 通过项目学习汇编的数据传送指令和串处理类指令 巩固寻址方式 学 习汇编程序设计 二 实验内容 二 实验内容 1 项目要求 把数据段中以 dstring 地址标号为开始地址的 hello world 字符串移动 到附加段以 sstring 地址标号为开始地址中去 2 设计思想 从源串中取一个字符到 AL 中 然后把刚取到的字符放到目的串指定位 置 重复这样的过程 把源串的字符取完为止 程序流程如图 2 1 所示 图 2 1 程序流程图 3 程序设计清单 实现这样功能的程序方法很多 下面给出了实现这一功能的完整程 序清单 完整段定义格式 方案一 无聊版 采用的是 loop 指令 CX 为循环次数 当 CX 为 0 时退出循环 加入了换行指令 用字符串常量 改变字符串 提前终止字符串的输出 程序如下 DSEG SEGMENT dstring DB HELLO WORLD 33 33 15 个字节 HELLO WORLD dstring 1 db 数据段的字符串 一定要加 表示一个字符串的结束 dstring 2 db 附加段的字符串 在屏幕上显示的字符串 DSEG ENDS ESEG SEGMENT sstring DB 15 DUP 附加段预留 15 个字节空间 ESEG ENDS CODE SEGMENT ASSUME CS CODE DS DSEG ES ESEG start MOV AX DSEG 程序开始执行的地方 MOV DS AX 将 DSEG 的段地址给 ds MOV AX ESEG MOV ES AX 将 SSEG 的段地址给 es LEA SI dstring 将 dstring 的首地址给 si LEA DI sstring 将 sstring 的首地址给 di MOV CX 15 CX 存放 loop 指令的循环次数 S MOV AL SI MOV ES DI AL INC DI INC SI LOOP S mov dX offset dstring 1 MOV AH 09h INT 21H 输出字符串 数据段的字符串 MOV DL 0AH 输出换行 MOV AH 02H INT 21H mov dX offset dstring MOV AH 09h INT 21H 输出字符串 HELLO WORLD MOV DL 0AH MOV AH 02H INT 21H 输出换行 mov dX offset dstring 2 MOV AH 09h INT 21H 输出字符串 dstring 2 MOV DL 0AH MOV AH 02H INT 21H 输出换行 mov al mov es di 3 al 将第二个 改成 以终止字符串的继续输出 MOV AX ES MOV DS AX 将附加段的段地址附给数据段 mov dX offset sstring MOV AH 09h INT 21H 显示字符串 HELLO WORLD 注意不是 MOV AX 4C00H INT 21H 返回 DOS CODE ENDS 代码段结束 END start 程序结束 方案二 采用字符串操作指令 movsb 执行 di si Si 与 di 自动地址改变方向 由 std cld 控制 Cx 作为计数器 前面应用 rep 指令重复 程序如下 DSEG SEGMENT dstring DB HELLO WORLD 13 个字节 HELLO WORLD DSEG ENDS ESEG SEGMENT sstring DB 13 DUP 附加段留 13 个字节空间 ESEG ENDS CODE SEGMENT ASSUME CS CODE DS DSEG ES ESEG start MOV AX DSEG 程序开始执行的地方 MOV DS AX 将 DSEG 的段地址给 ds MOV AX ESEG MOV ES AX 将 SSEG 的段地址给 es LEA SI dstring 将 dstring 的首地址给 si LEA DI sstring 将 sstring 的首地址给 di MOV CX 13 CX 存放 rep 指令的重复次数 cld 将 DF 位清零 则 di 与 si 自增 rep movsb 执行 di si MOV AX ES MOV DS AX 将附加段的段地址附给数据段 mov dX offset sstring MOV AH 09h INT 21H 显示字符串 HELLO WORLD MOV AX 4C00H INT 21H 返回 DOS CODE ENDS 代码段结束 END start 程序结束 方案三 采用是 cmp 与 ja 跳转指令来实现数据的移动 程序如下 DSEG SEGMENT dstring DB HELLO WORLD 13 个字节 HELLO WORLD DSEG ENDS ESEG SEGMENT sstring DB 15 DUP 附加段留 13 个字节空间 ESEG ENDS CODE SEGMENT ASSUME CS CODE DS DSEG ES ESEG start MOV AX DSEG 程序开始执行的地方 MOV DS AX 将 DSEG 的段地址给 ds MOV AX ESEG MOV ES AX 将 SSEG 的段地址给 es LEA SI dstring 将 dstring 的首地址给 si LEA DI sstring 将 sstring 的首地址给 di MOV CX 13 CX 存放循环次数 S MOV AL SI MOV ES DI AL INC DI INC SI DEC CX CMP CX 0 JA S MOV AX ES MOV DS AX 将附加段的段地址附给数据段 mov dX offset sstring MOV AH 09h INT 21H 显示字符串 HELLO WORLD MOV AX 4C00H INT 21H 返回 DOS CODE ENDS 代码段结束 END start 程序结束 附简化段定义格式如下 附简化段定义格式如下 model small 定义程序的存储模式 486 说明使用的 80X86 微处理指令 data 定义数据段开始 dstring db hello world sstring db 13 dup 0 使用的同一个数据段 code 定义代码段 startup 程序开始执行的地方 mov ax seg dstring mov ax data mov ds ax 将 dstring 的段地址附给 ds mov es ax 为了使用 movsb 指令 由于两个字符串都在数据段 所以令 es ds lea si dstring lea di sstring mov cx 13 循环次数 cld rep movsb mov dx offset sstring mov ah 9 int 21h mov ax 4c00h int 21h exit End 4 调试过程 在 win7x32 下调试的方案二 第 1 步 进入 debug 命令 debug file exe 第 2 步 用 r 命令查看 cpu 寄存器内容 这一步基本没用 看注意点即可 注意 此时并未给 ds es 赋值 在 ds es 赋值之前有 ds es cs ds 10h 第 3 步 用 U 命令查看汇编指令 直接暴力输入 g 001a 也可 但只适用本程序 第四步 用 T 命令执行一条机器指令 这里了执行四次 此时可以看到 ds 和 es 已经赋值了 此时来查看内存的内容 注意 cs 没变 第五步 用 d 命令查看内存的内容 即查看 DS 0 和 ES 0 输入 d 0bc6 0 和 d 0bc7 0 可以看出已经完成移动了 三 结果与分析三 结果与分析 没仔细去看为什么 0bc6 0010 处也有 hello world 我调试过了发现还有 猜测可能 与 ss 的栈有关 四 拓展四 拓展 用 q 命令退出 debug 用 p 命令一次执行完循环 用 g 偏移地址 ip 可以直接执行到上一条指令 即此时 IP ip 教师点评 指导教师 年 月 日 实验三实验三 分支程序结构分支程序结构 一 实验要求与目的 一 实验要求与目的 1 实验要求 掌握分支结构程序设计的基本方法 掌握无条件转移指令和条件转移指 令的使用 掌握分支结构程序设计的两种基本结构的使用 2 实验目的 通过分支程序的设计掌握结构化程序设计方法和常用算法设计 二 实验内容 二 实验内容 1 项目要求 编写程序实现 在数据段中 有一个按从小到大顺序排列的无符号数组 其首地址存放在 SI 寄存器中 数组中的第一个单元存放着数组长度 在 key 单元中有一个 无符号数 要求在数组中查找是否存在 key 这个数 如找到 则使 CF 0 并在 DI 中给出 该单元在数组中的偏移地址 如未找到 则使 CF 1 2 设计思想 对于这个表格查找 可以使用顺序查找和折半查找的算法思想 当然顺 序查找程序简单 效率不高 而折半查找程序复杂 效率高 但对查找数据要求有序 本 项目采用折半查找方式 在一个长度为 N 的有序数组 r 中 查找元素 k 的折半查找算法可描述如下 初始化被查找数组的尾下标 low 1 high n 若 low high 则查找失败 CF 1 退出程序 否则 计算中点 mid low high 2 k 与中点元素 r mid 比较 若 k r mid 则查找成功 结束程序 若 k r mid 则转步骤 低半部分查找 lower high mid 1 返回步骤 2 继续执行 高半部分查找 higher low mid 1 返回步骤 2 继续执行 程序开始 初始化low high low high Low high 查找不成功 CF 1 计算中间元素下标 mid low high 2 SI 所查找元素的偏移地址 lowr mid k r mid 3 程序清单 简化段定义格式 model small 486 stack data 定义数据段开始 array db 13 45 49 54 66 78 83 85 89 94 99 123 233 245 key db 40 cg1 db find error1 db failed sstring db 12 dup code startup start mov ax data 加载数据 mov ds ax mov al key 查找关键词送 AL lea si array 把数组的首地址送 SI mov bl array 把数组元素个数送 BL mov bh 0 把数组元素个数送 BX inc si main cmp bx 0 jl error 转到查找失败程序段 shr bx 1 bx 除以 2 cmp al bx si mid bx si ja higher 若大于 则转到高半部分 jb lower 若小于 则转到低半部分 jmp cg 转到查找成功 无条件转移指令 higher add si bx 高半部分 inc si jmp main lower add si 0 低半部分 dec bx jmp main error lea dx error1 查找失败 lea 取有效地址 mov ah 09h 字符串显示 int 21h jmp s 直接退出 cg lea dx cg1 查找成功 mov ah 09h 字符串显示 int 21h stc cf 置 0 mov di bx si di 保存 s exit End 附完整段定义附完整段定义 DSEG SEGMENT ARRAY DB 13 45 49 54 66 78 83 85 89 94 99 123 233 245 KEY DB 45 CG1 DB find ERROR1 DB failed DSEG ENDS CSEG SEGMENT ASSUME CS CSEG DS DSEG START MOV AX DSEG MOV DS AX MOV AL KEY LEA SI ARRAY MOV BL ARRAY MOV BH 0 INC SI MAIN CMP BX 0 JL ERROR SHR BX 1 CMP AL BX SI JA HIGHER JB LOWER JMP CG HIGHER ADD SI BX INC SI JMP MAIN LOWER ADD SI 0 DEC BX JMP MAIN ERROR LEA DX ERROR1 MOV AH 09H INT 21H CLC JMP EXIT CG LEA DX CG1 MOV AH 09H INT 21H STC MOV DI BX SI JMP EXIT EXIT MOV AX 4C00H INT 21H CSEG ENDS END START 4 调试过程 此程序在计算中值 mid low high 2 采用了一些技巧 在程序思想 的描述上 应该计算出高端地址 high 和低端地址 low 再计算中间地址 mid 实 际上我们需要的是中间地址 mid 没有必要一定要计算出高端地址和低端地址 bx si 表 示的是中值地址 cmp al bx si 这指令表示 ax 与中值进行比较 本程序稍作修改 就 可实现更广应用 三 结果与分析三 结果与分析 令 key 45 输出结果如下 完整段代码输出结果 指导教师 年 月 日 实验四实验四 循环程序结构循环程序结构 一 实验要求与目的一 实验要求与目的 1 实验要求 掌握循环结构程序设计的基本方法 了解循环控制的方法 计数 条件 和混合 2 实验目的 通过循环程序的设计掌握结构化程序设计方法和循环控制方法的设计 二 实验内容二 实验内容 1 项目要求 编写程序实现 1 100 的累加和求算 结果送到 SUM 单元中 2 设计思想 如果循环次数是已知的 则采用计数控制方法 这里计数法可以是正计 数即从 1 计数到 n 图 4 1 a 所示 也可以是倒计数法即从 n 计数到 0 图 4 1 b 所示 程序开始 初始化ax cx ax存和sum cx存循环次数 cx cn ax ax cx cx cx 1 退出 Sum ax 是 否 程序开始 初始化ax cx ax存和sum cx存循环次数 cx bx si Y N 子程序初始化 inc si mov al bx si mov di si si cx N Y xchg bx di al inc dx dx cx mov si dx xchg bx si al Y N 子程序初始化 子程序开始 子程序结束 送将要显示的字符到DL 恢复现场 修改指针地址 循环结束 Y N 保护现场 DOS系统功能调用 这三个子程序是 XZPX 功能是对数组元素进行降序排序 入口参数 采用寄存器 SI 传递参数 用了寄存器 AX BX CX DX 出口参数 无 DISPLAY 功能是将数组元素输出在屏幕上显示 入口参数 采用寄存器 SI 传递参数 出口参数 无 DIGITAL DISPLAY 将数组元素中的数字显示在屏幕上 你也可以定义显示字符串然后调 用 DOS 命令 显示字符 入口参数 采用寄存器 SI 传递参数 调用的寄存器 AX BX DX 出口参数 无 DATA SEGMENT ARRAY DB 13 65 12 97 68 69 70 71 72 73 98 75 76 77 DATA ENDS CODE SEGMENT ASSUME CS CODE DS DATA START MOV AX DATA MOV DS AX LEA SI ARRAY CALL DISPLAY 显示原数字串 CALL XZPX 大小排序 CALL DISPLAY 显示排序后的数字串 JMP EXIT 退出程序 XZPX PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSHF MOV CL SI 数组元素个数读入CL中 MOV CH 0 CX保存数组元素个数 DEC CX MOV BX SI BX指向数组的第一个元素 即数组的个数字节 INC BX BX指向数组的第一个数字 MOV DX 0 DX用于循环计数 LOP1 MOV SI DX DX送SI 用于定位 SI是用来循环比较的 MOV DI DX 用于交换 子程序结束 b XZPX子程序 c DISPLAY子程序 MOV AL BX SI AL用于存放最大数 INC SI 用于SI的循环 LOP2 CMP AL BX SI 比较 JAE GO AL大于等于跳转至GO MOV AL BX SI 否则 bx si 送AL MOV DI SI DI记下大元素在数组中的位置 GO INC SI 继续增加SI作比较 CMP SI CX JB LOP2 直到一位比较完 MOV SI DX SI重新定位 回初位置 XCHG BX SI AL XCHG BX DI AL 初位置元素SI与大元素交换 INC DX CMP DX CX JB LOP1 直到所有的元素查找完 POPF POP SI POP DX POP CX POP BX POP AX RET XZPX ENDP DISPLAY PROC NEAR PUSH AX PUSH CX PUSH DX PUSH SI PUSHF MOV CL SI 循环次数 MOV CH 0 INC CX LOP3 CALL DIGITAL DISPLAY 嵌套函数 MOV DL 32

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论