×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-05-25 发布时间:
|

今天在写关于 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 连用时 , 我们可以知道 , 不用考虑关于溢出的问题 , 特别是我们用于连续做加减法的时候 .

关键字:C51汇编  指令问题  符号位 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析