;启动入口
ORG 0000H ;复位启动
LJMP START ;
ORG 0100H ;
;
;主程序
START: MOV DPTR,#NUM ;数据区首地址
MOV B,#32 ;32字节求和
CLR A ;
MOV X,A ;清零和存储单元
MOV Y,A
MOV Z,A
LOOP: CLR A ;
MOVC A,@A+DPTR ;取当前字节数据
ADD A,X ;累加和
MOV X,A
MOV A,Y
ADDC A,#0
MOV Y,A
INC DPTR ;指向下一单元数据
DJNZ B,LOOP ;加完32字节
JMP $ ;死循环
;
ORG 0200H ;开辟数据区
NUM DB 32,2,5,4,9,220,234,7 ;
DB 11,22,51,42,93,220,234,17 ;
DB 31,32,35,43,39,220,234,37 ;
DB 91,82,45,74,89,220,234,97 ;
X EQU 70H ;和存储单元
Y EQU 71H ;
END ;
简单,不用循环结构。
MOV A, 40H
ADD A, 43H
MOV 50H,A
MOV A, 41H
ADDC A, 44H
MOV 51H,A
MOV A, 42H
ADDC A, 45H
MOV 52H,A
MOV 20H.0,C
;完
堆栈保护?用中断来做三个字节数的相加是吧?我只能给你说下此程序的整个流程。
1. 进行现场保护,保存工作寄存器,状态寄存器值等中断中用到的寄存器。
2. 将求和用的寄存器(至少4个字节)清零;
3. 将最低字节被加数送入工作寄存器,加数最低字节与工作寄存器相加,结果存在工作寄存器;
4.工作寄存器内容送入和的最低字节,如有进位和的第2字节加1;
5. .将第2字节被加数送入工作寄存器,和的第2字节与工作寄存器相加,结果存在和的第2字节, 如有进位,和的第3字节加1;
6. 将第2字节加数送入工作寄存器,和的第2字节与工作寄存器相加,结果存在和的第2字节,.如有进位和的第3字节加1;
7..将第3字节被加数送入工作寄存器,和的第3字节与工作寄存器相加,结果存在和的第3字节, 如有进位,和的第4字节加1;
8. 将第3字节加数送入工作寄存器,和的第3字节与工作寄存器相加,结果存在和的第3字节,.如有进位和的第4字节加1;
9. . 恢复现场,恢复工作寄存器,状态寄存器值等中断中用到的寄存器。
首先:R1+R4 和 R2+R5 两个值都大于单字节最大值FF导致存储在单字节寄存器中溢出,导致高字节的数据丢失。
其次:楼主在将R1、R2存放到中间寄存器的时候中间寄存器A应该为16位寄存器才不会丢失高字节的数据。
具体的程序编写,相信楼主经过提示一定能自行解决,这样提高也是最大的。
;启动入口
ORG 0000H ;复位启动
LJMP START ;
ORG 0100H ;
;
;主控程序
START: MOV A,30H
ADD A,40H
MOV 70H,A
MOV A,31H
ADDC A,41H
MOV 71H,A
MOV A,32H
ADDC A,42H
MOV 72H,A
ADDC A,#0
MOV 73H,A
JMP $
END ;
单片机求两个3字节数的和的介绍就聊到这里吧,感谢您花时间阅读,谢谢。
本文标签:单片机求两个3字节数的和