单片机
返回首页

AT89S51算术运算类指令

2018-03-10 来源:eefocus

  在AT89S51指令系统中,有单字节的加、减、乘、除法指令,算术运算功能比较强。算术运算指令都是针对8位二进制无符号数的,如要进行带符号或多字节二进制数运算,需编写具体的运算程序,通过执行程序实现。
  
  算术运算的结果将使PSW中的进位(Cy)、辅助进位(Ac)、溢出(OV)3种标志位置1或清0,但是增1和减1指令不影响这些标志。
  
  1.加法指令
  
  共有4条加法运算指令:
  500
  这4条8位二进制数加法指令的一个加数总是来自累加器A,而另一个加数可由寄存器寻址、直接寻址、寄存器间接寻址和立即数寻址等不同的寻址方式得到。其相加的结果总是放在累加器A中。
  
  使用加法指令时,要注意累加器A中的运算结果对各个标志位的影响:
  
  (1)如果位7有进位,则进位标志Cy置l,否则Cy清0。
  
  (2)如果位3有进位,辅助进位标志Ac置1,否则Ac(Ac为PSW寄存器中的一位)清O。
  
  (3)如果位6有进位而位7没有进位,或者位7有进位而位6没有进位,则溢出标志位OV置l,否则OV清0。
  
  溢出标志位OV的状态,只有进行带符号数加法运算时才有意义。当两个带符号数相加时,OV=1,表示加法运算超出了累加器A所能表示的带符号数的有效范围(-128~+127),即产生了溢出,表示运算结果是错误的,否则运算是正确的,即无溢出产生。
  
  【例3-1】 (A)=53H,(RO)=FCH,执行指令
  501
  运算式为
  502
  结果为(A)=4FH,Cy=l,Ac=0,OV=O,P=1(A中l的位数为奇数)。
  
  注意:在上面的运算中,由于位6和位7同时有进位,所以标志位OV=O。
  
  【例3-2】 (A)=85H,(RO)=20H,(20H)=AFH,执行指令503

    运算式为504

    结果为(A)=34H,Cy=l,Ac=l,OV=1,P=1。
  
  注意:由于位7有进位,而位6无进位,所以标志位OV=1。
  
  2.带进位加法指令
  
  带进位加法运算的特点是进位标志位Cy参加运算,因此带进位的加法运算是三个数相加。带进位的加法指令共4条:
  505
  这组带进位加法指令的功能是,指令中不同寻址方式所指定的加数、进位标志与累加器A内容相加,结果存在累加器A中。
  
  如果位7有进位,则进位标志Cy置1,否则Cy清0;如果位3有进位输出,则辅助进位标志Ac置l,否则Ac清0;如果位6有进位而位7没有进位,或者位7有进位而位6没有进位,则溢出标志OV置1,否则标志OV清O。
  
  【例3-3】 (A)=85H,(20H)=FFH,Cy=l,执行指令
  510
  运算式为
  511
  结果为(A)=85H,Cy=l,Ac=l,OV=0,P=l(A中1的位数为奇数)。
  
  3.增1指令
  
  共有5条增1指令:
  512
  这组增1指令的功能是把指令中所指出的变量增1,且不影响程序状态字PSW中的任何标志。若变量原来为FFH,加1后将溢出为OOH(仅指前4条指令),标志也不会受到影响。第5条指令“INC DPTR”,是16位数增1指令。指令首先对低8位指针DPL的内容执行加1操j作,当产生溢出时,就对DPH的内容进行加1操作,并不影响标志Cy的状态。
  
  4.十进制调整指令
  513
  十进制调整指令用于对BCD码十进制数加法运算结果的内容进行修正,指令格式为:
  
  这条指令的功能是对压缩的BCD码(一个字节存放2位BCD码)的加法结果进行十进制调整。两个BCD码按二进制相加之后,必须经本指令的调整才能得到正确的压缩BCD码的和数。
  
  (1)十进制调整问题
  
  对于十进制数(BCD码)的加法运算,只能借助于二进制加法指令。然而,二进制数的加法运算原则上并不能适用于十进制数的加法运算,有时会产生错误结果。
  
  例如:514
  
  上述的BCD码运算中:
  
  (a)运算结果正确。
  
  (b)运算结果不正确,因为十进制数的BCD码中没有1111这个编码。
  
  (c)运算结果也不正确,正确结果应为17,而运算结果却是11。
  
  这种情况表明,二进制数加法指令不能完全适用于BCD码十进制数的加法运算,因此要对结果进行有条件的修正,这就是所谓的十进制调整问题。
  
  (2)出错原因和调整方法 
  
  出错的原因在于BCD码是4位二进制编码,共有16个编码,但BCD码只用了其中的10个,剩下6个没用到。这6个没用到的编码(1010,1011,1100,1101,1110,1111)为无效编码。
  
  在BCD码的加法运算中,凡结果进入或者跳过无效编码区时,其结果就是错误的。因此1泣BCD码加法运算出错的情况有以下两种:
  
  ①相加结果大于9,说明已经进入无效编码区。
  
  ②相加结果有进位,说明已经跳过无效编码区。
  
  无论哪一种出错情况,都是因为6个无效编码造成的。因此,只要出现上述两种情况之一,就必须进行调整。调整的方法是把运算结果加6调整,即所谓的十进制调整修正。
  
  十进制调整的修正方法如下:
  
  ①累加器低4位大于9或辅助进位位Ac=l,则进行低4位加6修正。
  
  ②累加器高4位大于9或进位位Cy=l,则进行高4位加6修正。
  
  ③累加器高4位为9,低4位大于9,则高4位和低4位分别加6修正。
  
  上述十进制调整修正,是通过执行指令“DA A”自动实现的。
  
  【例3-4】 (A)=56H,(R5)=67H,把它们看作两个压缩的BCD数,进行BCD数加法。
  
  执行指令:
  520
  由于高4位和低4位分别大于9,所以“DA A”指令要分别加6,来对结果进行修正。
  521
  结果为(A)=23H,Cy=l。
  
  由上可见,56+67=123,结果是正确的。
  
  5.带借位的减法指令
  
  共有4条指令:
  522
  这组带借位减法指令是从累加器A中的内容减去指定的变量和进位标志Cy的值,结果存放在累加器A中。
  
  如果位7需借位则Cy置l,否则Cy清0;如果位3需借位则Ac置1,否则Ac清0;如果位6需借位而位7不需要借位,或者位7需借位而位6不需借位,则溢出标志位OV置1,否则OV清0。
  
  源操作数允许有寄存器寻址、直接寻址、寄存器间接寻址和立即数寻址方式。
  
  【例3-5】 (A)=C9H,(R2)=54H,Cy=l,执行指令
  530
  运算式为
  531
  结果为(A)=74H,Cy=0,Ac=0,OV=1(位6向位7借位)。
  
  6.减1指令
  
  共有4条指令:
  532
  这组指令的功能是指定的变量减1。若原来为OOH,减1后下溢为FFH,不影响标志位(P标志除外)。
  
  【例3-6】 (A)=OFH,(R7)=19H,(30H)=OOH,(Rl)=40H,(40H)=OFFH,执行指令
  533
  结果为(A)=OEH,(R7)=18H,(30H)=OFFH,(40H)=OFEH,P=l,不影响其他标志。
  
  7.乘法指令
  534
  这条指令的功能是把累加器A和寄存器B中的无符号8位整数相乘,其16位积的低位字节在累加器A中,高位字节在B中。如果积大于255,则溢出标志位OV置1,否则OV清0。进位标志位Cy总是清0。
  
  8.除法指令
  535
  该指令的功能是用累加器A中8位无符号整数(被除数)除以B中8位无符号整数(除数),所得的商(为整数)存放在累加器A中,余数存放在寄存器B中,且Cy和溢出标志位OV清0。如果B的内容为0(即除数为0),则存放结果的A、B中的内容不定,并溢出标志位OV置l。
  
  【例3-7】 (A)=FBH,(B)=12H,执行指令
  536
  结果为(A)=ODH,(B)=11H,Cy=0,OV=O。


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • RS-485基础知识:处理空闲总线条件的两种常见方法

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章