微机实验报告1Word文档下载推荐.docx
《微机实验报告1Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《微机实验报告1Word文档下载推荐.docx(11页珍藏版)》请在冰豆网上搜索。
3.两个十六位数加法程序:
把第一个十六位无符号数的地八位和高八位分别存于20H和21H中,把第二个十六位无符号数的地八位和高八位分别存于30H和31H中,对20H和30H中的两个低八位进行ADD加法操作,结果存于R4中;
然后对21H和31H中的两个高八位进行ADDC带进位的加法操作,结果存于R3中.然后将累加器A清零,并和#00H进行ADDC带进位的加法操作,结果产生进位数并存于R2中,程序结束。
三、资源分配
1.字节拆分、合并程序:
片30H单位存放原BCD码,31H和32H存放拆分后的两个ASCII码,33H存放合并后的BCD码。
2.数据块填充程序:
R0作为计数器,DPTR作为数据指针,片外RAM空间从7000H开始填充。
3.两个十六位数加法程序:
20H,21H:
第一个数的低八位和高八位30H,31H:
第二个数的低八位和高八位R4:
加法结果的低八位R3:
加法结果的高八位R2:
加法结果的进位
4、流程图
1.字节拆分、合并程序2.数据块填充程序3.两个十六进制数相加程序
五、源代码(含文件头说明、语句行注释)
1.字节拆分、合并程序
Filename:
e421.asm
Description:
1字节BCD码转换为2字节ASCII
2字节ASCII码转化为1字节BCD码
Sourceused:
30H:
BCDdata
31H,32H:
ASCIIdata
31H,32H->
33H
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVSP,#40H;
赋堆栈指针
MOV30H,#49H;
30H单元赋值
MOVR0,#32H;
R0指针赋值
MOVR0,#0;
32H单元清零
MOVA,30H
XCHDA,R0;
拆分字节
ORL32H,#30H;
转换为ASCII
SWAPA
ORLA,#30H;
MOV31H,A;
结果存于31H单元
MOVA,31H;
从31H单元取值
ANLA,#0FH;
转换为BCD
SWAPA
MOV33H,A;
结果存于33H单元
MOVA,32H;
从32H单元取值
ORL33H,A;
合并字节
HERE:
SJMPHERE;
踏步
END
将片外RAM7000H-70FFH单元按一定规律填充
fill.asm
R0:
计数器
DPTR:
片外数据指针
ORG0000H
LJMPMAIN
ORG0100H
MOVSP,#40H
FILL:
CLRA;
A寄存器清零
MOVR0,#00H;
设循环计数器
MOVDPTR,#7000H;
设数据指针
FILL1:
MOVXDPTR,A;
传送到片外RAM
INCA;
A容加1
INCDPTR;
修改数据指针
INCR0;
修改循环计数器
CJNER0,#00H,FILL1;
判断是否结束
SJMPHERE;
原地踏步
add.asm
ORG0000H
LJMPMAIN
CLRC;
进位清零
MOV20H,#11H;
赋值
MOV21H,#19H
MOV30H,#90H
MOV31H,#09H
MOVR0,#20H;
置数据指针
MOVR1,#30H
MOVA,R0;
取第一个数低位
ADDA,R1;
两位数低位相加
MOVR4,A;
存“和”低位
ADDCA,#00H;
处理地位相加进位
INCR0;
修改指针
INCR1
取第一个数高位
ADDCA,R1;
两数高位相加
MOVR3,A;
存“和”高位
CLRA
ADDCA,#00H;
处理高位相加进位
MOVR2,A;
最终进位存于R2
SJMPHERE;
END
6、程序测试方法与结果
测试方法:
单步调试观察寄存器变量和片RAM的存储空间。
结果如图:
性能分析:
该程序能很方便地实现将一个BCD码拆分为两个ASCII码以及将两个ASCII码合并成一个BCD码的功能。
利用程序的运行和停止控制来观察最终的寄存器变量和片RAM的存储空间。
从寄存器变量DPTR最后的取值(7100H)
来看,该程序能实现片外RAM从7000H到70FFH的数据填充。
程序中利用R0从00H到FFH的计数中产生的进位很巧妙地控制了循环的次数。
3.两个十六进制数相加
手动输入两个加数,运行程序,观察结果是否正确。
在调试过程中,跟踪A,R2,R3,R4的值,看是否与预期相同。
结果:
输入两个十六进制数为1911H和0990H,得出合数为22A1H,进位为0,各项指标均与预期相同,程序正确。
7、思考题
1.怎样查看工作寄存器、SFR、片RAM、片外RAM及程序代码空间容?
Disassembly窗口有何作用?
(1)选择Debug下的Start/StopDebugSession,在界面的左侧会出先程序代码的空间地址容
(2)Disassembly窗口可以显示编译之后的汇编代码
2.字节拆分、合并还有哪些方法,举一例说明
(1)字节拆分可以利用与运算ANL,例如将30H单元中的数据从中间拆分,低字节存于31H,高字节存于32H:
MOVA,30H
ANLA,#0FH
MOV31H,A
MOVA,30H
ANLA,#F0H
MOV32H,A
(2)合并字节可以利用或运算ORL,例如将31H单元中的数据和32H单元中的数据合并,结果存放于30H中:
MOVA,31H
SWAPA
ORLA,32H
MOV30H,A
3.若按递减1规律填充数据块,应如何修改程序?
修改后程序如下
MOVR0,#FFH;
MOVDPTR,#70FFH;
DECA;
A容减1
DECDPTR;
DECR0;
CJNER0,#FFH,FILL1;
4.若从7020H单元开始,连续填充10个字节,应该如何修改程序?
MOVSP,#40H
MOVR0,#00H;
MOVDPTR,#7020H;
INCDPTR;
CJNER0,#10H,FILL1;
5.若完成双字节BCD码加法,应如何修改程序?
ORG0000H
ORG0100H
MOVSP,#40H
MOV20H,#0ABH
MOV21H,#99H
MOV30H,#0CDH
MOV31H,#0EFH
MOVA,20H
ADDA,30H
DAA
MOVR4,A
MOVA,21H
ADDCA,31H
MOVR3,A
CLRA
ADDCA,#00H
MOVR2,A
SJMP$
END
本人承诺:
本报告内容真实,无伪造数据,无抄袭他人成果。
本人完全了解学校相关规定,如若违反,愿意承担其后果。
签字:
年月日