ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:28.89KB ,
资源ID:5264454      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5264454.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(微机实验报告汇总武汉大学物理学院.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

微机实验报告汇总武汉大学物理学院.docx

1、微机实验报告汇总武汉大学物理学院 实验报告一(循环程序的设计) 专业:材料物理; 姓名:曾瑞; 学号:* 1, 实验内容 编程计算:s=1+2+3+6.+n<=100的最大项数n以及对应的和s。 2, 实验要求 将最大项数与和数分别存入n和sum单元,用td调试,运行程序并检查结果; 将结果在屏幕上以16进制数显示。显示格式:max n=xxh sum =xxh。 3,实验目的 学习并掌握循环程序的设计方法。 4,源程序 ;filename:zengrui.asm data segment n db? ;开辟一个字节单元 mesg1 dbmax n=,30h,30h,h,$ sum db

2、? mesg2 dbsum =,30h,30h,h,$ data ends code segment asume cs:code,ds:data ;段分配 begin: mov ax,data ;段基址ds mov ds,ax mov bl,0 ;给bl和al赋初始值0 mov al,0 count: incbl add al,bl cmp al,100 jbecount ;无符号数<=跳转 subal,bl ;所得al大于100,故要减去bl decbl ;bl的前一位才是最大项 mov n,bl ;最大项数n单元 mov sum,al ;和数sum单元 mov bx,offset n

3、 call n2_16 ;调用过程n2_16 mov bx,offset sumcall n2_16 mov ah,9 ;9号功能调用,输出字符串mov dx,offset mesg1int 21h mov ah,02h;2号功能调用,输出两个空格mov dl,00hint 21hmov ah,02hmov dl,00hint 21h mov ah,9 ;9号功能调用,输出字符串 mov dx,offset mesg2 int21h mov ah,4ch;返回dos操作系统int21h n2_16 proc nexti: cmp byte ptr bx,16;存储单元与16比较 jc next

4、2 ;小于16转 sub byte ptr bx,16;否则,减去16 inc byte ptr bx+7 ;高位加一 jmp next1 next2: mov ah,byte ptr bx cmp ah,10 ;与10比较 jc next3 ;小于10转 mov ch,7 ;否则,加7 add ah,ch next3: add byte ptr bx+8,ah ;生成低位数 ret endp code ends end begin 5,实验结果及分析 实验结果显示为:max n=0dh sum =5bh。经过验证,其结果是正确的。 需要说明的有以下几点: 本程序还可以进一步简化。比如,对于空

5、格的输出,在本程序中两次调用了2号功能,当然,也可以直接在输出字符串时中直接输出。例如,直接在data segment 中mesg1 dbmax n=,30h,30h,h,$修改为mesg1 dbmax n=,30h,30h,h,00h,00h,$,就可以做到这点; 在设计源程序时,本人对结果输出稍微改变了一下。实验要求是max n=xxh sum =xxh,最终结果显示为:max n=0dh sum =5bh。可以看出,字符串sum后面多了一个空格。之所以这样做,是因为这样方便调用过程n2_16,其好处是简化了程序; 由于实验要求sum<=100,因而在输出显示16进制数时,不用考虑其

6、高位数大于10的情况。所以,在设计程序时,为了简化,只是对低位数的情况进行了一次比较判断。至于为什么在低位数大于等于10时,需要加7?原因是这样的,即我们最终的结果都是用ascii码来显示的,16进制低位如a对应着ascii码41h,如果所得结果不加7,则ascii码为3ah,则对应的是:,其记过是错误的; 对于2进制向16进制的转换,其方法不是唯一的,有很多种。本实验设计的源程序属于比较初级的一种,其思路是通过不断减16,来获取高位数。另外一个思路是:通过除法运算得商取余。当然,也可以利用2进制与16进制的特殊关系,通过与运算0f0h,结果右移四位,得到高四位;通过与0fh运算,得到低四位,

7、最后存入相应的存储单元。其过程如下: n2_16 proc mov al,byte ptr bxmov ah,al and al,0f0h ;与运算,al低四位清0 mov cl,4 ;右移四位,得高四位数shr al,clcmp al,10jc next1add al,7 next1: add byte ptr bx+7,al and ah,0fh ;与运算,ah高四位清0,得低cmp ah,10; 四位数jc next2add ah,7 next2: add byte ptr bx+8,ahretendp 注意:以上过程增加了对16进制高位数的判断 实验报告二(分支程序的设计) 专业:材料

8、物理; 姓名:曾瑞; 学号:2011301230019 1,实验内容 显示月份名direct; 2,实验要求 试编写一程序,根据用户键入的月份数在屏上显示该月份的英文缩写名; 提示: (1) 用跳跃表法实现多个分支转移。可建立一个月份缩写表: montab db jan , feb , mar , apr , may , jun db jul , aug , sep , oct , nov , dec (2) 用户给定的月份数与其对应的英文缩写表格地址为: montab + (月份数-1) * 3 注意:用户键入的月份数是ascii码,必须先转换为数字才能用以上公式计算; 3,实验目的 学习分

9、支程序的结构,掌握具有分支结构程序的设计方法; 4,源程序 ;filename zengrui.asm data segment mesg1 db please input the number for month,0dh,0ah,$ mesg2 db error!,0dh,0ah,$ num db 3 count db ? ;字符串的个数 store db 2 dup(?);用于存放输入的字符串 montab db jan , feb , mar , apr , may , jun;月份表 db jul , aug , sep , oct , nov , dec month db 3 dup

10、(?),0dh,0ah,$ ;暂时存放待显示的月份data ends code segment assume cs:code,ds:data start: mov ax,data mov ds,ax mov es,ax ;使es与ds指向同一段 mov dx,offset mesg1 ;输出提示信息 mov ah,09h int 21hmov dx,offset num ;输入字符串 mov ah,0ah int 21h cmp count,0 ;输入字符个数与0比较 jzexit ;等于0跳转 cmp count,2 jznext mov xor mov jmp next: mov mov

11、xor cmp jz cmp jnz sub add goon: cmp jz cmp jadec mov mul lea add lea mov cld rep disp: mov mov al,store al,30h ah,0 goon ah,store al,store+1 ax,3030hah,0 goon ah,1 last ah,ah al,10 al,0 last al,12 last al bl,3 bl si,montab si,ax di,month cx,3 movsb dx,offset month ah,09h ;将ascii码转换成十进制 ;ah置零 ; 将asc

12、ii码转换成十进制 ;ah为0跳转 ;若ah不为1,则跳转 ;将输入的ascii完全转化为 ;十进制数 ;若输入数为0,则跳转 ;若输入数大于12,则跳转 ;偏移值存放于al中 ;得到源的偏移地址 ;控制位寄存器df清零 ;无条件重复传递字符串int 21h;显示出对应的月份 jmp start;返回到开始 last: mov dx,offset mesg2 ;提示出错error mov ah,09h int21h jmp start exit: mov ah,4ch;无输入,则返回 int21hcode ends end start 5,实验结果及分析 实验结果及分析主要有以下几点: 按照以

13、上的源程序,实验结果比较理想。用户可以通过输入一位或者两位字符来查询月份,而且比如:输入9与输入09的效果是一样的;对于输入的数等于0,大于12或者为其他字符,则在屏幕上显示error,提示所输入内容是不合法。所以,本程序是正确的,功能符合要求,已经通过了实践的检验; 需要说明的是,在本程序中对于输出相应的月份,是通过首先在数据段中定义一个变量,用于存放待显示的月份,这是一种间接的做法。其实,更为直接的做法为:在建立月份表时,可以直接在每个月份缩写后加0dh,0ah,$,即为jan , 0dh,0ah,$?,这样用户给定的月份数与其对应的英文缩写表格地址为:montab + (月份数-1) *

14、 6。通过这种方法,可以不用通过字符串传递,就可实现月份的输出。但是,在定义中比较冗长,所以本程序没有采用这种方法; 对于将ascii码转换成十进制数,本程序采用的是通过异或,成功实现转换,当然,也可以通过将源操作数减去30h得到相应的数,其效果是一样的。另外,在对于判断所输入数是否有效时,并没有从一开始就进行判断,而是在通过一系列操作,得到al中存放的数,比较其值与0和12的大小,对于超出其范围的,则是无效的数,立即跳转。由于程序设计得比较严谨,不会出现输入一个无效数而显示出月份的情况; 从开头处可以看到,我使es与ds指向同一段,是因为在前面的定义中没有出现附加段的定义,后面的字符串的传递

15、是在同一数据段中进行的。如果,字符串的传递不是在同一段中进行,那么es和ds的指向是不同的,而且在要显示出附加段中的字符串时还必须对ds中的数据进行压栈;实验报告三(子程序结构的设计方法) 专业:材料物理; 姓名:曾瑞; 学号:2011301230019 1,实验内容 编程计算n!,从键盘上接受10以内的数,计算出其阶乘后在屏幕显示结果; 2,实验要求 用子程序编写计算n!的代码以及结果显示代码; 3,实验目的 学习子程序结构,了解子程序的调用、返回的过程,掌握其编程的方法; 4,程序流程图 5,源程序 ;filename zeng.asmdata segment mesg1 db pleas

16、e input a number between 0 and 9,0dh,0ah,$ mesg2 db error message!,0dh,0ah,$ mesg3 db !=,$ store dw ? data ends stack segment db 256 dup(?) stack ends code segment assume cs:code,ds:data,ss:stack main proc far start: mov ax,datamov ds,ax mov dx,offset mesg1;输出提示语句mov ah,09hint 21h mov ah,1int 21h cm

17、p al,20h jzexit xor al,30h cmp al,0 jnz next inc al next: cmp al,9 ja errorpush ax lea dx,mesg3mov ah,09hint 21h pop ax call calculcall printcall crlfjmp start error: mov dx,offset mesg2 mov ah,09hint 21hjmp start exit: mov ah,4chint 21h main endp calcul proc mov ah,0 mov cx,ax mov al,1mov dx,0mov b

18、x,0 again: inc bx ;键盘输入一个字符并回显 ;如果输入的是空格,则返回 ;将ascii码转换成二进制数 ;将al中数与0比较 ;若为0,则加一 ;与9进行比较 ;若大于9,则跳转 ;将ax中内容堆栈,保护输入数;输出提示信息,提醒输入有误 ;cx存放输入的数字 ;将ax初始值赋1mul bx cmp bx,cx jnz again ;若bx小于cx,则循环执行ret calcul endp print proc mov cx,0 cmp dx,0;将dx中内容与0比较 jz then mov bx,10div bx push dx inc cx then: mov dx,0

19、mov store,ax mov bx,10div bx push dx inc cx cmp dx,store jnz then display: pop dx add dl,30h mov ah,2 int 21h loop display ret print endp crlf proc mov dl,0dh mov ah,2 int 21h mov dl,0ah mov ah,2 int 21h ret crlf endp code ends end main ;store是个字单元,在数据段已 ;有定义 ;将余数堆栈 ;cx当计数器,存放堆栈的次数 ;若余数与被除数不等,继续循环 ;

20、出栈,把数据赋给dx ;dl存放欲显示数的ascii码 ;显示回车与换行 5,实验结果及分析 (1)程序运行结果如下: please input a number between 0 and 9 0!=1 please input a number between 0 and 9 1!=1 please input a number between 0 and 9 2!=2 please input a number between 0 and 9 3!=6 please input a number between 0 and 9 4!=24 please input a number be

21、tween 0 and 9 5!=120 please input a number between 0 and 9 6!=720 please input a number between 0 and 9 7!=5040 please input a number between 0 and 9 8!=40320 please input a number between 0 and 9 9!=362880 please input a number between 0 and 9 h error message! 注意:当输入其他字符时,比如h,则显示error message! (2)需

22、要说明的有以下几点: 用int 21h指令执行功能调用会影响ax中的数据,因此在调用前必须将ax中的数据进行堆栈操作。在本实验中遇到的问题之一即在此:由于在之前没有将ax中的数据进行堆栈保护,运用int 21h功能后,al变成了24h,结果最后所有的输出都变成了0; 实验过程中遇见的另外一个问题是,1-8的阶乘都显示正常,只有9的阶乘有问题,显示为35200。原因是先前的循环体部分是: again: mul cx loop again 其运行方式为cx减1后参与乘法运算,这种方式对于1-8的阶乘计算没有问题,因为8!=4032065535,而当9*8*?*3=18144065535,此时dx存

23、放了0002h,ax存放了c4c0h;对ax做乘法运算(乘以2)后,dx位存放0001h,ax存放8980h;对ax做乘法运算(乘以1)后,dx位为0000h,ax为8980h,因此结果为35200。为了避免出现上述的情况,将运行方式改为1*2*3?*9的方式,即递增的方式,当1*2*3?*9时,dx存放0005h,ax存放8980h,因此最终结果才为362880; 在本程序print过程中采用了循环除10的方法,获得各位整数,而且采用了堆栈-出栈的方式,实现了高位到低位数的输出。这不仅比采用除10000,再除1000,?的方法在程序上要简洁,而且输出结果也要简洁,比如前者6!=720,后者的

24、6!=00720。 实验报告四(图形方式程序设计基础) 专业:材料物理; 姓名:曾瑞; 学号:2011301230019 1,实验内容 动态画圆球; 2,实验要求 在屏幕中央画一个逐渐膨胀的或者逐渐收缩的实心圆; 3,实验目的 熟悉对图形方式下的程序设计的一些基本技巧,掌握对bios功能的调用; 4,程序的流程图 5,源程序 ;filename zz.asm write macro x,y1,y2 local ll,first mov cx,x ;列值cx mov al,color ;设置像素值 mov bh,0 mov dx,y1 ;行值dx jmpfirst ll: incdx first

25、: mov ah,0chint 10h cmpdx,y2 jnz ll endm data segment r db ? r2 dw ? a db ? a2 dw ? h dw ? yy dw 240 xx dw 320 color equ14 right dw ? left dw ? up dw ? down dw ? count db ? data ends code segment assume cs:code,ds:data start: mov ax ,data mov ds,ax mov r,1 mov count,100 call screen last: call draw c

26、all delay incr dec count jnzlast waitin: mov ah,1 ;行值加一 ;写像点 ;存放半径r的平方 ;存放横轴坐标值a的平方 ;存放纵轴坐标值 ;原点的行值和列值 ;像素值,对应黄色 ;计数器,画圆次数 ;半径值初始赋1 ;半径加一 ;程序暂停,等待键入 int21h mov ax,2 ;恢复8025黑白文本方式 int10h mov ah,4ch int21h ;返回dos calcul proc ;子程序,计算?= r mov al,amul al mov a2,ax mov al,r mul alsub ax,a2 mov cx,0 last1:

27、 mov dx,cx add dx,dx incdxsub ax,dx jc exit1 inccxjmp last1 exit1: mov h,cx ret calcul endp delay proc mov ah,86hmov cx,0 mov dx,10000int 15hret delay endp draw proc mov a,0again: call calcul mov ch,0 mov cl,a add cx,xx mov right,cx mov ch,0 mov cl,a negcx addcx,xx ;计算a2 ;计算r2 ;ax存放r2?a2 ;得到一个偶数2k ;

28、奇数2k+1 ;若有借位,跳转 ;cx中的值即为h的近似值 ;延时10ms ;得到右半圆像点列值movleft,cx ;得左半圆像点列值movdx,hadd dx,yy movdown,dx ;得下半圆像点行值movdx,hneg dxadd dx,yy movup,dx ;得上半圆像点行值write left,up,down ;宏调用,画左半圆write right,up,down ;宏调用,画右半圆inc amoval,r cmpa,al;比较a与半径的大小jnz againret draw endp code ends end start 6,实验结果及分析 (1)实验结果:在运行程序中

29、,可以看到黑色的显示屏中央出现一个黄色的 小圆,然后小圆不断变大,经过大约两分钟,圆球停止生长。键入任意键,就可以返回到dos。 (2)结果分析如下: 本实验程序的设计思路是通过从左到右画弦的方式,得到实心圆;然后 通过增大每次画圆的半径,加上延时,来显示不断增大的圆球的效果。由于每次画圆的操作较多,用时比较长,所以可以明显地观察到从左到右画圆的动作。严格地来说,用此种方式画的圆球的动态效果不是特别理想,因为其与真正的膨胀本质还是有很大的区别,真正的膨胀沿径向生长。所以,比较理想的设计方案是通过不断画圈的方式。但是此处又有一个问题,那就是圈与圈之间会有空隙,这将会导致得到的实心球上会有许多稀疏

30、点,影响效果; 对于行值的计算,运用到了勾股定理,即?= r。特别是对于开根号的计算,其基本原理是1+3+5+?+(2k+1) =k2;当然,也可以直接将给定值c的平方与 h2 进行比较,若c的平方小于h2,则c加一,继续循环,最终得到h的近似值; 在本每次画圆都将之前画的圆覆盖,没有利用之前的已有的圆,使得程 序的执行时间较长,但由于延迟时间有一定限制,所以这样可以更明显的显示出动态过程;每次将画圆时都将前一次圆的边界保存,画弦时只需要将原弦加长,就可以实现这一想法。 实验报告五(可编程定时器/计数器(8253) 专业:材料物理; 姓名:曾瑞; 学号:2011301230019 一、实验目的

31、 1)学会8253芯片和微机接口原理和方法。 2)掌握8253定时器/计数器的基本工作原理、工作方式和编程原理。 二、实验内容 按图6虚线连接电路,将计数器0设置为方式0,计数器初值为n(n0fh),用手动逐个输入单脉冲,编程使计数值在屏幕上显示,并同时用逻辑笔观察out0电平变化(当输入n+1个脉冲后out0变高电平)。 图 6 三、程序的流程图 四、源程序 ;filename zzz.asm code segment assume cs:code start: mov al,10h ;控制字:通道0,只读低字节 mov dx,0cb03h ;控制口 out dx,al ;写入控制字 mov dx,0cb00h ;计数器0 mov al,0fh ;预置计数值n=15

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1