100个单字节数之和两个字节足够存放了,该题可以用一个循环来实现。先将R7R6清零,之后逐步取出数据与低八位R6相加,进位与R7相加就可以了;代码如下:
SUM:
MOV DPTR,#1000H ;数据指针送DPTR
MOV R2,#100 ;数据个数送R2
MOV R6,#0
MOV R7,#0 ;清零R6R7
LOOP:
MOVX A,@DPTR ;从RAM中取数
ADD A,R6 ;与低八位相加
MOV R6,A ;结果回送低八位
CLR A ;累加器清零
ADDC A,R7 ;与高八位带进位相加
MOV R7,A ;结果回送高八位
INC DPTR ;数据指针加1
DJNZ R2,LOOP ;如果100个数未取完则继续
RET
片外RAM数据的读写需要用到数据指针DPTR和指令MOVX,100个字节之和不会超过两个字节,所以R7R6保持是足够了,不用担心溢出问题,以下是程序代码:
SUM:
MOV DPTR,#1000H
MOV R2,#100
MOV R7,#0
MOV R6,#0
LP:
MOVX A,@DPTR
ADD A,R6
XCH A,R6
CLR A
ADDC A,R7
MOV R7,A
INC DPTR
DJNZ R2,LP
RET
(这位高质审核者,我想你不是太懂单片机吧,这段程序就是原创,我还不至于去复制别人的这么简单的代码,那点功夫这程序早就写好了。)
ORG 0000H
LJMP START
ORG 0030H
START:
MOV DPTR,#1000H
MOV R6,#00H
MOV R7,#00H
MOV R5,#100 ;字节数
LOOP:
MOVX A, @DPTR
ADD A,R6
MOV R6,A
JNC NEXT
INC R7
NEXT:
INC DPTR
DJNZ R5,LOOP
SJMP $
END
;
MOV R6, #0
MOV R7, #0
MOV R2, #100
MOV DPTR, #1000H
LOOP:
MOVX A, @DPTR
ADD A, R6
MOV R6, A
CLR A
ADDC A, R7
MOV R7, A
INC DPTR
DJNZ R2, LOOP
NOP
SJMP $
END
-------------------------
可以参考:
http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/44593a16e26d3402c83d6d24.html
org 0000h
LJMP main
main:
mov r6,#00H
mov r7,#00H
mov dptr,#1000H
mov r1,#100;
loop:
CLR A
movx A,@dptr
MOV r3,A
CLR A
mov A,r6
add A,r3
mov r6,A
CLR A
mov A,r7
addc A,#0H
mov r7,A
INC dptr
DJNZ r1,loop
end
KEIL8051核心编译通过