中颖4位MCU的减法汇编指令

1, SUB  M

执行动作: M - A -> A, 如果M-A的过程中没有产生借位,则CY= 1,如果产生了借位,则CY= 0.

其中,A为累加器。

2, SBI  M,  I

执行动作:M - I -> A, 如果M - I的过程中没有产生借位,则CY= 1,如果产生了借位,则CY= 0.

3, SBC  M

执行动作:M - A - (!CY) -> A, 如果M - A - (!CY)的过程中没有产生借位,则CY = 1, 如果产生了借位,则CY = 0.

SBC比较奇特,举几个例子:

1)

CY = 0的前提下,

LDI   70H,   08H
LDI   71H,    07H
SBC   70H

结果为A = 0,CY= 1

2)

CY = 1的前提下,

LDI   70H,   08H
LDI   71H,    07H
SBC   70H

结果为A = 1,CY= 1

3)

CY = 0的前提下,

LDI   70H,   06H
LDI   71H,    07H
SBC   70H

结果为A = E,CY= 0

4)

CY = 1的前提下,

LDI   70H,   06H
LDI   71H,    07H
SBC   70H

结果为A = F,CY= 0

5)

CY = 0的前提下,

LDI   70H,   07H
LDI   71H,    07H
SBC   70H

结果为A = F,CY= 0

6)

CY = 1的前提下,

LDI   70H,   07H
LDI   71H,    07H
SBC   70H

结果为A = 0,CY= 1

SBC的行为为什么要设计为这样,暂时没有明白,如有知道的朋友,请赐教。

现在终于明白SBC的行为为啥要设计得这么奇特。这条指令在计算带借位的减法时,大有用处。

例如,程序里有个CNT[CNT0, CNT1]要减至0,用如下的代码即能轻松实现。

1 LOOP:
2         SBI        CNT0,        01H      ;CNT的低4位减1
3         LDI        TBR,         00H       ;累加器A清0
4         SBC        CNT1                    ;如果上一步的减法有借位,则CNT的高4位会减1;如果没有借位,则高4位不变
5         BNZ        LOOP                    ;如果CNT不为0,则继续
原文地址:https://www.cnblogs.com/outs/p/5004859.html