微机原理与应用课程实验报告.doc

上传人:精*** 文档编号:1164490 上传时间:2024-12-31 格式:DOC 页数:35 大小:689.07KB
下载 相关 举报
微机原理与应用课程实验报告.doc_第1页
第1页 / 共35页
微机原理与应用课程实验报告.doc_第2页
第2页 / 共35页
微机原理与应用课程实验报告.doc_第3页
第3页 / 共35页
微机原理与应用课程实验报告.doc_第4页
第4页 / 共35页
微机原理与应用课程实验报告.doc_第5页
第5页 / 共35页
点击查看更多>>
资源描述

1、2014-2015秋学期微机原理与应用课程实验报告 实验分工:报告人(签名) 姓名: 学号: 班级:同组人(签名) 姓名: 学号: 班级: 实验时间:微机原理与应用课程设计报告一、设计目的1熟悉emu8086的使用方法。2掌握汇编语言设计和调试方法。3. 提高编程设计能力,掌握结构化编程的方法。二、课程设计任务及其分析、流程图、代码本课程设计采用自上而下的结构化编程方法,将整个课程设计分为5个任务,并将第4、5个任务都分成第一步和第二步,依次完成这些任务。先对DS、ES等初始化,再给这5个任务编写5个子程序,其中第4、5个子程序又分成两步。最后,返回DOS系统,程序结束。流程图:代码: tit

2、le 1104520121陈冬冬_课程设计源程序page 60,132 .model small .stack 64 .data .codemain proc far mov ax,0100h mov ds,ax mov es,ax call sub1 call sub2 call sub3 call sub4 call sub5 mov ax,4ch int 21h;返回dos系统main endp (二)每个设计任务及其分析、流程图、代码1. 在数据段首址为0100H开始的内存区1按从大到小的顺序顺次存入二进制数150共16个字节的数据;分析:任务1要求将150共16个字节的数据存入首址为

3、0100H的内存区1。首先,将内存区1的首址赋给数据段地址偏移寄存器SI。显然,不能将立即数一个一个立即数存入内存区1,这样在编程上是不现实的。所以,我先用一个寄存器AL来存放这些数,再将AL的值存入内存区1。可以先给AL赋值15,然后存入内存区1,以后每次AL自减1,内存区地址加1,这样就用少量代码实现了任务1。流程图:开始初始化目标内存区首址SI=0100H循环次数CX=0100H初始化将要赋值的寄存器AL=000FH目标单元赋值目标内存区SISI-1要赋的值ALAL-1 NCXCX-1CX=0? Y结束代码: mov si,0100h;内存区1的偏移地址 mov cx,0010h;循环次

4、数,十进制数为16 mov al,0fh;将要赋的值150放在al中intram: mov si,al inc si dec al;每循环一次,地址加1,数据减1loop intram 2. 将上述源区内容传送到目的内存区2(首址为1100H)中;分析:任务2要求将内存区1的内容传送到内存区2中。这个功能实现起来非常简单,与我们在微机原理实验中做过的内容相似,只要将源内存区首址赋给SI,目的区首址赋给DI,定义循环次数即可。由于内存之间不能直接传送数据,通过一个寄存器AL过渡,每次传送数据后,SI和DI都自增1,即可将源区内容传送到目的区。代码: mov si,0100h;源区首地址 mov

5、cx,0010h;循环次数,十进制数为16 mov di,1100h;目的区首地址spr: mov al,si mov di,al;因内存区数据之间不能直接传送,所以使用al作为过渡 inc si inc diloop spr 但是,做到这一步时,我又想到老师在微机原理实验之后的课程中讲到的串操作指令,这些指令是用于完成一串数据的操作的。其中的MOVSB,正是实现数据传送功能的。于是,我又复习了一下串操作指令的用法,将上面的代码进行了优化。这个方法要注意的是,要先使用指令CLD,这样才能使串操作时指针自动加1,不会产生地址错误。优化后的代码显然短了很多,也减少了程序员编程的压力。流程图:循环次

6、数CX=0010H 串操作REP MOVSB 结束优化后的代码: cld ;df置0,串操作时指针自动增加 mov si,0100h;源区首地址 mov di,1100h;目的区首地址 mov cx,0010h;循环次数,十进制数为16 rep movsb;使用串指令传送数据,减少代码长度,使代码更加优化 3. 检验上述传送过程是否正确,如有错误,在紧跟内存区2后的第一个字节开始写入ASCII码“ERROR”,否则写入“OK”。分析:(1)检验上述传送过程是否正确,有两个方法,一是将内存区2的内容直接与150这16个数据相比较;二是将内存区2的内容与内存区1的内容相比较。首先,我采用了第一个方

7、法,具体实现方法与任务1类似,即用一个寄存器AL来存放这些数,再将AL的值与内存区2的内容相比较。可以先给AL赋值15,然后与内存区2的内容相比较,以后每次AL自减1,内存区地址加1。后来,我又想到了老师上课讲的关于串操作指令中一个检验单词“EUROPE”是否拼错的例题。那个例题中用到了串操作比较指令CMPSB。复习了这个指令之后,我发现,CMPSB只能用于两个内存区内容之间的比较。于是,为了优化代码,我又用了上述的第二种方法,即将内存区2的内容与内存区1的内容相比较。这样,代码长度又明显减少了。(2)如有错误,在紧跟内存区2后的第一个字节开始写入ASCII码“ERROR”,否则写入“OK”。

8、由于一个字符占用一个字节内存地址,因此,在实现这个功能时,就必须一个字符一个字符地存入指定内存区。需要注意的是,传送过程正确和错误时存入的字符个数不同,这样就导致当所有字符都存好之后内存区2的末尾地址不同。而可以看到,任务5中还是要用到内存区2末尾地址,因此,在这里就应该将这个地址保存起来。 注意:这里增加了在传送数据出错时记录出错的那个数的地址的功能。流程图:将出错的数的地址及字符串ERROR赋值到内存区2的末尾SI=DI?串操作REP CMPSB循环次数为CX=0010H初始化目标内存区2首址为DI=1100H初始化源内存区1首址为SI=0100HCLD(串操作时指针自动增加)开始 N Y

9、将字符串OK赋值到内存区2的末尾结束代码: mov si,0100h;源区首地址 mov di,1100h;内存区2的首地址 mov cx,0010h;循环次数,十进制数为16 repe cmpsb ;使用串指令比较数据,更加方便 je exit;若传送过程正确,跳到exit,在在紧跟内存区2后的第一个字节开始写入ASCII码“OK”,否则写入“ERROR” mov di,1110h mov di,si;记录出错的那个数的地址 mov di,E inc di mov di,R inc di mov di,R inc di mov di,O inc di mov di,R mov dx,di;记

10、录di的值,即现在内存区2的末尾,后面要用到 jmp task4exit: mov di,1110h mov di,O inc di mov di,K mov dx,di;记录di的值,即现在内存区2的末尾,后面要用到 jmp task4 4. 用冒泡法将上述内存区2的数据,按从小到大的次序重新排列,排列后存放在内存区3(开始地址为2100H)。分析:要想实现任务4,应该是先将内存区2的数据传送到内存区3,对内存区3中的数据进行排序。(1)传送数据,和任务2相同,这里不再赘述。(2)对内存区3中的数据进行排序,由于在微机原理实验中做过这个实验,并且当时已将每一轮排序的结果都列举出来。因此,我对

11、冒泡法排序已经有了足够的认识,这里也不再赘述。代码: ;第一步:先将内存区2的数据传送到内存区3中task4: mov si,1100h;源区首地址 mov di,2100h;目的区首地址 mov cx,0010h;循环次数,十进制数为16 rep movsb;与任务2一样,使用串指令传送数据;第二步:排序start: mov bl,0 ;用于记录一轮比较中,是否冒泡,若是,记为1 mov cx,0010h;循环次数 mov di,2100h add di,cx dec di;内存区3的末尾 dec cx;真正的循环次数应该是数据个数减1 again: mov al,di cmp al,di-

12、1 jae next xchg al,di-1 mov di,al mov bl,1next: dec di loop again cmp bl,0 jne start 5. 将上述内存区2和内存区3的第10个数据分别乘以2,并转为压缩BCD码,保存在各自存储区的末尾。再将上述两个BCD码相乘,其结果保存在内存区1的末尾处。 分析:这个任务相对复杂,为了能更清楚地理解这个任务,我将它分为两步。(1)将内存区2和内存区3的第10个数据分别乘以2,再将这两个数据转化为压缩BCD码,保存在各自存储区的末尾。内存区2的第10个数据是6,内存区3的第10个数据是9,乘以2后,就是12和18。而计算机中存

13、放的是它们的16进制数,即CH和12H,那么如何将它们转化成压缩BCD码呢?所谓压缩BCD码,就是用半个字节来表示一个十进制位。因为后面还要将CH和12H相乘,所以在得到16进制数时,先将它们保存在各自内存区的末尾,那么CH中的C存在地址1112H。那么所采取的算法就是将C除以10,商1,存入1113H中;余数2,将商左移4位,再和余数相或,便得到压缩BCD码的12,存入地址1114H中。我们可以看到,对内存区2和内存3的第10个数据的操作是相同的。因此,我首先想到了使用循环的方法。但是,循环要多次从这一行代码跳到另一行,同时为了使代码长度缩短和使整个程序呈现方法的多样性,我又采用了调用子程序

14、的方法。(1)的流程图:子程序TOBCD开始乘以2,结果保存在AX中DX中为压缩BCD码的十位和个位,除以10,AL中为十位,DL中为个位。将AL保存在内存区2或3 的末尾内存区2的第10个数据赋值到寄存器AL中调用子程序TOBCDAL左移4位,与DL相或,AL中即为压缩BCD码的十位和个位,保存在内存区2或者3的末尾内存区3的第10个数据赋值到寄存器AL中调用子程序TOBCD返回主程序结束(2)获取这两个数,相乘,其结果保存在内存区1的末尾处。获取这两个16进制数(CH和12H),一个存入AX中,一个存入BX中,相乘,结果在DX、AX中(对于为何要用到DX,见报告最后的“注”),再分别将DX

15、和AX存入内存区1的末尾。综上,任务结束返回DOS系统。(2)的流程图: (1)和(2)的总代码如下: 第一步:先将内存区2的数据传送到内存区3中task4: mov si,1100h;源区首地址 mov di,2100h;目的区首地址 mov cx,0010h;循环次数,十进制数为16 rep movsb;与任务2一样,使用串指令传送数据;第二步:排序start: mov bl,0 ;用于记录一轮比较中,是否冒泡,若是,记为1 mov cx,10h;循环次数 mov di,2100h add di,cx dec di;内存区3的末尾 dec cx again: mov al,di cmp a

16、l,di-1 jae next xchg al,di-1 mov di,al mov bl,1next: dec di loop again cmp bl,0 jne start mov di,dx;任务3中记录的内存区2的末尾处的地址 mov si,1109h mov al,si;取出内存区2第10个数于al中 mov si,di;内存区2的末尾处 call tobcd mov si,2109h mov al,si mov si,210fh;内存区3的末尾处 call tobcd ;第二步:获取这两个数,相乘,其结果保存在内存区1的末尾处 mov ah,di+1;内存区2的末尾处,即12 m

17、ov cl,4 shr ah,cl mov al,ah mov dl,10 mul dl mov dl,di+1 and dl,0fh add al,dl mov bl,al mov si,2110h;内存区3的末尾处,即18 mov ah,si mov cl,4 shr ah,cl mov al,ah mov dl,10 mul dl mov dl,2110h and dl,0fh add al,dl mul bl mov 0110h,ax mov 0202h,dx;相乘后保存在dxax中,再传送到内存区1的末尾处 noptobcd proc;转换成压缩bcd码的子程序 mov dl,2 m

18、ul dl ;6乘以2为12(ch)或9乘以2为18(12h),保存在ax中 mov dx,0 ;除法须清零 mov bx,10 div bx mov ah,dl mov cl,4 shl al,cl or al,dl mov si+1,al ret ;返回主程序Tobcd endp 三、结果及其分析1. 内存区1:从上面的截图可以看到,内存区1从0100H开始到010FH依次存放了15-0这16个字节的数据。完全符合任务1的要求。2. 内存区2:从上面的截图可以看到,内存区2从1100H开始到110FH依次存放了150这16个字节的数据。说明从内存区1到内存区2的数据传送过程完全正确。3.

19、内存区2的末尾:从上面的截图可以看到,由于传送数据过程完全正确,内存区2末尾110FH和1110H处分别存放了字符O和字符K的ASCII码4FH和4BH。完全符合任务3的要求。4. 内存区3:从上面的截图可以看到,内存区3中从2100H开始到210F依次存放了015这16个字节的数据。显然,从内存区2传送到内存区3的数据150已经通过冒泡法,按从小到大的次序重新排列好了。完全符合任务4的要求。5. 内存区2的末尾:内存区3的末尾:内存区1的末尾:从截图中,可以看出,所做设计完全符合相关要求。四、设计总结与思考 开始看到老师的设计要求的时候,觉得这个程序应该并不难,里面的冒泡法排序,将数据传送到

20、指定的内存区,以及BCD码相乘等,前面的实验中都有接触,所以在实验中没有遇到什么大问题。但是也有一些小问题,比如忘了加入进位,标志位会因某一句语句的变化而变化等。不管怎么说,老师安排的实验和课程设计都在一定程度上强化了我的理论知识,并且让我对汇编语言产生了更多兴趣。不过由于自身的能力限制,我的程序有很多不足之处,也请老师给予指正。五、 附完整课程设计程序page 60,132 .model small .stack 64 .data .codemain proc far mov ax,0100h mov ds,ax mov es,ax mov si,0100h;内存区1的偏移地址 mov cx

21、,0010h;循环次数,十进制数为16 mov al,0fh;将要赋的值150放在al中intram: mov si,al inc si dec al;每循环一次,地址加1,数据减1loop intram cld ;df置0,串操作时指针自动增加 mov si,0100h;源区首地址 mov di,1100h;目的区首地址 mov cx,0010h;循环次数,十进制数为16 rep movsb;使用串指令传送数据,减少代码长度,使代码更加优化 mov si,0100h;源区首地址 mov di,1100h;内存区2的首地址 mov cx,0010h;循环次数,十进制数为16 repe cmps

22、b ;使用串指令比较数据,更加方便 je exit;若传送过程正确,跳到exit,在在紧跟内存区2后的第一个字节开始写入ascii码“ok”,否则写入“error” mov di,1110h ;mov di,si;记录出错的那个数的地址 mov di,e inc di mov di,r inc di mov di,r inc di mov di,o inc di mov di,r mov dx,di;记录di的值,即现在内存区2的末尾,后面要用到 jmp task4exit: mov di,1110h mov di,o inc di mov di,k mov dx,di;记录di的值,即现在内

23、存区2的末尾,后面要用到 jmp task4;第一步:先将内存区2的数据传送到内存区3中task4: mov si,1100h;源区首地址 mov di,2100h;目的区首地址 mov cx,0010h;循环次数,十进制数为16 rep movsb;与任务2一样,使用串指令传送数据;第二步:排序start: mov bl,0 ;用于记录一轮比较中,是否冒泡,若是,记为1 mov cx,10h;循环次数 mov di,2100h add di,cx dec di;内存区3的末尾 dec cx again: mov al,di cmp al,di-1 jae next xchg al,di-1

24、mov di,al mov bl,1next: dec di loop again cmp bl,0 jne start mov di,dx;任务3中记录的内存区2的末尾处的地址 mov si,1109h mov al,si;取出内存区2第10个数于al中 mov si,di;内存区2的末尾处 call tobcd mov si,2109h mov al,si mov si,210fh;内存区3的末尾处 call tobcd ;第二步:获取这两个数,相乘,其结果保存在内存区1的末尾处 mov ah,di+1;内存区2的末尾处,即12 mov cl,4 shr ah,cl mov al,ah m

25、ov dl,10 mul dl mov dl,di+1 and dl,0fh add al,dl mov bl,al mov si,2110h;内存区3的末尾处,即18 mov ah,si mov cl,4 shr ah,cl mov al,ah mov dl,10 mul dl mov dl,2110h and dl,0fh add al,dl mul bl mov 0110h,ax ;mov 0202h,dx;相乘后保存在dxax中,再传送到内存区1的末尾处 noptobcd proc;转换成压缩bcd码的子程序 mov dl,2 mul dl ;6乘以2为12(ch)或9乘以2为18(1

26、2h),保存在ax中 mov dx,0 ;除法须清零 mov bx,10 div bx mov ah,dl mov cl,4 shl al,cl or al,dl mov si+1,al ret ;返回主程序tobcd endp微机原理与应用实验报告实验一 汇编语言程序基本操作 一、实验目的1熟悉EL微机实验系统的操作。2掌握汇编语言设计和调试方法 。二、实验内容1. 把2000H-20FFH的内容清零。2. 把源RAM区(首址为2200H)内100H个字节的数据,传送到目的RAM区(首址为2000H)。三、实验程序框图 1. 清零程序框图2. 数据传送程序框图四、实验步骤1EL微机实验系统与

27、PC机联机 (1) 打开EL微机实验系统电源,初始化后,数码管显示“P_”,表示实验系统处于下位键盘监控状态。 (2) 在PC机处于在Windows软件平台下,单击EL86图标,根据屏幕提示进行联机操作,实验系统数码管显示“C_”,表示实验系统处于上位PC机监控状态。2. 编辑程序选择“新建”菜单,编辑新程序。(编辑新程序注意:在org 100h的下一行,必须写标号start.)3. 编译程序 编译并连接程序,信息窗口显示“程序下传正确”,表示编译、连接成功。如果显示“程序下传不正确”,则应选择“运行”菜单中“系统复位”操作,然后重新进行编译、连接。4. 运行程序在“运行”菜单中可选择多种手段

28、进行调试运行。建议设立断点后再运行程序。5. 检查运行结果在内存窗口检查运行结果。修改内存地址时,将光标移动到内存显示区的头部,右击鼠标,在弹出菜单选择修改内存地址,即弹出地址输入窗口,输入相应的地址即可。 在清零程序结束处设置断点,运行程序后,将内存地址设置为2000H,检查2000H-20FFH的内容 在nop指令处(即数据传送功能完成后)设置断点,运行程序后,还是将内存地址设置为2000H,检查2000H-20FFH的内容五、 程序代码code segmentassume cs:codeorg 0100h ;清零程序start:mov ax,0100hmov ds,ax ;数据段地址mo

29、v es,axmov si,2000h ;偏移地址mov cx,0100h ;循环次数mov al,0CLEAR:mov si,al inc siloop CLEAR; mov si,2200h ; RAM源数据地址mov di,2000h ;目的数据地址mov cx,100hCLDREP MOVSB ;串传送指令nop ;code endsend start六、实验结果完成实验步骤时,可以观察到实验结果如下:在清零程序结束处设置断点,运行程序后,将内存地址设置为2000H,看到2000H-20FFH的内容均为0。在nop指令处设置断点,运行程序后,还是将内存地址设置为2000H,发现 200

30、0H-20FFH的内容变为了CCDD,如下面的截图所示:六、程序调试过程中出现的问题与解决方法 传送数据时用了这条语句mov di,si,调试时出错。原因是一条语句中不能有两个内存中的数据解决方法:将上述语句改为mov ax,si mov di,ax由于对程序语言掌握不是很好,所以这个看似简单的程序一开始其实对我有着很大的困扰。后来按照老师说的,通过逐行执行和查看运行结果,我渐渐了解到每行语句的含义和用法。而在自己编写程序的过程中,对于程序的清零部分,老师用了直接赋值并循环100次,我觉得用同一个指针变量自身相异或并自加也可以实现同样的效果,但是程序运行后却出错,所以后来还是用了老师的思路。而

31、在将字节传送到目的RAM区的程序编写中,我找到了一个比较简便的语句:REP MOVSB,可以实现RAM区循环置数的功能,节省了程序量。实验二 排序实验一、实验目的掌握多重循环设计及调试方法。二、实验内容编写并调试一个排序子程序,其功能为用冒泡法将16个无符号的正整数,按从小到大的次序重新排列。三、实验程序框图YYNNY开始清交换标志、置数组长度、变址值初始化取si修改变址值交换内容,置标志位CX比较次数sisi-2?比较完否?N交换标志为零?结束四、实验步骤 1. 在RAM区2000H一201FH中放人不等的数据。2. 编辑程序3 编译、连接程序4. 在程序中检查交换标志语句前设立断点后再运行

32、程序。5 在内存窗口检查运行结果,并记录。地址初始状态第1遍扫描第2遍扫描第3遍扫描第4遍扫描第5遍扫描第6遍扫描第7遍扫描20000f011h0011h0011h0011h0011h0011h0011h0011h20020e011h0f011h1011h1011h1011h1011h1011h1011h20040d011h0e011h0f011h2011h2011h2011h2011h2011h20060c011h0d011h0e011h0f011h3011h3011h3011h3011h20080b011h0c011h0d011h0e011h0f011h4011h4011h4011h200

33、A0a011h0b011h0c011h0d011h0e011h0f011h5011h5011h200C9011h0a011h0b011h0c011h0d011h0e011h0f011h6011h200E8011h9011h0a011h0b011h0c011h0d011h0e011h0f011h20107011h8011h9011h0a011h0b011h0c011h0d011h0e011h20126011h7011h8011h9011h0a011h0b011h0c011h0d011h20145011h6011h7011h8011h9011h0a011h0b011h0c011h20164011h

34、5011h6011h7011h8011h9011h0a011h0b011h20183011h4011h5011h6011h7011h8011h9011h0a011h201A2011h3011h4011h5011h6011h7011h8011h9011h201C1011h2011h3011h4011h5011h6011h7011h8011h201E0011h1011h2011h3011h4011h5011h6011h7011h第8遍扫描第9遍扫描第10遍扫描第11遍扫描第12遍扫描第13遍扫描第14遍扫描第15遍扫描0011h0011h0011h0011h0011h0011h0011h0011h

35、1011h1011h1011h1011h1011h1011h1011h1011h2011h2011h2011h2011h2011h2011h2011h2011h3011h3011h3011h3011h3011h3011h3011h3011h4011h4011h4011h4011h4011h4011h4011h4011h5011h5011h5011h5011h5011h5011h5011h5011h6011h6011h6011h6011h6011h6011h6011h6011h7011h7011h7011h7011h7011h7011h7011h7011h0f011h8011h8011h8011h8011h8011h8011h8011h0e011h0f011h9011h9011h9011h9011h9011h9011h0d011h0e011h0f011h0a011h0a0

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他资料

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1 

陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922