Keil 的使用与汇编语言上机操作 实验报告.docx
- 文档编号:28950713
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:23
- 大小:527.27KB
Keil 的使用与汇编语言上机操作 实验报告.docx
《Keil 的使用与汇编语言上机操作 实验报告.docx》由会员分享,可在线阅读,更多相关《Keil 的使用与汇编语言上机操作 实验报告.docx(23页珍藏版)》请在冰豆网上搜索。
Keil的使用与汇编语言上机操作实验报告
实验名称Keil的使用与汇编语言上机操作
指导教师罗志祥
专业班级光电1406姓名段昳晖学号U2014*****
联系电话137******
1、任务要求
1.掌握Keil环境的使用
1)字节拆分、合并:
调试e421.asm程序,观察相关寄存器和单元的内容。
2)数据块填充:
调试fill.asm程序,观察相关寄存器和单元的内容。
2.编写多个十六位数的加法程序
有4个十六位无符号数,连续存放在20H开始的片上数据区中,低八位先存,高八位在后。
要求:
和存于R3(高八位)和R2(低八位),进位位存于R4.
2、设计思路
1.掌握Keil环境的使用
1)字节拆分、合并
利用汇编语言中的XCHD和SWAP两个语句来实现将八位二进制数拆分为两个四位二进制数并分别存储于不同的存储空间的功能,BCD码与30H相或(加上30H)得到ASCII码。
将两个ASCII码和0FH相与(高四位清零)得到BCD码,利用SWAP语句将高位数放至高四位,将高位数和低位数相或可实现字节的合并。
2)数据块填充
将R0用作计数器,DPTR用作片外数据指针,A作为原始数据来源,依顺序在片外的存储单元内容填充数据。
利用循环语句来减少程序长度,并控制填充单元个数为片外100H个。
利用RO的进位实现,当且仅当RO=00H时,结束循环赋值过程,此时R0已经经历了从00H-0FFH的过程,即计数周期为100。
同时赋值循环也历经了一百次,完成了将片外RAM7000H-70FFH单元按数据依次递增规律的填充。
2.多个十六位数的加法程序
以2个十六位无符号数相加为基础,将输入的4个无符号数(以a、b、c、d代表),两两相加,所得的2个和,再作为加数,求和,得到4个数的和。
其中需要注意的是进位的处理。
四数求和进位,不仅有两和数相加产出的进位还要加上产生两和数时的进位。
其中2个十六位无符号数相加的原理为,先对两数低位求和,提取出其进位,加到两数高位和中,并将高位求和进位,即两数求和进位保存下来。
3、资源分配
1.掌握Keil环境的使用
1)字节拆分、合并
一字节BCD码存于30H:
;
两字节ASCII码存于31H,32H
2)数据块填充
RO:
计数器
DPTR:
片外数据指针
7000H-70FFH,数据填充单元
2.多个十六位数的加法程序
1)加数存储:
(1)加数a:
低8位存于20H;高8位存于21H
(2)加数b:
低8位存于22H;高8位存于23H
(3)加数c:
低8位存于24H;高8位存于25H
(4)加数d:
低8位存于26H;高8位存于27H
2)和储存
(1)a、b低位相加和,存于40H;a、b高位相加和,存于41H
(2)c、d低位相加和,存于50H;c、d低位相加和,存于51H
(3)4数低位相加和,存于R2;4数高位相加和,存于R3
3)进位数储存
(1)a、b相加进位,存于42H
(2)c、d相加进位,存于52H
(3)4数相加进位,存于R4
4、流程图
1.掌握Keil环境的使用
1)字节拆分、合并:
调试e421.asm程序,观察相关寄存器和单元的内容。
2)数据块填充:
调试fill.asm程序,观察相关寄存器和单元的内容。
2.编写多个十六位数的加法程序
5、源代码(含文件头说明、语句行注释)
1.掌握Keil环境的使用
1)字节拆分、合并
Filename:
e421.asm
Description:
1字节BCD码转换为2字节ASCII
2字节ASCII码转化为1字节BCD码
Date:
Designedby:
Sourceused:
30H:
BCDdata
31H,32H:
ASCIIdata
31H,32H->33H
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVSP,#40H;赋堆栈指针
MOV30H,#96H;30H单元赋值
MOVR0,#32H;R0指针赋值
MOV@R0,#0;32H单元清零
MOVA,30H
XCHDA,@R0;拆分字节
ORL32H,#30H;转换为ASCII
SWAPA
ORLA,#30H;转换为ASCII
MOV31H,A;结果存于31H单元
MOVA,31H;从31H单元取值
ANLA,#0FH;转换为BCD
SWAPA
MOV33H,A;结果存于33H单元
MOVA,32H;从32H单元取值
ANLA,#0FH;转换为BCD
ORL33H,A;合并字节
HERE:
SJMPHERE;踏步
END
2)数据块填充
Filename:
fill.asm
Date:
2011.8.20
Designedby:
CDH
Sourceused:
R0:
计数器
DPTR:
片外数据指针
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVSP,#40H
FILL:
CLRA;A寄存器清零
MOVR0,#00H;设循环计数器
MOVDPTR,#7000H;设数据指针
FILL1:
MOVX@DPTR,A;传送到片外RAM
INCA;A内容加1
INCDPTR;修改数据指针
INCR0;修改循环计数器
CJNER0,#00H,FILL1;判断是否结束,RO=00H,继续执行,否则跳转至FILL1
HERE:
SJMPHERE;原地踏步
END
2.编写多个十六位数的加法程序
Filename:
add.asm
Description:
4个16位无符号数的加法,输出运算结果
Date:
2016.9.23
Designedby:
DYH
Sourceused:
R0、R1:
地址指针
R2:
存放4数和的低位
R3:
存放4数和的高位
R4:
存放4数和的进位
20H-27H:
存放a、b、c、d加数
40H:
存放a、b低位相加和
41H:
存放a、b高位相加和
42H:
存放a、b相加进位
50H:
存放c、d低位相加和
51H:
存放c、d高位位相加和
52H:
存放c、d相加进位
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
CLRC
;abcd,加数赋值
MOV20H,#01H;a_min
MOV21H,#11H;a_max
MOV22H,#02H;b_min
MOV23H,#22H;b_max
MOV24H,#03H;c_min
MOV25H,#33H;c_max
MOV26H,#04H;d_min
MOV27H,#44H;d_max
;ab求和
MOVR0,#20H;地址指针赋值,指向ab低位
MOVR1,#22H
MOVA,@R0
ADDA,@R1
MOV40H,A;低位和存于40H
INCR0;地址+1.指向ab高位
INCR1
MOVA,@R0
ADDCA,#00H;低位求和进位
ADDA,@R1;求高位和
MOV41H,A;ab高位和存于41H
CLRA
ADDCA,#00H;ab求和进位
MOV42H,;ab求和进位存于42H
;cd求和
MOVR0,#24H;地址指针赋值,指向cd低位
MOVR1,#26H
MOVA,@R0
ADDA,@R1
MOV50H,A;低位和存于50H
INCR0;地址+1.指向cd高位
INCR1
MOVA,@R0
ADDCA,#00H;低位求和进位
ADDA,@R1;求cd高位和
MOV51H,A;cd高位和存于51H
CLRA
ADDCA,#00H;cd求和进位
MOV52H,A;cd求和进位存于52H
;abcd求和
MOVR0,#40H;地址指针赋值,指向ab和及cd和低位
MOVR1,#50H
MOVA,@R0
ADDA,@R1
MOVR2,A;低位和存于R2
INCR0;地址+1.指向ab的和以及cd的和高位
INCR1
MOVA,@R0
ADDCA,#00H;低位求和进位
ADDA,@R1;求高位和
MOVR3,A;abcd高位和存于R3
;求4数求和的进位
CLRA
ADDCA,#00H;和数高位求和进位
ADDA,42H;
ADDA,52H;;加上分开计算ab和、cd和时的进位
MOVR4,A;abcd求和进位存于R4
;最终结果为adder={R4,R3,R2},进位为R4
HERE:
SJMPHERE;原地踏步
END
6、程序测试方法与结果
1.掌握Keil环境的使用
1)字节拆分、合并(以96H,单步测试)
可见拆分后的结果已经存放在31H和32H
合并后结果存放在33H
2)数据块填充:
调试fill.asm程序,观察相关寄存器和单元的内容。
程序执行后的片外存储器的内容
程序执行后的寄存器状态
2.编写多个十六位数的加法程序
考虑到本程序的目的是求4个16位无符号数的和,考虑到进位的问题,于是选取了4组数据测试程序的正确性
1.无进位
观察42H以及52H,均无进位
结果为AA0AH,无进位,经验证正确
2.2数求和无进位,4数求和有进位
观察42H以及52H,ab求和无进位,cd求和无进位
结果为BA0AH,无进位,经验证正确
3.2数求和有进位,4数求和有进位
观察42H以及52H,ab低位求和有进位,cd求和有进位
此时4数求和无进位,经检查调试发现了问题
(调试前)
(调试后)
调试后结果如下
结果为027342H,有进位,经验证结果正确
思考题
1.怎样查看工作寄存器、SFR、片内RAM、片外RAM及程序代码空间内容?
Disassembly窗口有何作用?
选择Debug下的Start/StopDebugSession,在界面的左侧会出先程序代码的空间地址内容,点选register,查看工作寄存器内容。
在debug模式下,点击View菜单下的MemoryWindow命令或对应的按钮,就会显示或隐藏存储器窗口。
在4个显示区上边的“Address”栏输入不同类型的地址,可以观察不同的存储区域。
在Address栏输入D:
xx,可观察片内RAM直接寻址的data区;
在Address栏输入I:
xx,可观察片内RAM间接寻址的idata区;
在Address栏输入X:
xxxx,可观察片外RAM的xdata区;
在Address栏输入C:
xxxx,可观察程序存储器ROMcode区。
2.字节拆分、合并还有哪些方法,举一例说明。
字节拆分可以利用与运算ANL,例如将20H单元中的数据从中间拆分,低字节存于21H,高字节存于22H,程序如下:
MOVA,20H
ANLA,#0FH
MOV21H,A
MOVA,20H
MOV22H,A
合并字节可以利用或运算ORL
SWAPA
MOVA,21H
ORLA,22H
MOV30H,A
3.若按递减1规律填充数据块,应如何修改程序?
原程序
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVSP,#40H
FILL:
CLRA;A寄存器清零
MOVR0,#00H;设循环计数器
MOVDPTR,#7000H;设数据指针
FILL1:
MOVX@DPTR,A;传送到片外RAM
INCA;A内容加1
INCDPTR;修改数据指针
INCR0;修改循环计数器
CJNER0,#00H,FILL1;判断是否结束,RO=00H,继续执行,否则跳转至FILL1
HERE:
SJMPHERE;原地踏步
END
修改后
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVSP,#40H
FILL:
CLRA;A寄存器清零
MOVR0,#00H;设循环计数器
MOVDPTR,#70FFH;设数据指针
FILL1:
MOVX@DPTR,A;传送到片外RAM
INCA;A内容加1
DECDPTR;修改数据指针
INCR0;修改循环计数器
CJNER0,#00H,FILL1;判断是否结束,RO=00H,继续执行,否则跳转至FILL1
HERE:
SJMPHERE;原地踏步
END
4.若从7010H单元开始,连续填充20个字节,应该如何修改程序?
原程序
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVSP,#40H
FILL:
CLRA;A寄存器清零
MOVR0,#00H;设循环计数器
MOVDPTR,#7000H;设数据指针
FILL1:
MOVX@DPTR,A;传送到片外RAM
INCA;A内容加1
INCDPTR;修改数据指针
INCR0;修改循环计数器
CJNER0,#00H,FILL1;判断是否结束,RO=00H,继续执行,否则跳转至FILL1
HERE:
SJMPHERE;原地踏步
END
修改后
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVSP,#40H
FILL:
CLRA;A寄存器清零
MOVR0,#0ECH;设循环计数器
MOVDPTR,#7010H;设数据指针
FILL1:
MOVX@DPTR,A;传送到片外RAM
INCA;A内容加1
INCDPTR;修改数据指针
INCR0;修改循环计数器
CJNER0,#00H,FILL1;判断是否结束,RO=00H,继续执行,否则跳转至FILL1
HERE:
SJMPHERE;原地踏步
END
5.若完成双字节BCD码加法,应如何修改程序?
可以运用二—十进制调整指令,在ADD、ADDC后加上DA,进行十进制修正。
本人承诺:
本报告内容真实,无伪造数据,无抄袭他人成果。
本人完全了解学校相关规定,如若违反,愿意承担其后果。
签字:
2016年9月25日
其它说明:
1.标题:
黑体,小四号
2.正文:
宋体,五号,1.5倍行距
3.流程图使用SmartDraw7或Visio软件绘制
4.不要加封面
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Keil 的使用与汇编语言上机操作 实验报告 使用 汇编语言 上机 操作 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)