算术运算指令知识汇总
扫描二维码
随时随地手机看文章
算术运算指令包括加、减、乘和除法指令,其语法格式见表3-7。由表3-7可知,算术运算指令会对PSW中的某些位产生影响。
1.加法指令ADD和ADDC
ADD指令将源操作数和累加器A中的数相加,加法的结果存入累加器A,并且运算结果会影响PSW中的CY、OV、AC和P标志位。ADD指令对标志位的影响如下:当加法结果的第7位有进位时,则进位标志位CY被置1,否则被清0;如果加法结果的第3位有进位,则辅助进位标志位AC被置1,否则被清0;如果加法结果的第6位和第7位的进位情况不一致,则溢出标志位OV被置1,否则被清0;运算结束时,奇偶标志位P的值由累加器A中的数决定,若累加器A中的值以二进制表示后,其中“1”的个数为奇数个,则P为1,否则P为0。
ADDC指令与ADD指令的唯一区别是,前者在源操作数和累加器A的加法基础上再加上CY中的值。
2.十进制调整指令DA
指令ADD和ADDC将其源操作数和目的操作数作为二进制数(或十六进制数)进行加法计算,遵循“逢2进1”(或“逢16进1”)的二进制(或十六进制)计算规则,得到的运算结果为二进制数(或十六进制数)。如果用ADD和ADDC指令进行压缩BCD码(十进制数)的加法计算,则得不到正确的十进制计算结果,而使用DA指令可以将ADD和ADDC指令的运算结果调整为十进制的运算结果。
使用“DA A”指令进行十进制调整时,必须满足以下要求:在DA指令之前必须进行ADD或ADDC加法运算,并且参与加法运算的操作数必须是压缩BCD码数。
“DA A”指令调整时,先处理“个位”,再处理“十位”,“个位”的处理结果将影响“十位”的调整,具体步骤如下:
(1)调整BCD码运算结果的“个位”
1)若累加器A中运算结果的“个位”(即低4位)数大于9(非BCD码),则在累加器A的“个位”上加“6”。这样做是因为:在BCD码计算时,结果大于9则应产生进位,但是ADD和ADDC按照十六进制进行计算,只有结果大于15时才进位,从而导致“晚”进位,所以此时加“6”相当于将“逢16进1”的十六进制运算强制调整为“逢10进1”十进制运算。
2)若累加器A中运算结果的“个位”(即低4位)产生进位(辅助进位标志位(AC)=1),则在累加器A的“个位”上加“6”。这样处理的理由是:“个位”产生进位,意味着BCD码加法结果的个位大于15而产生了进位,但是该进位将使BCD码加法结果的个位数被减去16,而正常的十进制加法进位应该使个位数被减去10,所以需通过加“6”操作补上多减去的“6”。
(2)调整BCD码运算结果的“十位”
若累加器A中运算结果的“十位”(即高4位)数大于9(非BCD码)或累加器A中“十位”产生进位(进位标志位(CY)=1),则在累加器A的“十位”上加“6”。这样做的原因与步骤(1)相似。
【例3-34】DA指令举例。
以下程序段可以完成压缩BCD码的加法运算88H+02H=90H。
3.减法指令SUBB
SUBB指令将累加器A中的数减去源操作数和进位标志位CY,并将减法结果存入累加器A,其运算结果会影响PSW中的CY、OV、AC和P标志位。SUBB指令对标志位的影响如下:当减法的第7位有借位时,则进位标志位CY被置1,否则被清0;如果减法结果的第3位有借位,则辅助进位标志位AC被置1,否则被清0;如果减法结果的第6位和第7
位的借位情况不一致,则溢出标志位被置1,否则被清0;运算结束时,奇偶标志位P的值由累加器A中的数决定,若累加器A中的值以二进制表示后,其中“1”的个数为奇数个,则(P)=1,否则(P)=0。
【例3-35】SUBB指令举例。确定下段程序执行后,累加器A和PSW的值。
解:运行结果是(A)=8CH、(PSW)=0C1H(即P=1、OV=0、AC=1和CY=1)。
4.加1指令INC和减1指令DEC
INC指令和DEC指令分别对指令中唯一的操作数进行加1和减1操作,并将结果送回操作数。除了“INC A”和“DEC A”指令将影响奇偶标志位P以外,其他INC和DEC指令均不影响任何标志位。注意:这里所说的“不影响”是指标志位原来的状态保持不变。另外,“INC DPTR”指令进行16位数加1操作,该指令执行时,先将DPL加1,若产生进位,则将DPH加1,并且DPL加1和DPH加1产生的进位不影响AC和CY。另外,无“DEC DPTR”指令。
还需特别注意的是:若用INC和DEC修改单片机并行I/O口(P0~P3)的引脚状态,如指令“INC P0”,则指令执行时采用的是“读-修改-写”方式,即先从端口的输出锁存器(而不是端口的引脚)读取端口数据,然后修改该数据(INC指令进行加1操作,DEC指令进行减1操作),最后将修改结果输出到端口引脚上。
5.乘法指令MUL
乘法指令的格式见表3-7,乘法的被乘数和乘数均为8位无符号数,且默认存放在累加器A和寄存器B中。乘积为16位无符号数,其低8位存放于累加器A中,高8位存放在寄存器B中,如图3-2所示。
图3-2乘法指令示意图
乘法指令对标志位的影响为:若乘积大于0FFH,则溢出标志位OV被置1,否则被清0;进位标志位总会被乘法指令清0。
6.除法指令DIV
除法指令的格式见表3-7。与乘法指令相似,除法指令的被除数和除数均为8位无符号数,被除数默认放在累加器A中,除数默认放在寄存器B中。除法的商和余数均为8位无符号数,分别存于累加器A中和寄存器B中,如图3-3所示。
图3-3除法指令示意图
除法指令对标志位的影响:若除数不为0,则溢出标志位OV和进位标志位CY均被清0;若除数为0,则溢出标志位(OV)被置为1,且累加器A和寄存器B的值是不确定的。