1、华科光电 单片机第一次试验报告 微机实验报告实验名称 专业班级 姓名 学号 序号 联系方式 一、任务要求 1.掌握KeilC环境的使用 1)字节拆分、合并:调试e421.asm程序, 观察相关寄存器和单元的内容。 2)数据块填充:调试fill.asm程序,观察相关寄存器和单元的内容。 2. 编写两个十六位数的加法程序。 有两个十六位无符号数,分别存放在从20H和30H开始的数据区中,低八位先存,高八位在后,和存于R3(高八位)和R4(低八位),进位位存于R2。二、设计思路 1.对于两个程序的调试,由于代码已经给出,只需利用软件进调试。 字节拆分程序调试 数据块填充程序调试 2.对于16位无符号
2、数的加法,可以先低位相加,再高位相加,分别存入相应地址。在低位相加时,使用ADD 指令即可,而在高位相加时,应考虑进位,故使用ADDC 指令,考虑到高位相加也可能产生进位,故分配另一个地址存放。三、资源分配 根据题目的条件,将加数与被加数分别存放在以 20H、30H 开始的数据区中,然后将二者之和存放于寄存器 R3(高8位)、R4(低8位),进位位存放于 R2中。四、流程图 五、源代码 (含文件头说明、资源使用说明、语句行注释)File name: test 01.asmDescription: 两个16位数加法的程序Date: 2013/09/30Designed: hahaSource u
3、sed: 20H: 加数A的低位 21H: 加数A的高位 30H: 加数B的低位 31H: 加数B的高位 R4: 和的低位 R3: 和的高位 R2: 和的进位位 ORG 0000H LJMP START ORG 0100HSTART: MOV 20H,# 78H ;将加数存放到相应的内存中 MOV 21H,# 56H MOV 30H,# 76H MOV 31H,# 98H MOV R0, # 20H ;以R0作为被加数的地址索引 MOV R1, # 30H ;以R1作为加数的地址引索引 MOV A, R0 ADD A, R1 ;低字节相加 MOV R4,A ;存放低字节之和至寄存器R4 INC
4、 R0 INC R1 :地址索引加1 MOV A, R0 ADDC A,R1 ;高字节相加带进位位 MOV R3,A ;高字节之和存入R3 CLR A ;将A清零 ADDC A,#00H MOV R2, A ;将进位位存入R2END六、程序测试方法与结果、软件性能分析 测试方法:手动输入两个加数,运行程序,观察结果是否正确。 在调试过程中,跟踪 A、R4、R3、R2的值,看是否与预期相同。 结果:各项指标均与预期相同,程序正确。截图如下附加:思考题 1.怎样查看工作寄存器、SFR、片内RAM、片外RAM及程序代码空间内容?Disassembly 窗口有何作用?答:点击调试后,在左侧Regist
5、er窗口中可以清晰的看到,工作寄存器R0-R7,特殊功能寄存器SFW,和PSW中的内容。再右下角Memory窗口中,输入d:0x_可以看片内RAM的内容;输入x:0x_可以查看片外RAM的内容。输入c:0x_可以查看程序代码空间内容。Disassembly窗口的作用是显示每一步指令的执行情况,包括源代码的储存位置机器码和相应的助记符。2.字节拆分、合并还有哪些方法,举一例说明。答:可以使用逻辑运算类指令屏蔽高四位和第四位,再对第四位和高四位进行操作,然后利用SWAP指令,就可以完成字节的拆分和合并。不妨设20H单元中有待操作数86H,要将其字节拆分,高四位存于R3,低四位存于R4,接着进行字节
6、的合并,将合并后的结果存于R2中,源代码如下: ORG 0000H LJMP START ORG 0100HSTART: MOV 20H,#86H ;20H单元赋初值 MOV A,20H ;20H单元的内容赋给A ANL A,#0FH ;高四位清零 MOV R4,A ;低四位存于R4 MOV A ,20H ;20H单元内容赋给A ANL A, #0F0H ;低四位清零 SWAP A ;低四位移至高四位 MOV R3,A ;结果存于R3,字节拆分结束 SWAP A ;移回低四位 ADD A, R4 ;A中的内容与R4的内容相加 MOV R2,A ;结果存于R2中,字节合并完成 HERE: SJM
7、P HERE END调试结果如下: 字节拆分 字节合并3.若按递减一的规律填充数据块,应如何修改程序 答:程序的修改后的源代码如下: ORG 0000H LJMP START ORG 0100HSTART: MOV A,#0FFH ;将立即数OFFH存入累加器A MOV R0,#00H ;RO指向00H MOV DPTR, #7000H ;DPTR指向7000HFILL: MOVX DPTR, A ; 传递到片外RAM DEC A ; A减一 INC DPTR ; 数据指针加一 INC R0 ;修改循环计数器 CJNE R0, #00H, FILL ; 判断是否结束HERE: SJMP HER
8、E ; 原地踏步 END 调试截图如下: 4. 若从7020H单元开始,连续填充10个字节,应该如何修改程序? ORG 0000H LJMP START ORG 0100HSTART: CLR A ;累加器A清零 MOV R0, #0AH ;设计数器初值 MOV DPTR, #7020H ;设数据指针初值FILL: MOVX DPTR, A ;传送到片外RAM INC A ;累加器A加一 INC DPTR ;数据指针加一 DJNZ R0, FILL ;判断是否结束HERE: SJMP HERE ;原地踏步 END结果如图5.若完成双字节BCD码加法,应如何修改程序?不妨设第一个BCD码存于40
9、H,41H;第二个存于45H,46H程序代码: ORG 000H LJMP START ORG 0100HSTART: MOV A,40H ;将加数低8位存入A ADD A,45H ;两者低8位相加,和存于A DA A ;二-十进制转化 MOV 50H,A ;和的低8位存于50H MOV A, 41H ;将加数高位存于A ADDC A, 46H ;两者高8位相加,和存于A DA A ;二十进制转化 MOV 51H, A ;和的高位存于51HHERE: SJMP HERE END七、心得与体会 通过本次试验,了解了keil软件的安装与使用,强化了各种转移指令,运算指令的应用。基本熟悉了汇编语言的格式与使用规则,受益匪浅。在独立完成实验的同时,锻炼了我们保持冷静,独立思考的能力。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1