1. 实验目的
(1)正确使用单片机的加减运算指令
(2)掌握不同指令对于程序状态字的影响及程序状态字的意义、用处 (3)掌握ADD,ADDC,SUBB和DA A等指令的用法 (4)学习模块化程序设计方案
2. 实验内容
(1)编写3字节二进制加法子程序,并用主程序调用不同的加数和被加数来检测该子程序的正确性。需考虑有进位和无进位情况。
程序入口为:加 数:22H,21H,20H三字节,22H为最高位
被加数:32H,31H,30H三字节,32H为最高位
程序出口为:23H,22H,21H,20H四字节,23H为最高位
ORG 0000H LJMP MAIN ORG 0030H
MAIN: MOV 20H,#0f0H
MOV 21H,#0F0H MOV 22H,#0FFH MOV 30H,#02 MOV 31H,#09 MOV 32H,#05 ACALL JIAFA SJMP $
JIAFA:
MOV R0, #20H ;加数1地址、和的地址
MOV R1, #30H ;加数2地址 CLR C
MOV R2, #3 ;循环3次 A_LOOP:
MOV A, @R0 ;取 ADDC A, @R1 ;加 MOV @R0, A ;存 INC R0 INC R1
DJNZ R2, A_LOOP CLR A
ADDC A, #0 ;得到进位
MOV 23H, A ;保存 RET END
(2)编写3字节二进制减法子程序,用主程序调用多组数据来调试,需考虑无借位和有借位两种情况。
入口:被减数:52H,51H,50H,50H为最低位 减数:42H,41H,40H,40H为最低位
出口:差:外部数据存贮器2003H~2000H(2003H为最高位)
ORG 0000H LJMP MAIN ORG 0030H
MAIN:
MOV 50H,#02 MOV 51H,#09 MOV 52H,#05
MOV 40H,#30H MOV 41H,#30H MOV 42H,#30H
ACALL JIANFA SJMP $ JIANFA:
MOV DPTR,#2000H
MOV R0, #50H ;被减数地址 MOV R1, #40H ;减数地址 CLR C
MOV R2, #3 ;循环3次 A_LOOP:
MOV A, @R0 ;取 SUBB A, @R1 ;减 MOVX @DPTR, A ;存
INC R0 INC R1 INC DPTR
DJNZ R2, A_LOOP CLR A
SUBB A, #0 ;得到借位
MOV DPTR,#2003H
MOVX @DPTR, A ;保存 RET END
(3)编写10位十进制加法子程序(十进制数采用压缩BCD码存放)
入口:加数: 24H-20H,低地址放低字节
被加数: 29H-25H,低地址放低字节
要求调用多组数据调试,注意观察PSW的变化,理解DA A指令的含义。
ORG 0000H
LJMP MAIN ORG 0030H
MAIN:
MOV 20H,#99H MOV 21H,#78H MOV 22H,#56H MOV 23H,#34H MOV 24H,#12H
MOV 25H,#88H MOV 26H,#88H MOV 27H,#88H MOV 28H,#88H MOV 29H,#88H
ACALL BCD5 SJMP $ BCD5:
MOV DPTR ,#2000H ;5 MOV R0,#20H MOV R1,#25H MOV R7,#5
CLR C LOOP:
MOV A,@R0 ADDC A,@R1 DA A
MOVX @DPTR, A ; INC R0 INC R1 INC DPTR
DJNZ R7 , LOOP ;5 RET END 存 字节加完 字节BCD 加法子程序
因篇幅问题不能全部显示,请点此查看更多更全内容