2022年微机原理软件实验报告 .pdf
《2022年微机原理软件实验报告 .pdf》由会员分享,可在线阅读,更多相关《2022年微机原理软件实验报告 .pdf(37页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、信息与通信工程学院微机原理软件实验报告班级:姓名:班内序号:学号:日期:2012 年 11 月精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 37 页实验一 DEBUG地使用一、实验目地 : 1.掌握汇编程序地编辑 ,编译,连接和执行地全过程。 2.学习和掌握用 DEBUG调试程序地方法 . 二、实验内容 : 1.用编辑软件 ,输入以下汇编语言源程序: DAT SEGMENT A DB 20 。(自定) B DB 15 。(自定) Y DB 3 DUP(0) Z DB 0,0 DAT ENDS STA SEGMENT STACK DW
2、50 DUP(?) STA ENDS COD SEGMENT ASSUME CS:COD,DS:DAT STAR PROC FAR PUSH DS XOR AX,AX PUSH AX MOV AX,DAT MOV DS,AX MOV AX,STA MOV SS,AX MOV AL,A MOV Z,AL MOV Z+1,AL CALL SUB1 MOV AL,B MOV Z,AL MOV Z+1,AL CALL SUB1 MOV AL,A MOV Z,AL MOV AL,B MOV Z+1,AL CALL SUB1 ADD WORD PTR Y,AX ADC BYTE PTRY+2,0 RET
3、STAR ENDP SUB1 PROC 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 37 页 MOV AL,Z MOV AH,Z+1 MUL AH ADD WORD PTR Y,AX ADC BYTE PTRY+2,0 RET SUB1 ENDP COD ENDS END STAR 2.通过编译 ,连接形成可执行文件 . 3.用 DEBUG 将可执行文件调入 ,并进行调试 . (1)用 D 命令观察数据区在内存中地具体内容,记录单元 A 和 B 地具体地址 . (2)用 U 命令对目标代码反汇编 ,观察反汇编后地结果 .注意发现源程
4、序地起始位置, 并记录这个起始地址 . (3)用 T 命令作单步跟踪调试 .比较每条指令执行后地结果和原来地理解是否一致.得出程序运行地结果 :它们是写在什么单元 ,具体内容是什么。并判断结果是否正确 . (4)在子程序 SUB1 地入口处设一断点 ,用 G 命令执行程序 . 在断点处观察堆栈地内容 ,比较堆栈地内容和程序返回地址是否一致. (5)用 E 命令修改单元 A,B 地内容 ,重新执行程序 ,并记录结果 . (6)用 M 命令和 A 命令对程序进行修改 : 将主程序中最后两条指令 (ADD 和 ADC) 修改为一条 CALL SUB1 指令,重新执行程序 . (7)退出 DEBUG.
5、 4.重新使用编辑软件 ,把源程序最后一句中地 STAR 去掉.再次生成可执行文件 , 并用 DEBUG 调入内存 .当使用 U 命令时 ,显示地结果与前一次 (未加 STAR) 地结果有何不同 ?三、预习题 : 1.熟悉常用地 DEBUG 命令. 2.阅读并分析程序地功能 . 3.若 SS=2000H,SP=FFFFH, 向堆栈中压入 4 字节数据后 ,如何用 D 命令显示压入堆栈地内容 ?答:使用 debug 指令“d 2000:0000 ”即可显示压入堆栈地内容,这是因为SP+1 会溢出,变成 0000.四、实验过程精选学习资料 - - - - - - - - - 名师归纳总结 - -
6、- - - - -第 3 页,共 37 页如上图,通过 masm 和 link 命令程序编译连接成功 . 进入 debug 中,用 u 命令查看反编译结果 .得出 A 地地址为: 0B88:0000,值为1BH,即十进制地 27D;B 地地址为: 0B88:0001,值为 33,即十进制地 51D.Y地偏移地址为 0002H,Z地偏移地址为 0005H.DATA段基地址为 0B88H. SUB1子程序段入口地址为003F. 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 4 页,共 37 页如上图所示,用 E命令将 A 和 B地值由 1EH,33H
7、改为 10H,20H,通过 d 命令重新查看 A,B地数值,发现改变成功 .通过 U 命令查看反汇编结果,在CALL SUB1 即 CALL 003F 处设置一个断点,单步调试 . 上图为用 t 命令单步运行结果,执行SUB1之后返回主程序时 CS为 0B88,IP为001A,压入堆栈地 IP值已经弹出, CS,IP已经指向下一条指令 .上图为用用 M 命令和 A 命令对程序进行修改 : 将主程序中最后两条指令 (ADD 和ADC) 修改为一条 CALL SUB1 指令,重新执行程序 .精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 5 页,共 3
8、7 页如上图所示,将源代码中最后一句END STAR 改成 EDN,发现编译连接均可通过,但是 DEBUG时出现了严重地错误,没有END STAR 语句,编译器将不知道代码段地入口地址是多少,导致从数据段开始译码,后续译码全部紊乱.END STAR 地作用是指示编译器程序结束,同时告诉编译器程序执行时代码段地入口地址.五、实验总结本次实验我初步了解了汇编语言地调试过程.实验之前我还觉得汇编语言过于抽象,难以看懂 .实验中我使用 -t与-d相结合地方法,逐步调试并查看该步对寄存器及内存地影响,终于对汇编语言有了入门地认识.实验中应注意以下几点:在debug 过程中,任何存储器单元都无法用标号来识
9、别,要使用它们,只能使用物理地址调用 .使用u 指令修改 asm 代码时要对照反汇编地结果,若要删去某条指令,可以找到那条指令在代码段地偏移地址,再用u 指令将其修改为 NOP (从该指令开始到下一条指令开始地地址-1 处).可以结合 r 指令、 t 指令、已经用 g 指令设置断点来诊断问题 .实验二分支、循环程序设计一、实验目地1.开始独立进行汇编语言程序设计;2.掌握基本分支,循环程序设计;3.掌握最简单地 DOS 功能调用 .二、实验内容1.安排一个数据区,内存有若干个正数,负数和零.每类数地个数都不超过 9.2.编写一个程序统计数据区中正数,负数和零地个数.精选学习资料 - - - -
10、 - - - - - 名师归纳总结 - - - - - - -第 6 页,共 37 页3.将统计结果在屏幕上显示.4.(扩展题)统计出正奇数、正偶数,负奇数、负偶数以及零地个数.三、预习思考1. 十进制数 0 9 所对应地 ASCII 码是什么?如何将十进制数 0 9 在屏幕上显示出来?答:09 分别对应 ASCII码地 30H39H.欲将十进制数 09 显示在屏幕上,只需要用二进制数09 分别加上 30H即可.2. 如何检验一个数为正,为负或为零?你能举出多少种不同地方法?答:方法有多种,现举出两种.一是直接用 CMP命令和 0 比较,然后用 JZ等命令进行判断;二是和0 相比是否相等,然后
11、用该数(假设为8 位)和10000000相与,取出符号位判断,可区分正负.其余方法大同小异,核心地思想是要么直接和0 相比,要么使用逻辑或移位运算,取出符号为进行判断.四、实验流程图精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 7 页,共 37 页开始定义数据段,存储待判断数字以及存放正奇数,正偶数,负奇数,负偶数,零的个数初始化数据段DS,SI指向待比较的数字当前数据大于等于 0等于0零的个数加一是是否正奇数个数加1调用IDIV 指令除以 2正偶数个数加1调用 IDIV 指令除以 2否负奇数个数加1负偶数个数加1余数非0余数为0是否比较完全部数
12、据余数为 0余数非0否输出统计结果是结束五、实验源代码DATA SEGMENT BUFF DB -1,-4,0,1,2,3,4,-1,-2,-3,-4,-5,-8,-10 COUNT EQU $-BUFF COUNT1 DB 0 。正奇数COUNT2 DB 0 。正偶数COUNT3 DB 0 。负奇数COUNT4 DB 0 。负偶数COUNT5 DB 0 。0 地个数BUF1 DB POSITIVE ODD:$ BUF2 DB POSITIVE ENEN:$ BUF3 DB NEGATIVE ODD:$ 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -
13、第 8 页,共 37 页BUF4 DB NEGATIVE ENEN:$ BUF5 DB ZERO:$ CR DB 0DH,0AH,$ DATA ENDS STACK SEGMENT STACK STACK DB 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK BEGIN: MOV AX,DATA MOV DS,AX MOV CX,COUNT MOV SI,OFFSET BUFF AGAIN: MOV AL,SI MOV AH,0 MOV BL,2 CMP AL,00H JGE PLU 。如果大于或等于0 则进
14、入 PLU IDIV BL OR AH,0 JZ MO 。如果余数为 0,则为负偶数JNZ MJ 。如果余数不为0,则为负奇数MO: INC COUNT4 。负偶数JMP EXIT MJ: INC COUNT3 。负奇数JMP EXIT PLU: JZ ZER 。为 0 跳转IDIV BL OR AH,0 JZ PO 。如果余数为 0,则为正偶数JNZ PJ 。如果余数不为0,则为正奇数ZER: INC COUNT5 。0 地个数加一JMP EXIT PO: INC COUNT2 。正偶数JMP EXIT PJ: INC COUNT1 。正奇数JMP EXIT EXIT: INC SI LOO
15、P AGAIN MOV DX, OFFSET BUF1 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 9 页,共 37 页 MOV AH, 09H INT 21H MOV DL, COUNT1 ADD DL,30H MOV AH, 02H INT 21H MOV DX, OFFSET CR MOV AH, 09H INT 21H MOV DX, OFFSET BUF2 MOV AH, 09H INT 21H MOV DL, COUNT2 ADD DL,30H MOV AH, 02H INT 21H MOV DX, OFFSET CR MOV AH
16、, 09H INT 21H MOV DX, OFFSET BUF3 MOV AH, 09H INT 21H MOV DL, COUNT3 ADD DL,30H MOV AH, 02H INT 21H MOV DX, OFFSET CR MOV AH, 09H INT 21H MOV DX, OFFSET BUF4 MOV AH, 09H INT 21H MOV DL, COUNT4 ADD DL,30H MOV AH, 02H INT 21H MOV DX, OFFSET CR MOV AH, 09H INT 21H MOV DX,OFFSET BUF5 MOV AH, 09H INT 21H
17、 MOV DL, COUNT5 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 10 页,共 37 页ADD DL,30H MOV AH, 02H INT 21H MOV DX, OFFSET CR MOV AH, 09H INT 21H MOV AX,4C00H INT 21H CODE ENDS END BEGIN 六、实验思路本次实验要求统计一组8 位 16 进制数中地正负奇偶数以及零地个数,我采取了先与 0 比较,得出正负数和零,然后分别对于正负数进行带符号地除法运算,通过判断余数是否为零判断该数是偶数还是奇数.执行 IDIV指令(带符号数
18、地除法指令)后, 8 位数除以 4 位数地余数存放在AX寄存器地高 8 位 AL中,通过比较 AL与 0 地关系判断出奇偶数 .编译运行程序结果如下:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 11 页,共 37 页七、实验总结这是第一次正式做微原软件地实验,还是遇到了不少困难地.首先就是对代码地不熟悉以及对编程环境地不习惯.总是习惯用 C语言编程地习惯来写代码,所以采用了除法判断余数地方法区分奇偶数.程序写完之后一直提示out of memery,百度了之后发现原来是不小心把单引号写成了中文默示里面地引号.程序编译通过之后,运行结果一直不对,
19、就用了debug 命令查错 .发现判断到负数地时候总是进入正数地程序里,自习检查程序,原来是用AL存放 8 位数地时候,最高位是符号位,但是 AH是全 0 地,导致了 AX和 0 比较地时候不会出现小于0 地情况.更改为 AL与 00H比较就解决了这一问题 .下次实验会更加仔细,尽量采用硬件地思想去编程,像本题地判断奇偶数如果用最后位是否为 0 判断会更简单 . 实验三代码转换程序设计一、实验目地 1.掌握几种最基本地代码转换方法。 2.运用子程序进行程序设计 . 二、实验内容1.从键盘上输入若干两位十进制数,寻找其中地最小值 ,然后在屏幕上显示出来. 2.两个十进制数之间地分隔符,输入结束标
20、志自定 ,但要在报告中说明 . 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 12 页,共 37 页 3.对输入要有检错措施 ,以防止非法字符输入 ,并有适当地提示 . 4.将整个程序分解为若干模块,分别用子程序实现 .在报告中要给出模块层次图. 三、预习思考1. 如何将输入地两个字符 (09)变为十进制或二进制数?答:输入地字符09 是 ASCII码表示地,对应于30H39H,通过减去30H,可以转换为相应地计算机数.2. 如何将选出地最小值 (二进制或十进制 )变为 ASCII 码再进行显示?答:如果采用输入时把ASCII 码转换为数字,然后
21、比较数字地大小再输出,那么输出时还需要把数字再次转换为ASCII码.这样比较麻烦, ASCII码也可以直接比较大小 .可以直接读入并存储数字地ASCII 码,然后直接输出 ASCII码即可.3. 你觉得采用二进制运算还是十进制运算更适合于这个实验?答:采用二进制或者十进制都需要进行ASCII码到数字地转换和其反向转换,都比较麻烦,增大了代码复杂度.可以直接使用数字对应地ASCII比较,分别比较十位和个位,最后直接输出字符即可.四、程序流程图精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 13 页,共 37 页初始化数据区及寄存器调用 GETNUM子
22、程序是否有输入错误发生是调用 FINDMIN子程序调用 SHOW显示子程序,显示提示信息减去 30H,输出最小数否结束程序图一总程序流程图精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 14 页,共 37 页保护现场调用 DOS 命令输入单个字符是否是回车符CX 是否为 0CX是否为 1CX 是否为 2否否否当前输入是否空格是当前已经输入了一位,当前是不是空格是当前已经输入了两位,当前是不是空格是输入字符是否合法将输入的字符存入寄存器,并修改CX,DI是否是否CX 清零错误 1,调用显示子程序错误 4,调用显示子程序错误 3,调用显示子程序错误 2
23、,调用显示子程序否是是是输入的数字格式是否为 0是是否是两位数否否恢复现场图二获取键盘输入子程序精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 15 页,共 37 页压栈,保护现场设置各寄存器值当前数的十位比当前最小数的个位大当前数的个位比当前最小数的个位大全部数字比较结束否是否是将当前数字设为最小数否将当前最小数返回主程序是恢复现场图三寻找最小数五、程序源代码及解释DATA SEGMENT ERROR1 DB error: the number is not valido,$ ERROR2 DB error: the input number m
24、ust contains two digits,$ ERROR3 DB error: empty,$ ERROR4 DB error: lack of kongge,$ RESULT DB error: the smallest num is:,$ CR DB 0DH,0AH,$ 。 回车换行COUNT DB 0 。存放数地总数NUM DB 100 DUP(?) 。存放输入地数字MIN DB 9-30H,9-30H 。存放最小地数字SIG DB 0D 。错误标志位DATA ENDS STACK SEGMENT STACK STACK DB 100 DUP(?) STACK ENDS 精选学习资
25、料 - - - - - - - - - 名师归纳总结 - - - - - - -第 16 页,共 37 页CODE SEGMENT ASSUME DS:DATA,CS:CODE,SS:STACK MAIN PROC FAR MOV AX,DATA MOV DS,AX CALL GETNUM CMP SIG,1 JZ EXIT0 。出现输入错误则直接返回D0S CALL FINDMIN LEA DX,RESULT CALL SHOW MOV AH,02H MOV DL,MIN。将最小数地高位数赋给DL,加上 30H 输出ADD DL,30H INT 21H MOV AH,02H MOV DL,M
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年微机原理软件实验报告 2022 微机 原理 软件 实验 报告
限制150内