新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 关于C51汇编ADD与SUBB指令问题

关于C51汇编ADD与SUBB指令问题

作者:时间:2012-08-10来源:网络收藏

今天在写关于 PID 算法时 , 突然发现 , 偏差是有正负之分 , 那么应当如何表示呢 ? 当然是用一个字节的第八位来表示啦 , 这想都不用想 , 这是 ADD 指令与 SUBB 指令会认识他们吗 ? 这是一个问题 .

所以 , 我做了以下几个测试 . 看看单片机有有参与的运算 .

我使用编译环境是 wave6000, 将代码抄到环境 , 编译 , 再设置 CY 的标志位 .

先看看 CY=0 的情况 :

MOV A,#89H
MOV B,#09H
ADD A,B

这时 ,A=92H. 此时 , 单片机不认识 .

再看看 CY=1 的情况 :

MOV A,#89H
MOV B,#09H
ADD A,B
A=92H,CY=0

可以看出 ,Cy 并不影响 add 指令的计算 .

再看看减法

Cy=0 时 :

MOV A,# 09H
MOV B,# 89H
SUBB A,B

这时 ,A=80H,CY=1.

Cy=1 时 :

MOVA,#09H
MOVB,#89H
SUBB A,B

这时 ,A=7FH,CY=1.

通过上面对比 , 我们可以发现 SUBB 指令的运算与 Cy 有关系 . 那么如果 SUBB 与 ADD 联合起来用会有什么效果呢 ?

Cy=0

MOV A,#09H
MOV B,#89H
SUBBA,B ;A=80H,CY=1
MOV B,#80H
ADD A,B

A=00H,CY=0

本来 80H+80H=100H, 即 CY=1, 但 CY 已经为 1,1+1=10, 所以 Cy=0. 这时 , 你发现 add 指令的计算结果与 Cy 好像有点关系了 . 这个例子好像有点特殊 , 我们在看看其他例子 :

MOV A,#09H
MOV B,#29H
SUBBA,B ;A=E0,CY=1
MOV B,#80H
ADD A,B

A=60H,CY=0

这应该怎么解释呢 ?E0 如果除去最高位不算 , 那么实际他会是 20. 所以 (-20)H+80H=60H

但是为什么前面我设置标志位 Cy 的时候 ,ADD 运算结果都一样 , 而此时却会影响呢 ?

虽然我不知这种情况是怎么回事 , 但是只要 ADD 与 SUBB 连用时 , 我们可以知道 , 不用考虑关于溢出的问题 , 特别是我们用于连续做加减法的时候 .



评论


技术专区

关闭