电子工程师提升计划-第4章 单片机编程【1.8】

        (3)以寄存器Ri间址单元为目的操作数的传送指令以寄存器Ri间址单元为目的操作数的传送指令有3条,各条指令的形式和功能如下:

(4)以直接地址direct为目的操作数的传送指令以直接地址direct为目的操作数的传送指令有5条,各条指令的形式和功能如下:

(5)16位数据传送指令
16位数据传送指令只有1条,该条指令的形式和功能如下:

2.外部RAM与累加器A的数据传送指令
外部RAM与累加器A的数据传送指令操作码助记符是“MOVX”。
指令格式:MOVX 目的操作数,源操作数指令的功能是将源操作数中的内容送到目的操作数中。指令执行后,源操作数内容不变,目的操作数内容与源操作数一致。外部RAM与累加器A的数据传送指令有4条,各条指令的形式和功能如下:

4.数据交换指令
        数据交换指令的操作码助记符有3个:“XCH”、“XCHD”和“SWAP”。
指令格式:数据交换指令操作码助记符 目的操作数,源操作数指令的功能是将源操作数中的内容与目的操作数的内容交换。指令执行后,源操作数内容和目的操作数内容互换。数据交换指令有5条,各条指令的形式和功能如下:

5.堆栈操作指令
堆栈操作指令有2个:进栈指令“PUSH”和出栈指令“POP”。各条指令的形式和功能如下:

        数据传送类指令执行后,不会影响PSW的CY、AC、OV等标志位,但涉及累加器A中的数据改变时,将会影响到PSW的奇偶校验位P。

4.3.2 算术运算类指令

        算术运算类指令的功能是进行加、减、乘、除4种基本算术运算。它包括加法指令、减法指令、乘法指令、除法指令和十进制数调整指令。
1.加法指令
加法指令又分不带进位的加法指令、带进位的加法指令和加1指令。
(1)不带进位的加法指令
不带进位的加法指令的操作码助记符是“ADD”。
指令格式:ADD A,操作数2
指令的功能是将操作数2与累加器A中的数据相加,结果保存在A中。
不带进位的加法指令有4条,各条指令的形式和功能如下:

下面举两个例子来说明不带进位的加法指令的功能。
        ① ADD A,#36H。在指令执行前,如果累加器A中的数据为56H,那么指令执行后,累加器A中的数据为8CH(36H+56H)。
        ② ADD A,R6。在指令执行前,如果累加器A 中的数据为78H(01111000),R6 中的数据为89H(10001001),那么指令执行后,相加得到的数据为101H(100000001),由于累加器A是一个8位寄存器,所以只能存储8位数00000001(01H),而最高位D7的进位会保存在PSW的进位标志位(CY)中,让(CY)=1,另外两个数据的低4位相加(1000+1001)时,D3位会向高位D4位进位,在进位的同时会将PSW的辅助进位标志位(AC)置“1”。
(2)带进位的加法指令
带进位的加法指令的操作码助记符是“ADDC”。
指令格式:ADDC A,操作数2
指令的功能是将操作数2与累加器A中的数据相加,再与PSW中CY位的数据相加,结果保存在累加器A中。
带进位的加法指令有4条,各条指令的形式和功能如下:

下面举例说明带进位的加法指令的功能。
例如:ADDC A,#36H
在指令执行前,如果累加器A中的数据为56H,寄存器PSW中CY位的数据为“1”,那么指令执行后,累加器A中的数据为
8DH(36H+56H+1)。
(3)加1指令
加1指令又称增量指令,它的操作码助记符是“INC”。
指令格式:INC 操作数
指令的功能是将操作数加1,结果仍保存在该操作数中。
加1指令有5条,各条指令的形式和功能如下:

下面举例说明加1指令的功能。
例如:INC @R0
在指令执行前,如果寄存器R0中的地址为56H,56H单元中的数据为35H,那么指令执行后,56H单元中的数据为36H。
2.减法指令
减法指令又分带借位的减法指令和减1指令。
(1)带借位的减法指令
带借位的减法指令的操作码助记符是“SUBB”。
指令格式:SUBB A,操作数2
指令的功能是将累加器A中的数据减去操作数2,再减去PSW中CY位
的数据,结果保存在累加器A中。
带借位的减法指令有4条,各条指令的形式和功能如下:

下面举例说明带借位的减法指令的功能。
例如:SUBB A,R6
在指令执行前,如果累加器A中的数据为89H,寄存器R6中的数据为78H,CY位中的数据为1,那么指令执行后,累加器A中的数据为
10H(89H-78H-1)。
如果不需要借位,可先将CY位清0,清0指令将在后面介绍。
(2)减1指令
减1指令的操作码助记符是“DEC”。
指令格式:DEC 操作数
指令的功能是将操作数减1,结果仍保存在该操作数中。
减1指令有4条,各条指令的形式和功能如下:

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

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

下面以一个程序段为例来说明除法指令的功能。例如:
MOV A,#0FBH
MOV B,#12H
DIV AB
上面的第 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码加法程序段为例来说明十进制数调整指令的功
能。例如:
MOV A,#56H
ADD A,#67H
DA A
上面的第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)。
        在进行普通的加法运算时,后面不用加“DA A”指令;如果在加法运算指令后加上该指令,进行的加法运算将是BCD加法运算。

4.3.3 逻辑运算类指令

        逻辑运算类指令的功能是进行与、或、非、异或逻辑运算和对数据进行清 0、移位。它包括逻辑与指令、逻辑或指令、逻辑非指令、逻辑异或指令、清0指令和移位指令。
1.逻辑与指令
逻辑与指令的操作码助记符是“ANL”。
指令格式:ANL 操作数1,操作数2
指令的功能是将操作数1与操作数2按位进行相与运算,结果保存在操作数1中。
逻辑与指令有6条,各条指令的形式和功能如下:

下面以一个程序段为例来说明逻辑与指令的功能。例如:
MOV A,#31H
MOV R3,#12H
ANL A,R3
上面的第 1 条指令是将数据 31H(00110001)送到累加器 A中,第 2 条指令是将数据 12H (00010010)送到寄存器R3中,第3条指令是将A和R3中的数据进行按位相与(00110001∧00010010)运算。运算过程如下:


运算结果为00010000(10H),将结果保存在A中。
2.逻辑或指令
逻辑或指令的操作码助记符是“ORL”。
指令格式:ORL操作数1,操作数2
指令的功能是将操作数1与操作数2按位进行相或运算,结果保存在操作数1中。
逻辑或指令有6条,各条指令的形式和功能如下:

下面以一个程序段为例来说明逻辑或指令的功能。例如:
MOV A,#31H
MOV R3,#12H
ORL A,R3
上面的第 1 条指令是将数据 31H(00110001)送到累加器 A中,第 2 条指令是将数据 12H (00010010)送到寄存器R3中,第3条指令是将A和R3中的数据按位进行相或(00110001∨00010010)运算。运算过程如下:


运算结果为00110011(33H),将结果保存在A中。
3.逻辑非指令
逻辑非指令的操作码助记符是“CPL”。
逻辑非指令的形式和功能如下:

下面以一个程序段为例来说明逻辑非指令的功能。例如:
MOV A,#35H
CPL A
上面的第1条指令是将数据35H(00110101)送到累加器A中,第2条指令是将A中的数据35H按位取反,得到的结果CAH(11001010)仍保存在A中。
4.逻辑异或指令
逻辑异或指令的操作码助记符是“XRL”。
指令格式:XRL 操作数1,操作数2
指令的功能是将操作数1与操作数2按位进行异或运算,结果保存在操作数1中。在两位数进行异或运算时,若两数相异(即两位数不同)结果为“1”,相同则为“0”。
逻辑异或指令有6条,各条指令的形式和功能如下:

下面以一个程序段为例来说明逻辑异或指令的功能。例如:
MOV A,#31H
MOV R3,#12H
XRL A,R3
上面的第 1 条指令是将数据 31H(00110001)送到累加器 A中,第 2 条指令是将数据 12H ( 00010010 )送到寄存器 R3 中,第 3 条指令是将 A 和 R3 中的数据按位进行异或运算
(00110001⊕00010010)。运算过程如下:


运算结果为00100011(23H),将结果保存在A中。
5.清0指令
清0指令的操作码助记符是“CLR”。
清0指令的形式和功能如下:

下面以一个程序段为例来说明清0指令的功能。例如:
MOV A,#35H
CLR A
上面的第1条指令是将数据35H(00110101)送到累加器A中,第2条指令是将A中的内容清0,A中清0的结果是00H(00000000)。
6.移位指令
移位指令又分不带进位的左环移指令、带进位的左环移指令、不带进位的右环移指令和带进位的右环移指令。各条指令的形式和功能如下:

下面以一个程序段为例来说明移位指令的功能。例如:
MOV A,#12H
RL A
RL A
        上面的第1条指令是将数据12H(00010010)送到累加器A中;第2条指令是将A中的数据00010010(12H)左移一位,数据变为00100100(24H);第3条指令是将A中的数据00100100(24H)再左移一位,数据变为01001000(48H)。
        可以看出,数据每左移一位,相当于将累加器A中的数据进行了“×2”运算(如数据12H左移一位变为 24H,数据 24H 左移一位就变为 48H)。同样,在右移(RR A)时,A 中的数据每移一位,就相当于进行了“÷2”运算。

4.3.4 程序控制类指令

        大多数程序在运行时会按顺序从前往后执行指令,但有时需要让程序反复多次执行某段指令,或跳过某段指令去执行另外的指令,这时就需要用程序控制类指令来控制。程序控制类指令具体分为无条件控制转移指令、有条件控制转移指令、子程序调用及返回指令和空操
作指令。
1.无条件控制转移指令
无条件控制转移指令在使用时无须规定程序转移的条件。它包括
短转移指令、长转移指令、相对转移指令和散转指令。
(1)短转移指令
短转移指令又称绝对转移指令,它的操作码助记符是“AJMP”。
短转移指令的形式和功能如下:

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BinaryStarXin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值