华科光电 单片机第一次试验报告.docx
《华科光电 单片机第一次试验报告.docx》由会员分享,可在线阅读,更多相关《华科光电 单片机第一次试验报告.docx(11页珍藏版)》请在冰豆网上搜索。
华科光电单片机第一次试验报告
《微机实验》报告
实验名称
专业班级姓名学号序号
联系方式
一、任务要求
1.掌握KeilC环境的使用
1)字节拆分、合并:
调试e421.asm程序,观察相关寄存器和单元的内容。
2)数据块填充:
调试fill.asm程序,观察相关寄存器和单元的内容。
2.编写两个十六位数的加法程序。
有两个十六位无符号数,分别存放在从20H和30H开始的数据区中,低八位先存,高八位在后,和存于R3(高八位)和R4(低八位),进位位存于R2。
二、设计思路
1.对于两个程序的调试,由于代码已经给出,只需利用软件进调试。
字节拆分程序调试
数据块填充程序调试
2.对于16位无符号数的加法,可以先低位相加,再高位相加,分别存入相应地址。
在低位相加时,使用ADD指令即可,而在高位相加时,应考虑进位,故使用ADDC指令,考虑到高位相加也可能产生进位,故分配另一个地址存放。
三、资源分配
根据题目的条件,将加数与被加数分别存放在以20H、30H开始的数据区中,然后将二者之和存放于寄存器R3(高8位)、R4(低8位),进位位存放于R2中。
四、流程图
五、源代码(含文件头说明、资源使用说明、语句行注释)
Filename:
test01.asm
Description:
两个16位数加法的程序
Date:
2013/09/30
Designed:
haha
Sourceused:
20H:
加数A的低位
21H:
加数A的高位
30H:
加数B的低位
31H:
加数B的高位
R4:
和的低位
R3:
和的高位
R2:
和的进位位
ORG0000H
LJMPSTART
ORG0100H
START:
MOV20H,#78H;将加数存放到相应的内存中
MOV21H,#56H
MOV30H,#76H
MOV31H,#98H
MOVR0,#20H;以R0作为被加数的地址索引
MOVR1,#30H;以R1作为加数的地址引索引
MOVA,@R0
ADDA,@R1;低字节相加
MOVR4,A;存放低字节之和至寄存器R4
INCR0
INCR1:
地址索引加1
MOVA,@R0
ADDCA,@R1;高字节相加带进位位
MOVR3,A;高字节之和存入R3
CLRA;将A清零
ADDCA,#00H
MOVR2,A;将进位位存入R2
END
六、程序测试方法与结果、软件性能分析
测试方法:
手动输入两个加数,运行程序,观察结果是否正确。
在调试过程中,跟踪A、R4、R3、R2的值,看是否与预期相同。
结果:
各项指标均与预期相同,程序正确。
截图如下
附加:
思考题
1.怎样查看工作寄存器、SFR、片内RAM、片外RAM及程序代码空间内容?
Disassembly窗口有何作用?
答:
点击调试后,在左侧Register窗口中可以清晰的看到,工作寄存器R0-R7,特殊功能寄存器SFW,和PSW中的内容。
再右下角Memory窗口中,输入d:
0x____可以看片内RAM的内容;输入x:
0x____可以查看片外RAM的内容。
输入c:
0x____可以查看程序代码空间内容。
Disassembly窗口的作用是显示每一步指令的执行情况,包括源代码的储存位置机器码和相应的助记符。
2.字节拆分、合并还有哪些方法,举一例说明。
答:
可以使用逻辑运算类指令屏蔽高四位和第四位,再对第四位和高四位进行操作,然后利用SWAP指令,就可以完成字节的拆分和合并。
不妨设20H单元中有待操作数86H,要将其字节拆分,高四位存于R3,低四位存于R4,接着进行字节的合并,将合并后的结果存于R2中,源代码如下:
ORG0000H
LJMPSTART
ORG0100H
START:
MOV20H,#86H;20H单元赋初值
MOVA,20H;20H单元的内容赋给A
ANLA,#0FH;高四位清零
MOVR4,A;低四位存于R4
MOVA,20H;20H单元内容赋给A
ANLA,#0F0H;低四位清零
SWAPA;低四位移至高四位
MOVR3,A;结果存于R3,字节拆分结束
SWAPA;移回低四位
ADDA,R4;A中的内容与R4的内容相加
MOVR2,A;结果存于R2中,字节合并完成
HERE:
SJMPHERE
END
调试结果如下:
字节拆分字节合并
3.若按递减一的规律填充数据块,应如何修改程序
答:
程序的修改后的源代码如下:
ORG0000H
LJMPSTART
ORG0100H
START:
MOVA,#0FFH;将立即数OFFH存入累加器A
MOVR0,#00H;RO指向00H
MOVDPTR,#7000H;DPTR指向7000H
FILL:
MOVX@DPTR,A;传递到片外RAM
DECA;A减一
INCDPTR;数据指针加一
INCR0;修改循环计数器
CJNER0,#00H,FILL;判断是否结束
HERE:
SJMPHERE;原地踏步
END
调试截图如下:
4.若从7020H单元开始,连续填充10个字节,应该如何修改程序?
ORG0000H
LJMPSTART
ORG0100H
START:
CLRA;累加器A清零
MOVR0,#0AH;设计数器初值
MOVDPTR,#7020H;设数据指针初值
FILL:
MOVX@DPTR,A;传送到片外RAM
INCA;累加器A加一
INCDPTR;数据指针加一
DJNZR0,FILL;判断是否结束
HERE:
SJMPHERE;原地踏步
END
结果如图
5.若完成双字节BCD码加法,应如何修改程序?
不妨设第一个BCD码存于40H,41H;第二个存于45H,46H
程序代码:
ORG000H
LJMPSTART
ORG0100H
START:
MOVA,40H;将加数低8位存入A
ADDA,45H;两者低8位相加,和存于A
DAA;二-十进制转化
MOV50H,A;和的低8位存于50H
MOVA,41H;将加数高位存于A
ADDCA,46H;两者高8位相加,和存于A
DAA;二—十进制转化
MOV51H,A;和的高位存于51H
HERE:
SJMPHERE
END
七、心得与体会
通过本次试验,了解了keil软件的安装与使用,强化了各种转移指令,运算指令的应用。
基本熟悉了汇编语言的格式与使用规则,受益匪浅。
在独立完成实验的同时,锻炼了我们保持冷静,独立思考的能力。