




已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
微机原理与接口技术软件实验一、 实验目的1.掌握汇编程序的编辑,编译,连接和执行的全过程;2.学习和掌握用debug调试程序的方法.二、 源程序dat segmenta db 4 ;(自定)b db 5 ;(自定)y db 3 dup(0)z db 0,0dat endssta segment stackdw 50 dup(?)sta endscod segmentassume cs:cod,ds:datstar proc far push dsxor ax,axpush axmov ax,datmov ds,axmov ax,stamov ss,axmov al,amov z,almov z+1,alcall sub1 ;a*amov al,bmov z,almov z+1,alcall sub1 ;b*bmov al,amov z,almov al,bmov z+1,al ;z stores the two oprd temporallycall sub1 ;a*badd word ptr y,axadc byte ptry+2,0 ;a*b*2retstar endpsub1 procmov al,zmov ah,z+1mul ahadd word ptr y,ax ;y stores the resultadc byte ptry+2,0 ;y+2 stores the signal flagretsub1 endpcod endsend star三、实验文档中的要求(1)用 d 命令观察数据区在内存中的具体内容,记录单元 a 和 b 的具体地址.(图一:反汇编结果以及数据区具体内容)由图一,可知a的地址为:141ch:0000h;b的地址为:141ch:0001h。(2)用 u 命令对目标代码反汇编,观察反汇编后的结果.注意发现源程序的起始位置, 并记录这个起始地址.由图一,可知:data段段基址:141cha的偏移地址:0000hb的偏移地址:0001hy的偏移地址:0002hz的偏移地址:0005hstack段段基址:141dhcode段段基址:1424h第一条指令的偏移地址:0000h子程序sub1入口的偏移地址:003fh(3)用 t 命令作单步跟踪调试.比较每条指令执行后的结果和原来的理解是否一致.得出程序运行的结果:它们是写在什么单元,具体内容是什么; 并判断结果是否正确.现仅将关键步骤的单步调试结果列出,配合r命令查看结果。(图二:单步调试结果一)这是第一次调用sub1子程序退出后的结果,从图中可以看出y存储的数据是+16(a已经改为4;b已经改为5),即是a*a的结果,符号位为0表示是正数。(图三:单步调试结果二)这是第二次调用sub1子程序退出后的结果,从图中可以看出执行完“mul ah”指令后,ax存储的数据是25,即是b*b的结果,子程序退出后y存储的数据是+41,即是16+25的结果。(图四:单步调试结果三)这是第三次调用sub1子程序的结果,从图中可以看出执行完“mul ah”指令后,ax存储的数据是20,即是a*b的结果,子程序退出后y存储的数据是+61,即是41+20的结果。(图五:单步调试结果四)这是程序退出时的最终结果,从图中可以看出,y存储的数据最终为 +81 ,即为(a+b)*(a+b)的结果。结果正确。(4)在子程序 sub1 的入口处设一断点,用 g 命令执行程序. 在断点处观察堆栈的内容,比较堆栈的内容和程序返回地址是否一致.(图六:调用子程序的堆栈内容改变结果)从图中可以看出, ip指针的变化说明调用了子程序sub1,而堆栈段段基址ss和栈顶指针sp的值都没有改变。程序返回地址一致。(5)用 e 命令修改单元 a,b 的内容,重新执行程序,并记录结果.(图七:修改a,b数值后的结果)从图中可见,分别将a,b的值改为1,1后,程序执行完毕,y存储的内容是+4,结果正确。(6)用 m 命令和 a 命令对程序进行修改: 将主程序中最后两条指令 (add 和adc) 修改为一条 call sub1 指令,重新执行程序.(图八:a命令练习使用的结果)反汇编发现程序最后的add指令在code段的偏移地址为0035,将此处改为调用sub1子程序的指令,然后将0038处改为retf。重新执行后,查看y的内容,结果正确。(7) 重新使用编辑软件,把源程序最后一句中的 star 去掉.再次生成可执行文件,并用 debug 调入内存.当使用 u 命令时,显示的结果与前一次(未加 star) 的结果有何不同?(图九:修改源程序后执行的结果)观察到两点不同(虽然不明了其原因),其一:不能立即进入程序,需执行许多冗余指令;其二:不能正确退出程序。预习题:若 ss=2000h,sp=ffffh, 向堆栈中压入 4 字节数据后,如何用 d 命令显示压入堆栈的内容?使用debug指令“d 2000:0000”即可显示压入堆栈的内容,这是因为sp+1会溢出,变成0000。四、心得体会 汇编语言编程时要求程序员有严谨、缜密的思维,在某些程度上,我感觉使用汇编语言的编程过程就是把高级语言的结构过程拉平成线性过程来考虑问题。经过此次试验,我基本掌握了汇编程序的编辑、编译、连接、执行以及调试的主要步骤。应注意以下几点:在debug过程中,任何存储器单元都无法用标号来识别,要使用它们,只能使用物理地址调用。使用u指令修改asm代码时要对照反汇编的结果,若要删去某条指令,可以找到那条指令在代码段的偏移地址,再用u指令将其修改为nop(从该指令开始到下一条指令开始的地址-1处)。可以结合r指令、t指令、已经用g指令设置断点来诊断问题。微机原理与接口技术软件实验实验报告二姓名:杨帆学院:信息与通信工程学号:070547班级:07118实验二 分支,循环程序设计 一、实验目的: 1.开始独立进行汇编语言程序设计;2.掌握基本分支,循环程序设计;3.掌握最简单的 dos 功能调用。实验内容: 1.安排一个数据区,内存有若干个正数,负数和零。每类数的个数都不超过 9。2.编写一个程序统计数据区中正数,负数和零的个数。3.将统计结果在屏幕上显示。二、预习题: 1.十进制数 0 - 9 所对应的 ascii 码是什么? 如何将十进制数 0 - 9 在屏幕上显示出来?答:0的ascii码是30h,以后依次递增。要屏显0-9的数码,只需将ah置成02h(dos功能调用),然后将要显示的数码的ascii码存进dl里,然后执行int 21h就可以打印字符。或者,若这些数码是以字符串的格式存储,则可以将ah置成09h,(最后以$字符结束,)然后将串首地址传给ds,然后执行int 21h就可以打印字符串。2.如何检验一个数为正,为负或为零? 你能举出多少种不同的方法?答:可以将待检验数与0比较(使用cmp指令后判断cf、of或者以表达式【实用eq、ge等操作符】的返回值来判断),也可以将待检验数与80h相与,判断zf的值。三、源程序 data segmentbuf0 db 2bh,3ah ;+,:posi db 0buf1 db 0ah,0dh,30h,3ah ;lf,cr,0,:zero db 0buf2 db 0ah,0dh,2dh,3ah ;lf,cr,-,:nega db 0num db 72h,88h,91h,01h,00h,00h,23h,77h,21h;you can add other numberscnt equ $-num ;lenthdata endsstack segment stack stackdb 100 dup (?)stack endscode segmentassume cs:code,ds:data,ss:stackstart proc farpush dsxor ax,axpush axmov ax,datamov ds,axmov cx,0mov bx,0loop1: mov al,numbxcall far ptr cmprinc bxinc cxcmp cx,cnt ;loop cnt timesjnz loop1add posi,30hadd zero,30hadd nega,30h ;transfer to asc2 codemov ah,02h ;to print charsmov cx,0mov bx,0loop2: mov dl,buf0bxint 21hinc bxinc cxcmp cx,0dh ;loop 13 timesjnz loop2mov ax,4c00hint 21hretstart endpcmpr proc farcmp al,0jge biggerinc negajmp exitbigger: je equalinc posijmp exitequal: inc zeroexit: retcmpr endpcode endsend start四、程序流程图 (图表一:主程序流程图)(图表二:cmpr子程序流程图)五、实验结果与调试过程 (图一:程序运行结果)分析:设置的数据区待分析数据为“72h,88h,91h,01h,00h,00h,23h,77h,21h”,其中正数为72h,01h,23h,77h,21h;负数为88h,91h;还有两个零。可见程序得出的结果是正确的。(图二:反汇编结果)分析:data段地址:1466;posi偏移地址:0002;zero偏移地址:0007;nega偏移地址:000c;code段地址:1468;子程序cmpr偏移地址:0049;cnt的值+09d。六、选作题: 统计出正奇数,正偶数,负奇数,负偶数以及零的个数。 源代码如下:data segmentbuf db 2bh,4fh,3ah ;+,o,:posod db 0db 0ah,0dh,2bh,45h,3ah ;lf,cr,+,e,:posev db 0db 0ah,0dh,30h,3ah ;lf,cr,0,:zero db 0db 0ah,0dh,2dh,4fh,3ah ;lf,cr,-,o,:negaod db 0db 0ah,0dh,2dh,45h,3ah ;lf,cr,-,e,:negaev db 0num db 72h,88h,91h,01h,00h,00h,23h,77h,21h ;you can add other numberscnt equ $-num ;lenthdata endsstack segment stack stackdb 100 dup (?)stack endscode segmentassume cs:code,ds:data,ss:stackstart proc farpush dsxor ax,axpush axmov ax,datamov ds,axmov cx,0mov bx,0loop1: mov al,numbxcall far ptr cmprinc bxinc cxcmp cx,cnt ;loop cnt timesjnz loop1add posod,30hadd posev,30hadd zero,30hadd negaod,30hadd negaev,30h ;transfer to asc2 codemov ah,02h ;to print charsmov cx,0mov bx,0loop2: mov dl,bufbxint 21hinc bxinc cxcmp cx,1bh ;loop 26 timesjnz loop2mov ax,4c00hint 21hretstart endpcmpr proc farcmp al,0jge biggertest al,01hjnz noddinc negaevjmp exitnodd: inc negaodjmp exitbigger: je equaltest al,01hjnz poddinc posevjmp exitpodd: inc posodjmp exitequal: inc zeroexit: retcmpr endpcode endsend start运行结果:(图三:选做题程序运行结果)根据num中的数据,这个结果是正确的。七、心得体会: 这个实验有两个要点,其实就是两个预习题目里讨论的问题。一是字符显示。要显示数字字符,首先要把数据转换成ascii码,然后调用dos功能将其显示。其中使用09h号功能时,要特别注意每段待输出的字符串要以$结尾,不然无法识别串尾,输出乱码。二是判断正负数。本程序选用cmp指令来实现该功能。注意与0相比时,要使用有符号数的条件跳转指令,jge等等,在使用无符号数的条件跳转指令时,不是与0相比较。判断奇偶同样也有很多途径,这里选择将待判别的数与01h相与后改变的标志位来判断奇偶,用test指令是一个很好的选择。另外,通过这次试验,我对汇编程序的分支、循环结构有了进一步的理解。微机原理与接口技术软件实验实验报告三姓名:杨帆学院:信息与通信工程学号:070547班级:07118实验三 代码转换程序设计 一、实验目的: 1.掌握几种最基本的代码转换方法;2.运用子程序进行程序设计。实验内容:1.从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来;2.两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明;3.对输入要有检错措施,以防止非法字符输入,并有适当的提示;4.将整个程序分解为若干模块,分别用子程序实现.在报告中要给出模块层次图。二、预习题: 1.如何将输入的两个字符(0 - 9)变为十进制或二进制数?答:可以通过将字符的减去30h再乘以10d,加上个位的值(同样要将ascii码减去30h变为十进制数)即可得两个字符的十进制数。2.如何将选出的最小值(二进制或十进制)变为 ascii 码再进行显示?答:选出最小十进制数后可以通过除十得到余数和商,商为高位,余数为低位,分别对这两个加30h即可到得其ascii码。3.你觉得采用二进制运算还是十进制运算更适合于这个实验?答:个人觉得采用二进制运算更简便,这样可以直接使用ascii码比较,使问题简化。三、源程序 data segment buffer db 101 ;为buffer分配空间 db 0 ;buffer实际长度 db 101 dup (0)message db error,try again,0dh,0ah,$ ;错误信息 min dw ?err db 0 ;错误标志寄存器 data endsstack segment stack stackdb 100 dup(?)stack endscode segmentassume cs:code,ds:data,ss:stackcheck proc far ;check子程序 push axpush bxpush cxpush dxlea bx,buffer+2 ;bx指向第一个输入的数 mov cl,buffer+1 ;输入字符串总长度 again: cmp byte ptr bx,30h jl error ;小于30h,出错 cmp byte ptr bx,3ah jg error ;大于3ah,出错 jmp exit1error: mov ah,9mov dx,seg messagemov ds,dxmov dx,offset messageint 21h ;输出错误提示 mov err,1 ;更改错误标志寄存器 jmp exit2exit1: inc bxdec cljnz againexit2: pop dxpop cxpop bxpop axretcheck endpfindmin proc far ;findmin子程序 push axpush bxpush cxpush dxlea bx,buffer+2mov cl,buffer+1inc clmov al,clmov ah,0mov dl,3div dldec almov cl,al ;cl=(length+1)/3-1=n-1,表示比较次数 and cl,cljnz loopl ;不止一个数据 mov dx,bxmov min,dx ;只输入一个数据,直接付给minjmp over loopl: mov dl,bx+3cmp byte ptr bx,dljge there1mov dx,bxmov min,dx ;只比较十位 jmp condithere1: mov dl,bx+3cmp byte ptr bx,dljg there2mov dl,bx+4cmp byte ptr bx+1,dljge there3mov dx,bxmov min,dx ;十位相等,比较个位jmp condithere2: mov dx,bx+3mov min,dx ;只比较十位jmp condithere3: mov dx,bx+3mov min,dx ;前两个数比较,小的存入mincondi: dec cl jnz fin ;判断比较是否完成jmp over fin: mov dl,low min ;比较次数为2或以上时cmp byte ptr bx+6,dl jge here1mov dx,bx+6mov min,dx ;只比较十位(当前数与min比较)jmp here2here1: mov dl,low mincmp byte ptr bx+6,dljg here2mov dl,low min+1cmp byte ptr bx+7,dljge here2mov dx,bx+6mov min,dx ;十位相等,比较个位here2: add bx,3 ;bx指向下一个数jmp condiover: mov ah,2 mov dl,0ahint 21hmov ah,2mov dl,0dhint 21hmov ah,2mov dl,low minint 21hmov ah,2mov dl,low min+1int 21h ;输出min的值,即为最小值pop dxpop cxpop bxpop axretfindmin endpstart proc farmov ax,datamov ds,ax again2: mov err,0mov dx,seg buffermov ds,dxmov dx,offset buffermov ah,0ahint 21hcall checkmov al,errand al,aljz judge ;输入有误,不进行比较jmp again2 ;输入无误,进行比较judge: call findminen: mov ah,4chint 21hstart endpcode endsend start 四、程序流程图(图表一:findmin子程序流程图)(图表二:一次比较流程图)五、实验结果与调试过程运行结果:1只输入一个数据2输入两个数据(冒号“:”为数据分隔符,回车为结束符)3输入三个或以上数据4输入数据有误提示错误,再次输入:六、心得体会:做这个实验的过程中出了一些错误,最开始的代码在运行时输出乱码,这个问题困扰了我很久。后来我通过单步调试,发现是因为调用子程序时没有注意现场保护,几个寄存器被多次赋值,导致结果显示时不仅不能输出正确结果,程序还跑飞了。所以比较和显示时都出现了问题。经过这次实验,我发现汇编编程过程中一定要注意,在子程序调用时要做好现场保护,毕竟汇编不像高级语言,子程序压栈出栈的过程对编程者并不是透明的。微机原理与接口技术软件实验实验报告三姓名:杨帆学院:信息与通信工程学号:070547班级:07118实验三 代码转换程序设计一、实验目的:1.掌握几种最基本的代码转换方法;2.运用子程序进行程序设计。实验内容:1.从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来;2.两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明;3.对输入要有检错措施,以防止非法字符输入,并有适当的提示;4.将整个程序分解为若干模块,分别用子程序实现.在报告中要给出模块层次图。二、预习题:1.如何将输入的两个字符(0 - 9)变为十进制或二进制数?答:可以通过将字符的减去30h再乘以10d,加上个位的值(同样要将ascii码减去30h变为十进制数)即可得两个字符的十进制数。2.如何将选出的最小值(二进制或十进制)变为 ascii 码再进行显示?答:选出最小十进制数后可以通过除十得到余数和商,商为高位,余数为低位,分别对这两个加30h即可到得其ascii码。3.你觉得采用二进制运算还是十进制运算更适合于这个实验?答:个人觉得采用二进制运算更简便,这样可以直接使用ascii码比较,使问题简化。三、源程序data segment buffer db 101 ;为buffer分配空间db 0 ;buffer实际长度db 101 dup (0)message db error,try again,0dh,0ah,$ ;错误信息min dw ?err db 0 ;错误标志寄存器data endsstack segment stack stackdb 100 dup(?)stack endscode segmentassume cs:code,ds:data,ss:stackcheck proc far ;check子程序push axpush bxpush cxpush dxlea bx,buffer+2 ;bx指向第一个输入的数mov cl,buffer+1 ;输入字符串总长度again: cmp byte ptr bx,30h jl error ;小于30h,出错cmp byte ptr bx,3ah jg error ;大于3ah,出错jmp exit1error: mov ah,9mov dx,seg messagemov ds,dxmov dx,offset messageint 21h ;输出错误提示mov err,1 ;更改错误标志寄存器jmp exit2exit1: inc bxdec cljnz againexit2: pop dxpop cxpop bxpop axretcheck endpfindmin proc far ;findmin子程序push axpush bxpush cxpush dxlea bx,buffer+2mov cl,buffer+1inc clmov al,clmov ah,0mov dl,3div dldec almov cl,al ;cl=(length+1)/3-1=n-1,表示比较次数and cl,cljnz loopl ;不止一个数据mov dx,bxmov min,dx ;只输入一个数据,直接付给minjmp over loopl: mov dl,bx+3cmp byte ptr bx,dljge there1mov dx,bxmov min,dx ;只比较十位 jmp condithere1: mov dl,bx+3cmp byte ptr bx,dljg there2mov dl,bx+4cmp byte ptr bx+1,dljge there3mov dx,bxmov min,dx ;十位相等,比较个位jmp condithere2: mov dx,bx+3mov min,dx ;只比较十位jmp condithere3: mov dx
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年公需科目大数据考试所有测试题及答案
- 2025年高危儿培训试题及答案
- 2025年高级维修电工理论知识题库及答案
- 2025年高级会计师之高级会计实务通关题库附带答案
- 交安考试考试题库及答案
- 专职营销人员管理办法
- 中央防洪物资管理办法
- 绩效管理办法公示晚
- 上海疫情存货管理办法
- 不良资产收购管理办法
- 海洋弧菌护理查房
- 2025-2030中国玉米脱粒机行业现状供需分析及市场深度研究发展前景及规划可行性分析研究报告
- 生产精益培训
- 设备保养计划方案(3篇)
- 甲醛治理招标方案(3篇)
- 呼吸机管路设计与应用
- 2025-2030年中国黑胶唱片行业市场现状供需分析及投资评估规划分析研究报告
- 台海形势课件
- 采石场人员管理制度
- 2025医疗机构劳动合同模板
- 牛的健康问题图像识别诊断-洞察阐释
评论
0/150
提交评论