本科生实验报告
实验课程 微机原理与接口技术
学院名称 信息科学与技术学院 专业名称 电子信息工程
学生姓名 干娜 学生学号 ************
指导教师 李志鹏
实验地点 6B610 实验成绩
二〇一六年十月 二〇一六年十二月
实验一、动态调试程序DEBUG
一、 实验目的
1.动态调试程序DEBUG环境的搭建; 2. 掌握各种汇编指令的作用; 3. 掌握磁盘文件操作命令的使用;
4.掌握查找、比较、填充和移动内存命令的使用。
二、 实验内容
1.搭建汇编调试环境,安装DOS系统; 2.进行DEBUG动态调试程序的启动与退出; 3.进行汇编、执行、跟踪与反汇编命令的编写与运行; 4.进行显示、修改内存和寄存器命令的编写与运行;
5.进行查找、比较、填充和移动内存命令的编写与运行。
三、DEBUG的启动与退出
DEBUG的启动:首先选择一个磁盘,建立一个名为“TEST”的文件,文件名可以任意,然后挂载DOS系统在任意磁盘上,执行代码界面为:
出现“-”表示执行成功,进入DEBUG调试环境,此后可以进行代码的编译与执行。
DEBUG的退出命令:-Q
四、汇编、执行、跟踪与反汇编
1.A命令:逐行汇编命令,主要用于小段程序的汇编和修改目标程序。使用逐行汇编命令的格式为:
A[地址]
实验内容:汇编一小段程序,DOS运行界面为:
2
该段程序完成了对AX,BX,CX,DX寄存器写入规定的数据。 2.G命令:启动运行一个程序或程序的一段,编写格式为:
G[=<起始地址>][<断点地址>…]
执行A命令的代码后,运用G命令查看各个寄存器状态:
结果分析:从运行结果可以看出,BX、CX、DX已经写入了输入值,但AX中的值并不是输入值,可能是AX寄存器的值写入后又被改变。 3.T命令
T命令用来逐条跟踪程序的运行,编写格式如下:
T[=<地址>][<跟踪条数>]
每条指令执行后,都要暂停并显示各寄存器的内容,跟踪执行实际上是单步执行,执行结果如下:
从地址100开始,跟踪三条指令,从执行细节可以看出AX、BX、CX、DX都写入了程序给定的值,IP指针的值也是逐条递增。
4.U命令:用来对二进制代码程序进行反汇编,常用于分析和调试目标程序,引用格式如下:
U[<地址>]
3
对前面那段程序进行反汇编,运行界面如下:
结果分析:上述反汇编程序增加了二进制机器码,右侧两列是反汇编出的原来的程序,可以看出与之前输入的程序一致,同时增加了入栈出栈等信息。
五、显示、修改内存和寄存器命令
1.D命令
该命令是将调入内存的程序以十六进制形式以及对应的ASCII码字符形式显示出来,格式为:
D[<地址>]
显示内存地址从100H到200H这一段内容的程序执行为:
从结果可以看出从100H到110H这段地址中写入数据,其他地址写入数据都为0。 2.R命令
R命令的作用是显示寄存器内容,格式如下: R (显示所有寄存器和标志) R寄存器 (显示指定寄存器) RF (显示所有标志)
显示寄存器内容时,首先显示13个16位寄存器的内容,随后是标志寄存器的内容,最后一行是下一条要执行指令的地址及指令内容。
显示CX寄存器中的内容,并修改为0F,运行界面如下所示:
4
然后利用T命令跟踪,可以看到显示结果,CX寄存器的内容确实被修改为0F
5
实验二、DEBUG命令及8086指令使用
一、实验目的
通过实验复习和掌握下列知识:
1.8086汇编指令:MOV、ADD、ADC、SUB、SBB、DAA、XCHG;
2.DEBUG命令:A、D、E、F、H、R、T、U;
3.BCD码、ASCLL码以及用十六进制数表示二进制数的方法; 4.寄存器:AX、BX、CX、DX、F、IP。
二、实验内容
1.DEBUG命令的使用实验; 2.常用8086汇编指令练习。
三、DEBUG命令的使用
实验步骤:
1. 输入“DEBUG”进入DEBUG控制状态,显示提示符“-”; 2. 用命令F 1001 0F“A”将“A”的ASCLL码填入内存;
3. 用命令D 1001 0F观察内存中的十六进制码以及屏幕右边的ASCLL字符;
4. 用命令F 1101 1F 41重复上两项实验,观察结果并比较;
5. 用命令E 100 303132…将30H-3FH写入地址为100H开始的内存单元,再用命令D观察结果,看输入的十六进制是什么字符的ASCLL码; 6. 用H命令检查下列各组十六进制数加减结果并和手算结果比较: 34H、22H 56H、78H A5H、79H 1284H、5678H 3A758H、347FH 7. 用R命令检查个寄存器内容,注意AX、BX、CX、DX、IP及标志ZF、CF和AF的内容;
8. 用R命令将AX、BX内容改为1050H及22A8H。 执行步骤1,2,3得到的结果为:
从运行结果可以看出A字符被写入内存,同时写入的内容是其ASCLL码
6
41。
执行步骤4,得到的结果为:
从运行结果可以看出写入ASCLL码和直接写入字符,得到的效果是一样的,屏幕右边的ASCLL码字符都被写入和显示。
执行步骤5,运行结果为:
可以看出30H-3FH对应的ASCLL字符“01234567:;<=?. ”被写入,将其ASCLL码对应的字符显示在了屏幕右侧。
执行步骤6,用H命令实现两个数的加减,“和”显示在前面,“差”显示在后面,运行的结果为:
经过手算,可以看出计算结果与运行结果一致,在进行减法运算时,应当用操作数的补码。
执行步骤7,结果为:
由运行结果可以看出标志位ZF的值为0,CF的值为0,AF的值为0,AX、BX、CX、DX寄存器的都为0,IP指针指向地址0100H。
四、常用8086汇编指令练习
1.传送指令
用A指令在内存100H处输入下列内容:
7
用U命令检查输入的程序并记录,如下所示:
左侧是机器码,右侧是反汇编出来的代码。
用T命令逐条运行这些指令,每运行一条检查并记录有关寄存器及IP的变化情况,运行结果为:
结果分析:以上是运行4条指令,寄存器内的值的情况,可以看出首先将AX写入1234,再向BX写入5678,然后交换AX,BX的值,接着将AX的高4位改写为35,运行结果与程序相符。
8
再运行后三条指令,检查寄存器变化情况,如下:
结果分析:从运行结果可以看出,达到了程序编写的目的,将AX的低4位改写成48,DX写入75AB,接着讲AX与DX中存储的内容交换。 2.加减法指令
用A命令在内存100H处输入下列语句:
用U命令查看输入的程序及对应的机器码,可以看出,程序成功写入,并且生成对应的机器码。
用T命令逐条运行这些指令,检查并记录相关寄存器及ZF的情况:
9
结果分析:运行4条指令后的结果如上所示,可以看到AX的低4位和高4位分别被写入了22和34,DX,BX寄存器还保存着上次运行的值,然后将AX低4位与高4位相加,结果存入低4位,再将低4位减去78H,得到的结果为DEH,因为结果为负,所以用的是反码。
再运行后面的指令,可以看到IP指针每次自动加2,实验结果与程序指令作用一致。
带进位加减法
用A命令在内存200H处输入系列内容:
用T命令逐条运行这些指令,运行结果为:
10
结果分析:
SUB指令只和两个操作数有关,SBB指令不仅与SUB有关还与标志位CF的值有关,从倒数第二次状态查看可知CF的值为1,因此DH与34之差还需要减个1。
BCD码加减法,运行界面如下所示:
逐条跟踪指令的运行可以看出,AL的值从写入的58变为25,执行BCD码加法的结果为CD。
11
实验三、内存操作数及寻址方法
一、实验目的
1.掌握DEBUG命令:G、N、W、L、Q;
2.了解8086系统中数据在内存中的存放方式和内存操作数的几种寻址方式;
3.掌握8086指令:INC、DEC、LOOP、INT 3、INT 20H,寄存 器SI;
4.掌握8086汇编语言伪操作:BYTE PTR,WORD PTR; 5.求累加和程序和多字节加减法操作。
二、实验内容
1.通过编程掌握内存操作数及各种寻址方式的使用; 2.编写求累加和程序; 3.编写多字节加法程序。
三、实验步骤和结果
1.内存操作数及各种寻址方式使用
程序的编写及每步寄存器状态查看运行界面如下:
12
13
结果分析:通过T命令逐条跟踪寄存器的情况,可以看出随着每一步程序的执行,寄存器按照要求被修改,同时D命令将写入的程序以十六进制的形式以及对应的ASCLL码形式显示出来。
2.求累加和程序 输入下列程序:
用T命令逐条跟踪的结果为:
14
由运行结果可以看出,当程序运行到跳转指令处,指针跳到对应的地址,再接着往下执行程序,寄存器的值也随程序的执行改变。该程序完成了AL和BX中存储数据的加和,并且BX不断累加。
3.多字节加法程序 实验内容步骤:
1)输入指导书上的程序;
2)用E命令在1000H开始处输入一个8B被加数,在2000H开始处输入一
个8B加数,均为低字节在前面; 3)运行此程序,并用D命令检查其结果。 运行结果截图:
15
在运行G命令运行程序时,DOS系统会出现崩溃的情况,因此不能用G命令运行该段程序,用D命令查看寄存器状态结果为:
结果分析:从以上实验结果可以看出1000H和2000H两个地址处分别被写入了12,34,然后两数相加,是带进位的加法,结果存入地址[DI], 之后两地址中的数自加,然后再相加,同时加上低字节相加的进位CF,不断循环,直到CX中的数减为0,退出循环,程序实现多字节加法。
16
实验四、汇编语言程序上机过程
一、实验目的
1.掌握常用工具软件EDIT、MASM、LINK的使用; 2.掌握伪指令:SEGMENT、ENDS、ASSUME、END、OFFSET、DUP的使用;
3.利用INT 21H的1号功能实现键盘输入的方法;
4.了解.exe文件和.com文件的区别及用INT 21H 4C号功能返回系统的方法。
二、实验内容
1.用伪指令编写完整的汇编源程序;
2.用LINK命令产生exe文件,完成代码功能。
三、实验步骤与结果
1.用文字编辑工具(EDIT或记事本)将源程序输入,其扩展名为.asm;代码如下:
DATA SEGMENT
MESSAGE DB '1THIS IS A SAMPLE PROGRAM OF KEYBOARD AND DISPLAY'
DB 0DH,0AH,'PLEASE STRIKE THE KEY!',0DH,0AH,'$' DATA ENDS
STACK SEGMENT PARA STACK'STACK' DB 50 DUP(?) STACK ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX
MOV DX,OFFSET MESSAGE MOV AH,9 INT 21H AGAIN: MOV AH,1
17
INT 21H CMP AL,1BH JE EXIT CMP AL,61H JC ND CMP AL,74H JA ND
AND AL,11011111B ND: MOV DL,AL MOV AH,2 INT 21H JMP AGAIN EXIT: MOV AH,4CH INT 21H CODE ENDS
END START
2.用MASM对源程序进行汇编,产生.obj文件和.lst文件,若汇编时提示有错,则用文字编辑工具修改源程序后重新汇编,直至通过;
3.同TYPE命令产生.lst文件;
4.用LINK命令将.obj文件连接成可执行的.exe文件;
5.在DOS状态下运行LINK产生的.exe文件。即在屏幕上显示标题并提示按键。每按一键则在屏幕上显示两个相同的字符,但小写字母被改成大写。按ESC键可返回DOS。实验结果如下所示:
18
结果分析:由以上运行结果截图可以看出,运行.EXE文件达到了将小写字母转换为大写字母。
19
实验五、单片机流水灯实验
一、实验目的
1.掌握KEIL工程的建立和软件的开发;
2.掌握C-51的编程方法,注意其与C语言的区别; 3.编程实现向单片机I/O口写入数据; 4.掌握KEIL中软件仿真的基方法; 5.编程实现流水灯。
二、实验内容
1.用KEIL软件建立工程,并用其进行软件仿真DEBUG; 2.用C-51进行编程,实现向I/O写入数据,并用DEBUG查看I/O口状态,检查数据是否写入I/O口;
3.编程实现流水灯,并用软件仿真查看I/O状态,验证是否实现流水灯效果。
三、实验步骤与结果
实验1.向单片机的P1口先写入0XAA,延迟一段时间再写入0X55,用KEIL软件仿真查看I/O口状态,观察数据是否被写入。 程序如下: #include while(1) { for(i=0;i<2000;i++) for(j=0;j<1000;j++)   ;   P1=0X55;   for(j=0;j<1000;j++) for(i=0;i<2000;i++)   ;    };  } P1=0XAA; 设置断点仿真查看P1口的状态如下所示: 20 结果分析:从以上仿真结果可以看出0XAA和0X55被先后写入了P1 口。 实验2.依次向单片机的I/O口写入0XFF、0X00、0X55,用软件仿真观察P1口状态。 程序如下: #include P1=0xFF; P1=0x00;  P1=0x55; } 设置断点仿真查看P1口的状态如下所示: 21 结果分析:从以上软件仿真结果可知,实现了依次向P1口写入0XFF、0X00、0X55。 实验3.编程在P1口实现流水灯,并用软件仿真查看I/O口状态。 程序如下: 22 #include void main()  {  int i,j; for(i=0;i<2000;i++)     for(j=0;j<1000;j++) ; char aa;   aa=0x01;   while(1)   { if(aa==0x00)    aa=0x01;   P1=aa;   aa<<=1;   delay();}} 设置断点仿真查看P1口的状态如下所示: 结果分析:本程序将延时函数封装起来,使主函数更加简洁。从仿真结果可以看出,程序实现了流水灯效果。 24 实验六、方波产生实验 一、实验目的 1.掌握KEIL工程的建立和软件的开发; 2.掌握定时器工作方式的配置以及初值的计算; 3.掌握用中断方式和查询方式产生方波; 4.学会编程产生占空比为1:4的方波。 二、实验内容 1.配置定时器的工作方式,计算并设置初值; 2.完成定时器中断实验,设置相关的中断控制标志位,编写中断服务程序; 3.用查询方式产生1:1占空比的方波; 4.编程产生1:4占空比的方波。 三、实验步骤与结果 实验1.用中断方式在P1.0口产生1HZ方波,并用KEIL软件仿真查看I/O口状态,大致观察P1.0口高低电平的反转时间(假设时钟频率为12M)。实验步骤为: ▪ 对TMOD赋值,以确定T0和T1的工作方式,本次实验选用的是定时器0的工作方式1,因此TMOD=0x01;计算初值,并将其写入TH0和TL0,由于方波的频率的1HZ,因此周期为1s,由于时钟周期是1us,因此本实验的设计为:定时器定时50ms进入一次中断,TH0=(65536-50000)/256,TL0=(65536-50000)%256,进入10次后定时时间为500ms此时翻转P1.0的状态,由此产生了1HZ的方波;  ▪ 写interrup函数; ▪ 使TR0置位,启动定时器定时。 程序如下: #include 25 TH0=(65536-50000)/256;    TL0=(65536-50000)%256;    TMOD=0x01;    EA=1;    ET0=1; TR0=1;    while(1);  } void timer() interrupt 1 using 1  { Count++; TH0=(65536-50000)/256; TL0=(65536-50000)%256;   If(count==10)    { LED=!LED; Count=0; }  } 设置断点仿真查看P1口的状态如下所示: 结果分析:在DEBUG环境下仿真,观察右下方的运行时间记录,可以看出P1.0高低电平反转的时间为500ms左右。 26 实验2.用查询方式在P1.0口产生100HZ方波,并用KEIL软件仿真查看I/O口状态,大致观察P1.0口高低电平的反转时间(假设时钟频率为12M)。 分析:定时器的方式设置与实验1一致,用查询方式时,需要不断检测标志位TF0,若IF=1,则表明定时器溢出了,此时定时时间到达,IF需要手动清0。同时初值的设置为:TH0=(65536-5000)/256,TL0=(65536-5000)%256,翻转时间为5ms。 程序如下: #include TMOD=0x01; TH0=(65536-5000)/256;    TL0=(65536-5000)%256;    TR0=1;    while(1) 实验结果与结果分析:通过与仿真,本实验的实验结果与实验1类似,P1.0口以5ms的周期翻转,产生100HZ的方波。 实验3. P1.0产生1HZ占空比1:4的方波,用KEIL软件仿真查看I/O口状态,大致观察P1.0口高低电平的反转时间(假设时钟频率为12M)。 分析:本实验选用中断方式,方波周期为1HZ,因此定时器中断的设置与实验1相同,由于占空比为1:4,因此反转的时间有变化,设置定时器的定时时间为20ms,,每20ms进入一次中断,进入次数小于10次时,P1.0输出高电平,进入次数大于10次时输出低电平,次数大于50时,将次数清0。 程序如下: #include TMOD=0x01; TH0=(65536-20000)/256;    TL0=(65536-20000)%256; 27 { if(TF0==1)    {           } LED=!LED; TH0=(65536-5000)/256; TL0=(65536-5000)%256; TF0=0;    } TR0=1;    EA=1;    ET0=1;    while(1);  } void timer() interrupt 1 using 1 { TH0=(65536-20000)/256;    TL0=(65536-20000)%256;    count++;    if(count<10)    {        } if(count>=10) LED=1; {        } if(count==50)    {        } } count=0;  LED=0; 实验结果与结果分析:本实验的实验结果与上述两个实验类似,P1.0的电平不断翻转,高电平的时间明显小于低电平的时间。 28 实验七、串口收发实验 一、实验目的 1.了解串口的实现原理; 2.掌握串口波特率的计算; 3.掌握与串口收发有关的寄存器设置; 4.利用波特率计算定时器1的初值。 二、实验内容 1.采用中断方式,以4800bps波特率,编写串口收发程序; 2.采用查询方式,以4800bps波特率,编写串口收发程序。 三、实验步骤与结果 实验1. 采用中断方式,以4800bps波特率,编写串口收发程序。 分析:串口有四种工作方式,方式0和方式2的波特率是固定的,本实验不能采用,本实验可选用方式1和方式3。此时波特率的计算为:波特率 =(2SMOD/32)·(T1溢出率),由此,还需要设置T1定时器,定时器1采用方式2,8位自动重装,T1 溢出率 = fosc /{12×[256 -(TH1)]},由于波特率为4800bps,可计算出定时器初值为250。注意TI和RI都需要软件清0。 程序如下: #include void send_char(char p) { SBUF=p;    while(TI==0);    TI=0; } void main() { SCON=0x50; PCON&=0x7f; //SMOD=0    TMOD=0x20;//定时器1自动 29 重装 TH1=250;    TL1=250;    TR1=1;    ES=1;    EA=1;    while(1)    { send_char('a');    } } void uart_rec() interrupt 4 { temp=SBUF; //接收到的数据读出来,放进temp中 实验结果: RI=0; } 结果分析:从以上的结果可以看出,串口以ASCLL码发送了字符‘a’,数值为0X61。 实验2.采用查询方式,以4800bps波特率,编写串口收发程序。 分析:查询方式是通过不断查询TI和RI是否被置位来判断是否有数据发送或接收,若被置位,就执行相应的接收和发送操作。 程序如下: #include void send_char(char p) { SBUF=p;    while(TI==0);    TI=0; } void main() { SCON=0x50; PCON&=0x7f; //SMOD=0    TMOD=0x20;//定时器1自动重装 } 运行结果: TH1=250;    TL1=250;    TR1=1; while(1)   //查询方式接受串口数据 { send_char('a');       send_char('b');       send_char('c'); while(RI==0); temp=SBUF; RI=0; //接收到的 数据读出来,存进temp中 结果分析:从运行结果可以看到,串口成功发送了‘a’、‘b’、‘c’三个字符,由于接收部分要与发送配合实现,在DEBUG环境下无法实现,因此只查 看了发送状态。                                   30 实验八、定时器综合实验 一、实验目的 1.掌握定时器测量外部引脚输入的脉冲时间的原理; 2.掌握频率计设计原理; 3.设计和实现测量外部脉冲时间和频率计程序。 二、实验内容 1. 测量外部引脚输入的脉冲时间; 2. 设计频率计测量外部频率为1HZ~1KHZ,占空比1:1的方波的频率。 三、实验步骤与结果 实验1. 测量外部引脚输入的脉冲时间(时间为50ms-50s)。 分析:本实验选用的是定时器0,需要将GATA设置为1,利用外部中断引脚INT0控制定时器的开始与停止。定时器在开始到停止这段时间一直定时,停止时定时的总时间就为脉冲时间。 程序如下: #include int count=0,timecount=0; void main() { TH0=(65536-50000)/256; //50ms计数器 TL0=(65536-50000)%256;    TMOD=0x09;    EA=1;    ET0=1;    TR0=1;    while(op); timecount=count*50+(TH0*256+TL0)/1000;  //总时间,单位为ms } void timer0() interrupt 1 using 1  { count++; TH0=(65536-50000)/256;    TL0=(65536-50000)%256;    if(count>=1000)    count=0;  } 实验2.设计频率计测量外部频率为1HZ~1KHZ,占空比1:1的方波的频率。 分析:本实验需要用到两个定时器,一个定时器用于定一段时间,另一个定时器用于计数外部脉冲,选用的是定时器1定时1s的时间,在这段时间内,定时器0记录了多少个脉冲,频率就为多少HZ。定时器0计数外部脉冲是通过其对应的引脚P3.4将外部脉冲作为时钟源(计数器模式),计数外部脉冲的个数。由此定时器0的TMOD设置为0101。 程序如下: #include TH1=(65536-50000)/256; //50ms定时器    TL1=(65536-50000)%256;    TH0=0;  //50ms定时器    TL0=0; TMOD=0x15; //定时器1定时1s,定时器0通过外部引脚P3.4计数外部脉冲 EA=1;    ET1=1;    TR1=1;    TR0=1;    while(1)    {          } void timer1() interrupt 3 using 1 if(count==20)  count=0; { TH0=0;  TL0=0;  } puls=TH0*256+TL0; } { count++; TH1=(65536-50000)/256;    TL1=(65536-50000)%256; } 运行结果及结果分析:将程序下载到单片机上进行调试,在DEBUG调试环境下,查看count的数值,可以测量P3.4输入脉冲的频率。 33 通过微控制器接口与技术实验和单片机实验,我学会了利用DOS进入动态调试程序DEBUG进行汇编程序的编写与编译,同时对汇编语言指令系统有了一定的了解,理解了各个寄存器的作用。 学生实验 心得 通过单片机实验,我掌握了C-51的编程方法,对I/O口读写操作、定时器操作、串口操作有了一定的理解,巩固了课堂知识,通过最后一次单片机的综合实验,学会了定时器的高级应用。 学生(签名):                                      年   月   日     指导 教师 评语 成绩评定: 指导教师(签名):                                      年   月   日 34              
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- 91gzw.com 版权所有 湘ICP备2023023988号-2
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务
