当前位置:文档之家› 微机原理实验报告西安交通大学

微机原理实验报告西安交通大学

西安交通大学电子信息与工程学院自动化科学与技术系微机原理与接口技术实验报告实验名称:微机原理与接口技术实验者姓名: XX 实验者学号:21105040XX所在班级:自动化1X报告完成日期:2014年1月12日实验一数据传送、算术运算、循环程序结构1、实验目的a)熟悉8086汇编语言源程序的框架结构,并掌握汇编语言程序的编写、汇编、连接、执行的过程,并利用Turbo Debugger调试汇编程序。

b)熟悉8086指令系统的数据传送指令,掌握寻址方式。

c)熟悉8086指令系统的算术运算指令。

掌握循环结构汇编语言程序的编制。

2、实验内容教材P121,第14、15题。

教材P195,第6题。

教材P196,第12题。

3、具体实验第一题(P121,第14题)设有两个8个字节长的BCD码数据BCD1及BCD2。

BCD1数以1000H为首地址在内存中顺序存放;BCD2数以2000H为首地址在内存中顺序存放。

要求相加后结果顺序存放在以2000H为首地址的内存区中(设结果BCD数仍不超过8个字节长)。

a) 实验原理考虑两个8个字节长的BCD码相加,首先根据地址要求将数据放在对应的地址单元中,然后做加法,BCD码相加要用到调整指令,结果才为正确的BCD数b) 程序框图c) 程序源代码DATAS SEGMENTORG1000HBCD1 DB 01H,02H,03H,04H,05H,06H,07H,88H;起始地址为1000H ORG2000HBCD2 DB 11H,12H,13H,14H,15H,16H,17H,18H;起始地址为2000H DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART:MOV AX,DATASMOV DS,AXMOV BX,0MOV CX,8 ;设置循环次数8次CLC ;清进位CF标志AGAIN:MOV AL,[BX+1000H]ADC [BX+2000H],AL;结果放在2000H开始的单元内DAAINC BXLOOP AGAIN;没完成则转AGAIN循环MOV AH,4CHINT 21HCODES ENDSEND START运行: BCD1 DB 11H,12H,13H,14H,15H,16H,17H,18HBCD2 DB 21H,22H,23H,24H,25H,26H,27H,28H结果如下:DS:2000H为首地址的连续八个字节单元中第二题(P121,第15题)设从2000H为首地址的内存中,存放着10个带符号的字节数据,试编写“找出其中最大的数,并存入2000H单元中“的程序。

a)实验原理首先把十个带符号数放在要求的的存储单元中,然后再进行比较,有符号数的比较用JL,JC,JNG,等指令,首先设计一个最小带符号数80H作为比较初值,用2000H单元中的数分别与其它进行比较,若大于则把该单元的数存入2000H 单元,否则不予处理。

对于该题,我采用的是字符串指令,由于是隐含寻址,把2000H中的数作为字符串源操作数,其它进行一次循环则依次放入AL中,注意的是当CX为10时,DL=80H。

b)程序框图c)程序源代码DATA SEGMENTORG2000H;数据存放在2000H开始的单元BCD DB10H,28H,49H,69H,0A1H,0C3H,96H,29H,45H,02H DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV SI,2000H;地址指针指向单元首地址MOV CX,10MOV DL,80H;设置最小符号数L1: LODSBCMP AL,DL;比较带符号数JNG L2 ;(DL)大则跳转L2MOV DL,AL;DL指向内容小则交换L2: LOOP L1MOV DS:[2000H],DL;最大数存放在2000H单元MOV AH,4CHINT 21HCODE ENDSEND START运行:BCD DB10H,28H,49H,69H,0A1H,0C3H,96H,29H,45H,02H 结果为69H第三题(P195,第6题)试编制一程序,用乘法指令实现32位二进制数与16位二进制数相乘。

a)实验原理首先把被乘数第八位和高八位分别与乘数相乘,高八位乘得结果左移16位与第八位乘得结果相加即为结果。

b)程序框图c)程序源代码DATA SEGMENTDATAX DW1000H,1000HDATAY DW2000HDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV BX,1000H ;将把结果存到1000H开始的单元中MOV SI,OFFSET DATAXMOV DI,DATAYMOV AX,[SI]MUL DI ;把低16位相乘,结果存到AX,DX中MOV[BX],AX ;把结果中低16位存到BX对应的存储单元MOV[BX+2],DX ;把结果中高16位存到BX+2对应的存储单元MOV AX,[SI+2] ;计算被乘数高16位相乘的结果MUL DIADD[BX+2],AX ;把两次相乘结果对应(把第二次的结果;向左移16位)相加,最后结果存在了[BX] 到[BX+5]ADD[BX+4],DXMOV AH,4CHINT 21HCODE ENDSEND START运行:结果在DS:1000中第四题(P196,第12题)设有两个等字长,字节型字符串,试编写一汇编程序,比较它们是否完全相等,若相等则将字符Y送入AL中,否则将字符N送入字符中。

a)程序框图b)程序源代码DATA SEGMENTSTRX DB'CZX0','$'STRY DB'CZX1','$'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV ES,AXCLDLEA DI,STRY;取字符串1首地址LEA SI,STRX;取字符串2首地址CALL L1MOV DL,AL ;显示结果MOV AH,02HINT 21HMOV AH,4CHINT 21HL1 PROCMOV CX,10REPZ CMPSB STRX,STRY ;比较两个字符串JNZ RA ;不相等则跳转到RAMOV AL,'Y';相等则将Y送ALJMP RBRA: MOV AL,'N';不相等则将Y送ALRB:RET ;比较结束返回程序L1 ENDPCODE ENDSEND START运行:当字符串为STRX DB'CZX0','$'STRY DB'CZX1','$'当字符串为STRX DB'CZX0','$'STRY DB'CZX0','$'4、实验中遇到的问题:在刚开始接触实验时感觉非常困难,无从下手,后来经过仔细认真阅读书上的经典程序之后,基本能够写出关键程序片段,再借助辅导书完善了实验程序内容,基本顺利地完成了实验。

本次实验让我熟悉了汇编语言的实现步骤和常用的指令系统,同时也学会了利用DEBUG调试汇编程序。

实验二汇编语言程序设计1、实验目的a)练习编写较复杂汇编语言程序时程序框图的绘制。

b)子程序定义与调用,参数传递的方法。

c)了解宏指令的定义与调用,并与子程序定义与调用进行比较。

d)掌握利用软件中断实现DOS系统调用的方法。

2、具体实验第一题:教材4章,第8题,设n=10。

即试编制程序,找出前十个质数。

提示:编写一个判断某数是否质数的子程序,主程序调用该子程序,对顺序递增的自然数进行是否质数的判断,若是则存放在质数缓冲区中,直到找到10个质数,程序结束。

判断一个数N是否是质数的一种算法是:将N顺序与2~N-1的数相除,若每次除法的余数均不等于0,则该数是质数。

注意:8086的除法支持双字除以字,字除以字节,本题中可以选择字除以字节。

正确结果为:02,03,05,07,0B,0D,11,13,17,1D(十六进制数)a)实验原理找出前十个质数,质数只能被1和其自身整除,但考虑到如果从2开始一个一个的除的算法效率太低,很多已经是合数的作为除数是浪费的,故该算法用每一个数除以已经判断出来的质数(均小于该数),如果不能整除则说明该数是质数,能整除说明该数不是质数,继续进行下一个判断。

b)程序框图c)程序源代码N EQU 10STRDISP MACRO POSMOV DX,OFFSET POSMOV AH,9HINT 21HENDMNUMTOSTR MACRO NUM,POSMOV AX,NUMMOV SI,OFFSET POSADD SI,LENGTH POS-2;从最后开始(不考虑字符串结束符"$")存放5个字符CALL WORDTOSTR;ENDMDATAS SEGMENTNUMBER DW N DUP(0)LAST DW?NUMNOW DW?STR1 DB"The first ten prime numbers are as follows:",0DH,0AH,"$"STR3 DB"PRESS ANY KEY TO CONTINUE","$"STRNO DB 6 DUP(" "),"$"STRPRIME DB 6 DUP(" "),"$"HCHH DB 0DH,0AH,"$"DATAS ENDSSTACKS SEGMENTSTACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS,ES:DATAS START:MOV AX,DATASMOV DS,AXMOV ES,AXMOV AX,STACKSMOV SS,AXMOV SI,OFFSET NUMBER;质数数组首地址MOV BX,0MOV NUMBER[SI+BX],2;第一个质数为2MOV LAST,0;最后一个质数地址MOV DX,2;第一个质数是2MOV NUMNOW,1;质数计数LOOP1:INC DX;往后查找MOV BX,2;MOV CX,0LOOP2:;判定DX中数据是否是质数PUSH DX;保存现场,防止除法运算带来的改变MOV AX,DXMOV DX,0ADD SI,CX;求出作为除数的质数的相对位移MOV BX,NUMBER[SI];从质数集里读取质数ADC SI,CX;还原SIINC CXINC CX;cx自加2DIV BX;DX<-(DX:AX)/(BX)余数CMP DX,0POP DXJZ LOOP1;除尽则表示该数不是质数,继续查找下一个CMP BX,DXJB LOOP2;如果除数小于被除数,则增大除数继续做除法ADD LAST,2;相当于指针往后移动一个字的单位长度MOV BX,LASTMOV NUMBER[SI+BX],DX;将找到的质数存入数组,基址变址寻址ADD NUMNOW,1;质数计数加1CMP NUMNOW,N;得到N个质数则结束JNZ LOOP1;否则继续查找;输出结果MOV NUMNOW,1MOV DI,OFFSET NUMBERSTRDISP STR1DISPLAY:NUMTOSTR NUMNOW,STRNOMOV AX,DS:[DI]NUMTOSTR AX,STRPRIMESTRDISP STRPRIME;输出质数STRDISP HCHHINC DIINC DIADD NUMNOW,1CMP NUMNOW,NJBE DISPLAY;等待键盘输入,使程序不会立即退出STRDISP STR3MOV AH,08HINT 21HMOV AH,4CHINT 21H;子程序;WORDTOSTR;将AX中数字转换成5个字符的字符串,存入SI为首地址的存储单元里WORDTOSTR PROC FARPUSH SIMOV CX,5;设置循环次数NEXTDIGIT:MOV DX,0MOV BX,10CMP AX,0JZ BLANKDIV BXADD DX,30H;将得到的每位数字转换为对应的ASCII码SETCHAR:MOV [SI],DLDEC SIMOV DX,0LOOP NEXTDIGITPOP SICMP BYTE PTR [SI],20HJZ ZERORETZERO:MOV BYTE PTR[SI],30HRETBLANK:MOV DL,20HJMP SETCHARWORDTOSTR ENDPCODES ENDSEND START运行结果:第二题编写一个汇编程序,实现N!(N>=0):N!=N*(N-1)*(N-2)*……*1(设N=3),跟踪IP变化,观察堆栈的变化,理解子程序递归调用中程序执行的流程,以及帧信息的组成。

相关主题