《微机原理实验报告.doc》由会员分享,可在线阅读,更多相关《微机原理实验报告.doc(63页珍藏版)》请在三一办公上搜索。
1、微机原理实验报告 目录微机原理实验报告1目录2第一部32位微机原理实验4实验一 显示程序实验4一、实验步骤4二、实验程序5三、实验结果5实验二 数据传送实验6一、实验步骤6二、实验程序6三、实验结果7实验三 数码转换程序实验8一、将ASCII码表示的十进制数转换为二进制数8二、将十进制数的ASCII码转化为BCD码12三、将十六进制数的ASCII码转化为十进制数19四、BCD码转换为二进制码23实验四 运算类程序实验26一、实验思路26二、实验程序28三、实验结果29实验五 分支程序设计实验30一、实验步骤30二、实验程序33三、实验结果34实验六 循环程序设计实验35一、实验步骤35二、实验
2、程序37三、实验结果38汇编语言部分实验总结39第二部分32位微机接口技术实验40实验一 8259中断控制器应用实验40一、实验内容40二、实验步骤40三、实验思考题及所填空缺的数据的分析47四、实验结果48实验二 8255并口控制器应用实验49一、实验内容49二,实验步骤50三、实验思考题及所填空缺的数据的分析53四、实验结果54实验三 8254定时/计数器应用实验56一、实验内容56二、实验步骤56三、实验思考题及所填空缺的数据的分析60四、实验结果62接口部分实验总结63第一部 32位微机原理实验实验一 显示程序实验一、 实验步骤1. 运行Tddebug软件,选择Edit菜单,根据实验内
3、容的描述编写实验程序,本实验显示部分参考实验流程如图1-1示; 2. 使用Compile菜单中的Compile和Link对实验程序进行汇编、连接; 3. 使用Rmrun菜单中的Run,运行程序,观察运行结果; 4. 使用Rmrun菜单中的Debug,调试程序,观察调试过程中,数据传输指令执行后,各寄存器及数据区的内容; 5. 更改数据区中的数据,考察程序的正确性。二、 实验程序 实验程序如下: DATA SEGMENT MES DB Show a as hex:, 0AH,0DH,$ SD DB a DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA
4、START: MOV AX, DATA MOV DS, AX MOV DX, OFFSET MES ;显示提示信息 MOV AH, 09H INT 21H MOV DI, OFFSET SD MOV AL, DS:DI AND AL, 0F0H ;取高4位 SHR AL,4 CMP AL, 0AH ;是否是A以上的数 JB C2 ADD AL, 07H C2: ADD AL, 30H MOV DL, AL ;显示字符 MOV AH, 02H INT 21H MOV AL, DS:DI AND AL, 0FH ;取低4位 CMP AL, 0AH JB C3 ADD AL, 07H C3: ADD
5、 AL, 30H MOV DL, AL ;显示字符 MOV AH, 02H INT 21H MOV AX, 4C00H ;返回DOS INT 21H CODE ENDS END START三、实验结果程序运行结果为:本程序既是把字符“a”转化为其ASCII码并以10进制数的形式显示在屏幕上。实验二 数据传送实验一、实验步骤1. 运行Tddebug软件,选择Edit菜单; 2. 使用Compile菜单中的Compile和Link对实验程序进行汇编、连接; 3. 使用Rmrun菜单中的Run,运行程序,观察运行结果; 4. 使用Rmrun菜单中的Debug,调试程序,观察调试过程中,数据传输指令执
6、行后,各寄存器及数据区的内容; 5. 更改数据区中的数据,考察程序的正确性。二、实验程序 DDATA SEGMENT ;定义源数据段 MSR DB HELLO,WORLD!$ LEN EQU $- MSR DDATA ENDS EXDA SEGMENT ;定义附加数据段 MSD DB LEN DUP(?) EXDA ENDS MYSTACK SEGMENT STACK ;定义堆栈段 DW 20 DUP(?) MYSTACK ENDS CODE SEGMENT ;定义代码段 ASSUME CS:CODE, DS:DDATA, ES:EXDA START: MOV AX, DDATA MOV DS
7、, AX ;装载数据段寄存器 MOV AX, EXDA MOV ES,AX ;装载附加数据段寄存器 MOV SI, OFFSET MSR ;设置SI MOV DI, OFFSET MSD ;设置DI MOV CX, LEN NEXT: MOV AL, SI ;开始传输数据 MOV ES:DI, AL INC SI INC DI DEC CX JNZ NEXT PUSH ES POP DS ;将附加段寄存器的段值赋给数据段寄存器 MOV DX, OFFSET MSD MOV AH, 9 INT 21H MOV AX, 4C00H ;利用DOS功能调用返回DOS状态 INT 21H CODE EN
8、DS END START三、实验结果程序运行结果为:本程序将数据段中的一个字符串传送到附加段中,并输出附加段中的目标字符串到屏幕上。实验三 数码转换程序实验一、将ASCII码表示的十进制数转换为二进制数(1)实验思路十进制数可以表示为:Dn10n+Dn-110n-1+D0100 =Di10i 其中Di代表十进制数1、2、39、0。 上式可以转换为: Di10i=(Dn10+Dn-1)10)+Dn-2)10+D1)10+D0 由上式可归纳十进制数转换为二进制的方法:从十进制数的最高位Dn开始作乘10加次位的操作,依次类推,则可求出二进制数结果。根据上面的原理,采取十进制数外部输入的方式储存在缓冲
9、区中,调用缓冲区中的储存数将之转化为二进制数显示在屏幕上,转换过程的流程图下图所示。CALL INPUT显示输入提示,等待从键盘输入十进制数字符串,并将之储存在内存中CALL DISPP回车换行CALL CHANGE将数据串转化为相应的数值存放在BX中CALL LIST_BX将BX中的内容以二进制的形式显示在屏幕上返回DOS显示的二进制位数为CX=16将BX左移一位将BX的最低位值赋给DL将DL中的数值转化为其ASCII码将DL中的ASCII码送往屏幕显示RET返回LIST_BX子程序流程图 (2)实验程序 DATA SEGMENT STRING DB Input:,$ NUM DB 6,?,
10、6 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX CALL INPUT ;调用显示输入子程 CALL DISPP ;回车换行 CALL CHANGE ;调用将输入字符串转化为相应的十进制数值子程 CALL LIST_BX ; 调用将十进制数转化为二进制数并输出子程 MOV AH,4CH INT 21H INPUT PROC LEA DX,STRING MOV AH,09H INT 21H LEA DX,NUM MOV AH,0AH INT 21H RET INPUT ENDP
11、CHANGE PROC LEA SI,NUM+2 MOV CL,NUM+1 MOV CH,0 MOV AX,0 MOV DI,10 NEXT: MUL DI MOV BH,0 MOV BL,SI AND BL,0FH ADD AX,BX INC SI LOOP NEXT ZERO: MOV BX,AX RET CHANGE ENDP LIST_BX PROC MOV CX,16 ;规定输出二进制位数为16位 ROTATE: ROL BX,1 MOV DL,BL AND DL,01H ADD DL,30H MOV AH,2H INT 21H LOOP ROTATE RET LIST_BX END
12、P DISPP PROC MOV DL,0DH MOV AH,02H INT 21H MOV DL,0AH MOV AH,02H INT 21H RET DISPP ENDP CODE ENDS END START(3)实验结果当输入为五位十进制数00012时,输出结果如下:二、将十进制数的ASCII码转化为BCD码(1)实验思路十进制数与BCD码之间的转化只是将每一位的十进制数转化为四位的二进制数,按位显示即可,而在内存中的十进制数是以其ASCII码的形式存储,要将内存中的十进制数转化为BCD码要先将每一位的ASCII重新转化为十进制数,再转化为BCD码显示。本实验要求输入不是十进制数的AS
13、CII码时要输出“FF”,通过先将输入的十进制数存放在内存中先判定是否存在非十进制数的ASCII码,如果有则输出FF“,如果没有则将输入的十进制数转化为BCD码输出。设计的程序流程图如下:CALL INPUT显示输入提示,等待从键盘输入十进制数字符串,并将之储存在内存中CALL DISPP回车换行CALL CHANGE判定输入的数据串中是否有非十进制数,通过判断进行输出“FF”或BCD码返回DOS 主程序流程图BL SI指针所指的地址里储存的字符ASCII码将BL中的ASCII码与39H进行比较NYBL39HLOOP2CALL STARTA 子程序LOOP1地址指针SI加一,CH减一NCH=0
14、?RET 返回YCALL DISPA子程序RET 返回CHANGE 子程序流程图DX STRINGA字符串的有效地址9号功能调用,显示字符串“FF!”RET 返回STARTA子程序流程图NEXTDH4BLSI中存储的字符的ASCII码地址指针SI加一BLBL-30HBL左移4位BL左移1位DLBL取DL的最低位转化为其ASCII码并显示DH减一NDH=0?YCH减一CH=0?NYRET 返回DISPA子程序流程图(2)实验程序 DATA SEGMENT STRING DB Input:,$ STRINGA DB FF!,$ NUM DB 6,?,6 DUP(?) DATA ENDS CODE
15、SEGMENT ASSUME CS:CODE,DS:DATA MAIN PROC FAR START: MOV AX,DATA MOV DS,AX CALL INPUT ; 调用输入显示子程序 CALL DISP ; 调用回车换行子程序 CALL CHANGE ; 调用字符串判定及转化显示程序 MOV AH,4CH INT 21H RET MAIN ENDP DISP PROC MOV DL,0DH MOV AH,02H INT 21H MOV DL,0AH MOV AH,02H INT 21H RET DISP ENDP INPUT PROC LEA DX,STRING MOV AH,09H
16、 INT 21H LEA DX,NUM MOV AH,0AH INT 21H RET INPUT ENDP CHANGE PROC LEA SI,NUM+2 MOV CH,NUM+1 NEXT: MOV BL,SI CMP BL,39H JLE LOOP1 JMP LOOP2 LOOP1: INC SI DEC CH JNZ NEXT CALL DISPA ; 调用BCD码转换显示子程序 RET LOOP2: CALL STARTA ; 调用“FF“显示程序 RET DISPA PROC LEA SI,NUM+2 MOV CH,NUM+1 NEXTA: MOV DH,4 MOV BL,SI I
17、NC SI SUB BL,30H MOV CL,4 ROL BL,CL ROTATE: ROL BL,1 MOV DL,BL AND DL,01H ADD DL,30H MOV AH,2H INT 21H DEC DH JNZ ROTATE DEC CH JNZ NEXTA RET DISPA ENDP STARTA PROC LEA DX,STRINGA MOV AH,09H INT 21H RET STARTA ENDP CHANGE ENDP CODE ENDS END START(3)实验结果1)从键盘输入54321时输出如下:2)从键盘输入5432a时输出如下:三、将十六进制数的AS
18、CII码转化为十进制数(1)实验思路十六位二进制数的值域为0-65535,最大可转换为五位十进制数。五位十进制数可表示为: ND=D4+D310+D210+D110+D0 因此,将十六位二进制数转换为五位ASCII码表示的十进制数,就是求D1-D4,并将它们转化为ASCII码。程序流程图如下:AX 内存存放的十六进制数BX10000DDX0DX:AX除以BXDI DXCALL DISPB调用显示子程序AX DIDX0BX1000DDX:AX除以BXCALL DISPB调用显示子程序DI DXDI DXDX:AX除以BXAX DIDX0BX100DCALL DISPB调用显示子程序 AX DID
19、X0BL10AX除以BLDH AHCALL DISPB调用显示子程序DL DHDL高四位值0,并将DL中的字符转化为其ASCII码2号功能调用返回DOS主程序流程图DL AL返回RET2号功能调用DL高四位值0,并将DL中的字符转化为其ASCII码DISPB子程序流程图(2)实验程序 DATA SEGMENT N DW 000CH DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AX,N ;十六进制数除以10000D MOV BX,10000D MOV DX,0 DIV BX MOV
20、DI,DX CALL DISPB MOV AX,DI ;余数除以1000D MOV DX,0 MOV BX,1000D DIV BX MOV DI,DX CALL DISPB MOV AX,DI ;余数除以100 MOV DX,0 MOV BH,0 MOV BL,100D DIV BX MOV DI,DX CALL DISPB MOV AX,DI ;余数除以10 MOV DX,0 MOV BL,10 DIV BL MOV DH,AH CALL DISPB MOV DL,DH ;余数显示 AND DL,0FH ADD DL,30H MOV AH,2H INT 21H MOV AH,4CH INT
21、 21H DISPB PROC ;显示子程序 MOV DL,AL AND DL,0FH ADD DL,30H MOV AH,2H INT 21H RET DISPB ENDP CODE ENDS END START(3)实验结果程序运行结果如下:四、BCD码转换为二进制码(1)实验思路先定义一个4Byte的空内存空间,将存储在内存空间中的四个二位十进制数的BCD码的转化为四个二位十进制数依次存储在定义的4Byte的空间中,然后从定义的空间中依次提取十进制数并转化为压缩BCD码送往屏幕输出,程序的流程图如下:SI NUM的有效地址BH4CL4ALSIAL左移4位,然后将高四位值零ALAL*10B
22、LSI将BL高四位值零ALBL+AL将AL中的十进制数存入M中DI M的有效地址BLDIDI加一CX8将BL中的十进制数以八位二进制数显示在屏幕上回车换行地址指针SI加一,BH减一NBH=0?Y返回DOS主程序流程图(2)实验程序 DATA SEGMENT NUM DB 11H,22H,33H,44H M DB 4 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA SI,NUM MOV BH,4 NEXTA: MOV CL,4 ;将BCD码转化为十进制数 MOV AL,SI
23、 ROL AL,CL AND AL,0FH MOV BL,10 MUL BL MOV BL,SI AND BL,0FH ADD AL,BL LEA DI,M ;将转化为的十进制数存进M中 MOV DI,AL LEA DI,M ;调用M中的十进制数并以八位二进制数的形式显示 MOV BL,DI INC DI MOV CX,8 NEXT: ROL BL,1 MOV DL,BL AND DL,01H ADD DL,30H MOV AH,2H INT 21H LOOP NEXT CALL DISP INC SI DEC BH JNZ NEXTA MOV AH,4CH INT 21H DISP PROC
24、 MOV DL,0DH MOV AH,02H INT 21H MOV DL,0AH MOV AH,02H INT 21H RET DISP ENDP CODE ENDS END START(3)实验结果程序运行结果如下:实验四 运算类程序实验一、实验思路实验利用累加器AX,先求低十六位和,并存入低址存储单元,后求高16位和,再存入高址存储单元。由于低位和可能向高位有进位,因而高位字相加语句需用ADC指令,则低位相加有进位时,CF=1,高位字相加时,同时加上CF中的1。然后将存储在内存空间中的和值显示为十六进制数在屏幕上。程序流程图如下:将X的低十六位按位权赋给AX将Y的低十六位按位权赋给BXC
25、F清零AX AX+BX+CFZ的低两个字节AX将X的高十六位按位权赋给AX将Y的高十六位按位权赋给BXAX AX+BX+CFZ的高两个字节AXSIZ的高两位有效地址CALL DISP调用子程序SIZ的低两位有效地址CALL DISP调用子程序返回DOS主程序流程图BLSI中的字符地址指针SI加一BHSI中的字符二、实验程序 DATA SEGMENT X DD 001565A0H Y DD 0021B79EH Z DB 4 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA MAIN PROC FAR START: MOV AX,DATA ; 将X的低十六位和Y的低十六位相加 MOV DS,AX LEA SI,X