在单片机片内30H开始存放了10个4字节无符号二进制数,请编程求这10个数的和。
例如,(30H 31H 32H 33H)存放了第一个数,30H是数的低位字节,33H是数的高位字节 (34H 35H 36H 37H)存放了下一个数,34H是数的低位字节,37H是数的高位字节 依次类推。
专业回答
假设是10个0x44332211相加
;30H开始存10个32位的数字0x44332211 十进制为1144201745
;10个0x44332211和为11,442,017,450,,即0x2 A9FF 54AA
mov 30h,#0x11;
mov 31h,#0x22
mov 32h,#0x33
mov 33h,#0x44
mov 34h,#0x11
mov 35h,#0x22
mov 36h,#0x33
mov 37h,#0x44
mov 38h,#0x11
mov 39h,#0x22
mov 3ah,#0x33
mov 3bh,#0x44
mov 3ch,#0x11
mov 3dh,#0x22
mov 3eh,#0x33
mov 3fh,#0x44
mov 40h,#0x11
mov 41h,#0x22
mov 42h,#0x33
mov 43h,#0x44
mov 44h,#0x11
mov 45h,#0x22
mov 46h,#0x33
mov 47h,#0x44
mov 48h,#0x11
mov 49h,#0x22
mov 4ah,#0x33
mov 4bh,#0x44
mov 4ch,#0x11
mov 4dh,#0x22
mov 4eh,#0x33
mov 4fh,#0x44
mov 50h,#0x11
mov 51h,#0x22
mov 52h,#0x33
mov 53h,#0x44
mov 54h,#0x11
mov 55h,#0x22
mov 56h,#0x33
mov 57h,#0x44
MOV 5AH,#30H //标记加数存储地址30H
MOV 5BH,#60H //和存放地址60H。若和超过4个字节,自动向前借一个字节
MOV 60H,#0 //清空和数存放位置
MOV 61H,#0
MOV 62H,#0
MOV 63H,#0
MOV R1,5BH //和存储位置给R1
mov r0,5AH
mov r4,5AH
MOV R2,#4 //4个字节
loop1: MOV R3,#10 //10个加数数字
Loop2: MOV A,@r0 //和数第R2字节与加数第R2字节。结果给和数第R2字节
ADD A,@R1
MOV @R1,A //计算的进位与和数R2-1字节相加
INC R1
MOV A,@R1
ADDC A,#0
MOV @R1,A
DEC r1
MOV A,R0 //找下一个加数R2字节存储位置,准备计算下一个
ADD A,#0x04
MOV R0,A
djnz R3,loop2 //跳转指令。R3减一看10个加数的第R2位是否都计算完成。没有计算完成则回loop2计算计算
INC R4
mov a,R4
mov R0,a
INC R1
djnz R2,Loop1 //第R2计算完成跳,R2减一,开始计算更高位。值到4
end