天涯孤星运算类的指令,无非就是加减乘除,而且是很简单的算术( 二 )


减1指令的操作码助记符是“DEC” 。
指令格式:DEC 操作数
指令的功能是将操作数减1 , 结果仍保存在该操作数中 。
减1指令有4条 , 各条指令的形式和功能如下:

天涯孤星运算类的指令,无非就是加减乘除,而且是很简单的算术
本文插图

?
下面举例说明减1指令的功能 。
例如:DEC @R0
在指令执行前 , 如果寄存器R0中的地址为56H , 56H单元中的数据为35H , 那么指令执行后 ,56H单元中的数据为34H 。
3.乘法指令
乘法指令的操作码助记符是“MUL” 。
乘法指令只有1条 , 该条指令的形式和功能如下:

天涯孤星运算类的指令,无非就是加减乘除,而且是很简单的算术
本文插图

?
下面以一个程序段为例来说明乘法指令的功能 。 例如:
MOVA , #36H
MOVB , #07H
MULAB
上面的第 1 条指令是将数据 36H(00110110)送到累加器 A 中;第 2 条指令是将数据 07H (00000111)送到寄存器B中;第3条指令是将A和B中的数据相乘(00110110×00000111);将相乘的结果0000000101111010(017AH)的低8位(7AH)保存在A中 , 高8位(01H)保存在B中 。
4.除法指令
除法指令的操作码助记符是“DIV” 。
除法指令只有1条 , 该条指令的形式和功能如下:

天涯孤星运算类的指令,无非就是加减乘除,而且是很简单的算术
本文插图

?
下面以一个程序段为例来说明除法指令的功能 。 例如:
MOVA , #0FBH
MOVB , #12H
DIVAB
上面的第 1 条指令是将数据 0FBH(11111011)送到累加器 A 中;第 2 条指令是将数据 12H (00010010)送到寄存器B中;第3条指令是将A和B中的数据相除(11111011÷00010010);得到的商1101(0DH)保存在A中 , 余数10001(11H)保存在B中 。
5.十进制数调整指令
单片机在对十进制数进行加法运算时 , 用BCD码(由4位二进制数构成)来表示十进制数 , 再对BCD码进行加法运算 , 得到的结果仍要用BCD码表示 , 但有时得到的结果可能不是BCD码 。 例如:

天涯孤星运算类的指令,无非就是加减乘除,而且是很简单的算术
本文插图

?
在例(1)中 , 两个BCD码相加后的运算结果仍是BCD码;在例(2)中 , 两个BCD码相加后的结果不是BCD码 , 因为BCD码只有9个(0000~1001) , 1110不是BCD码;在例(3)中 , 两个BCD码相加后的结果是错误的BCD码 , 因为BCD码只有4位 , 如果把10001当作是2位BCD码 , 还原就成了11 , 结果错误 。 采用十进制数调整指令可以解决这个问题 。
十进制数调整指令又称BCD调整指令 , 它的操作码助记符是“DA” 。
十进制数调整指令的形式和功能如下:

天涯孤星运算类的指令,无非就是加减乘除,而且是很简单的算术
本文插图

?
下面以一个BCD码加法程序段为例来说明十进制数调整指令的功能 。 例如:
MOVA , #56H
ADDA , #67H
DAA
上面的第1条指令是将数据56H送到累加器A中;第2条指令是将A中的数据56H(01010110)与数据67H(01100111)相加 , 得到的结果是BDH(10111101) , 显然结果不是BCD码(因为1011和1101都不是BCD码);第3条指令是将第2条指令相加后的运算结果BDH(10111101)进行BCD调整 。 调整过程如下:

天涯孤星运算类的指令,无非就是加减乘除,而且是很简单的算术
本文插图

?
从上面的竖式中可以看出 , 指令先判断相加结果的低4位是否大于9(1001) , 若大于9 , 则将低4位加6(0110) , 然后判断低4位加6后得到结果的高4位是否大于9 , 若大于9 , 再将高4位加6 , 这样修正的结果是100100011(123H=56H+67H) 。


推荐阅读