单片机程序菜鸟问题

请各位网友耐心的看一下很简单的一个初学者的问题。 三字节无符号数相加,其中被加数放在内部RAM的50H 51H 52H单元中;加数放在内部RAM的53H 54H 55H单元中;要求把相加数之和放在50H 51H 52H单元中,进位放在可位寻址区的00H位中。MOV R0,#52H;被加数的低字节地址MOV R1,#55H;加数的地址节地址MOV A,@R0ADD A,@R1;低字节相加MOV @R0,A;存低字节相加结果/////////////////////////////////////////////DEC R0DEC R1MOV A,@R0ADDC A,@R1;中间字节相加MOV @R0,A;存中间字节相加结果////////////////////////////////////DEC R0DEC R1MOV A,@R0ADDC A,@R1;高字节相加MOV @R0,A;存高字节相加结果/////////////////////////////////////CLR AADDC A,#00HMOV RO,#00H;存放进位的地址单元MOV @R0,A进位送00H保存疑点:我搞不明白到底是怎么把进位存放在00H单元中的。为什么要来个ADDC A,#00H.那位网友能给我讲明白者20分归谁。
2026年09月25日 18:08
有4个网友回答
网友(1):

CLR A
清楚累加器A,此时A的内容为0

ADDC A,#00H
ADDC是带进位的加法,之前最高字节加完之后,如果有进1,则进位标志位C为1,如果没有进位,那么C为0。ADDC A,#00H,把累加器A(内容为0)和立即数0(根据语境,这里是立即数,不是地址)执行带进位加法(数和0相加,就是数本身,这里相当于A+C+0,即累加器(0)+C(即50H和53H相加后的进位,可能有进位,可能没有进位)+ 立即数0,目的就是取出进位位C的值),相加的结果是0(如果之前没有进位)或者1(如果之前有进位),相加结果放在累加器A内,后面的语句就是把A的内容存到地址00的地方去。举个16进制数的加法的例子,例如0x445566 + 0xCC22AA = 0x1107810明白了吗,最后那一句就是取出最高位的进位的,也即最高位第七位。再教你一个小知识,两个数相加,结果最多只比原来数字多一位,并且多出的这位数字不会超过1,比如9+9,最多只是18,即十位是1,不会是2到9的,在比如说99+99=198,嘿嘿。懂了吧
虽然我不用汇编写程序,但是看懂还是很容易的

网友(2):

/////////////////////////////////////
CLR A // A=00H
ADDC A,#00H // (A=00H)+数字00H+上次的进位C -> A
// 加后,A中就是上次的进位C了。
// A的最低位:1或0,就是C。

// 按照要求,A的最低位,要放在00H位单元
// 这个位,位于字节地址00H的最低位。

MOV RO,#00H;存放进位的地址单元 //所以,使用间接寻址方式,
MOV @R0,A进位送00H保存 //把A的最低位,送到了00H字节的最低位。

// 这个传送方法,把00H字节中的高7位,也变成了0,
// 超过了题目要求的范围,并不好。
// 这四条指令,完全可以使用下面的一条指令代替。

MOV 00H, C // 这里的00H,是位地址。

网友(3):

CLR A ;首先对A清零
ADDC A,#00H ;表示A中加上进位和00H的和(如进位为 1则加1+00H),此时A中存放的是进位;
MOV RO,#00H ; 把00H存放在R0中;
MOV @R0,A ;把A中的内容(进位)存放在R0中的内容所表示的地址(00H)中

经过上面几步,就把进位存放在00H中了,呵呵

个人意见,如果友不妥之处,还请见谅

网友(4):

这东西对我来说太渺茫了。如果你能给我10分,我还是很感激的