微机实验一
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片微型计算机实验
第一次实验
姓名:Elliott
班级: xxxxxx
学号: xxxxxxxxx
电话: xxxxxxxxxx
一、任务要求
1.调试例程,观察相关寄存器和单元的内容。
2.编写两个十六位数的加法程序。有两个十六位无符号数,分别存放在从20H和30H开
始的数据区中,低八位先存,高八位在后,和存于R3(高八位)和R4(低八位),进位位存于R2。
3.编写两个双字节BCD码的加法程序。有两个双字节BCD码,分别存放在从20H和30H
开始的数据区中,低八位先存,高八位在后,和存于R3(高八位)和R4(低八位),进位位存于R2。
4.编写程序,使之实现从片外RAM的7020H单元开始,连续填充10个字节的数据的功
能。
5.编写程序,实现对片外RAM按递减1规律填充数据块的功能。
二、设计思路
1.无符号十六位数加法
对于无符号十六位加法,低八位使用不带标志位的加法,相加后存放。由于此处可能有进位,所以下一次加法时要用带进位标志位的加法。为了避免程序最初时CY标志位的随机取值影响带高八位运算的结果,最好在做第一加法的之前将CY置零。获取最高位进位位时,还是采用ADDC指令,所以两个加数应该都是0。
为了程序的扩展性能,读取加数时,采用R0和R1做指针,这样只要把加数的初始位置赋给R0和R1后,便可以通过R0和R1的自加实现自动取下一位值。这样有利于多位数相加时的循环实现,同时程序的移植性也得到提高。
2.双字节BCD码加法
本程序的实现方式和无符号十六位加法的实现方式没有本质上的区别,不同之处在于通过加法获得相加的结果后,要用DA指令将数据调整为BCD码,然后再存储数据。
3.顺序填充数据
对于片外RAM的数据访问,只有通过MOVX @DPTR,A这条指令实现,所以要写入的数据得先存放在A当中,DPTR中存放地址。每次写入数据后,将DPTR的数据加一,指针向下移一位。
由于要写入大量的数据,所以要采用循环,采用工作寄存器R0来计数,用CJNE 指令来实现循环的控制。
4.逆序填充数据
逆序填充的程序和顺序填充的程序并没有太大的区别,但是由于DPTR没有自减一的指令,所以需要换一种方式来实现。DPTR实际上是DPH和DPL两个字节组成的,而DPH和DPL都具有自减一的指令,通过对DPH和DPL的修改便可以实现逆序填充。
三、资源分配
1.无符号十六位加法
20H、21H、30H、31H:存放加数
R0、R1:用做数据指针
R2、R3、R4:存放结果
2.双字节BCD码加法
20H、21H、30H、31H:存放加数
R0、R1:用做数据指针
R2、R3、R4:存放结果
3.顺序填充
片外RAM的7020H至702AH:存放数据R0:存放数据用于循环控制
累加器A:存放要写入片外RAM的数据4.逆序填充
片外RAM的7020H至702AH:存放数据R0:存放数据用于循环控制
R1:用于保护累加器A中的内容
累加器A:存放要写入片外RAM的数据
四、流程图
1.无符号十六位数加法
2.双字节BCD码加法
3.顺序填充
4.逆序填充
五、源代码
1.无符号十六位加法
ORG 0000H
LJMP MAIN
ORG 0200H
MAIN: MOV 20H, #0A0H
MOV 21H, #11H
MOV 30H, #0A0H
MOV 31H, #23H
MOV R0 , #20H ;R0指向加数1首地址
MOV R1 , #30H ;R1指向加数2首地址
CLR C
MOV A , @ R0
ADD A , @ R1
MOV R4 , A ;不带标志位相加,结果存放于R4
INC R0
INC R1 ;修正指针
MOV A , @ R0
ADDC A , @ R1 ;带符号相加
MOV R3 , A ;存放
MOV R2 , #00H ;R2置零
MOV A , #00H ;A清零
ADDC A , R2
MOV R2 , A ;存放进位位
SJMP $
END
2.双字节BCD码加法
ORG 0000H
LJMP MAIN
ORG 0200H
MAIN: MOV 20H, #55H
MOV 21H, #11H
MOV 30H, #50H
MOV 31H, #23H ;赋值
MOV R0,#20H ;R0指向加数1首地址
MOV R1,#30H ;R1指向加数2首地址
CLR C
MOV A , @ R0
ADD A , @ R1
DA A ;修正结果
MOV R4 , A ;结果存放于R4
INC R0 ;修正指针
INC R1 ;修正指针
MOV A , @ R0
ADDC A , @ R1 ;带进位相加
DA A ;修正结果
MOV R3 , A ;存放结果
MOV R2 , #00H ;R2清零
MOV A , #00H ;A清零
ADDC A , R2 ;带进位位加法
DA A ;修正结果
MOV R2 , A ;存放
SJMP $ ;原地踏步
END
3.顺序填充
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: MOV SP, #40H