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,用如下的代码即能轻松实现。

 LOOP:
SBI CNT0, 01H   ;CNT的低4位减1
LDI TBR, 00H   ;累加器A清0
SBC CNT1 ;如果上一步的减法有借位,则CNT的高4位会减1;如果没有借位,则高4位不变
BNZ LOOP ;如果CNT不为0,则继续
05-11 16:01