微机原理与应用课程实验报告.doc
《微机原理与应用课程实验报告.doc》由会员分享,可在线阅读,更多相关《微机原理与应用课程实验报告.doc(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
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
10 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 应用 课程 实验 报告
