第二章 MCS-51指令系统第一节 概述第二节 数据传送指令第三节 算术与逻辑运算指令第四节 控制转移指令第五节 位操作指令本章要点
指令系统是编写程序的基础,MCS-51
指令系统有数据传送、算术 与逻辑运算、
控制转移、位操作等指令共 111条,本章介绍 MCS-51指令系统的书写格式、寻址方式以及各指令的特点与使用场合。
第一节 概述一,MCS-51指令书写格式
MCS-51指令的书写格式为每条指令写成一行,每行分成若干段,第一段总是为操作符,第一段之后为操作数,有的指令有操作数也有的指令没有操作数,例如:
无操作数指令 RET
有一个操作数指令 INC A
有两个操作数指令 MOV A,21H
有三个操作数指令 CJNE A,#50H,TARGET
指令码也称操作符指令码与操作数间应留一空格 操作数与操作数之间应用逗号隔开操作数二、寻址方式
1.立即寻址将立即数 44送 ACC
操作数值直接标明在指令上,称为 立即数,采用立即数的寻址方式称为立即寻址。立即数要 用
#号打头,例如指令 MOV A,#44H (对应机器码为 74 44,其中 #44即为立即数 ) 。
操作数不是立即数,而是地址值,所需的数从该地址单元中获得,由于这类指令的地址直接标注在指令上,所以称为直接寻址。地址值和立即数的区别是前面是否加 #号,例如 44H为 地址,
#44H为 立即数 。
从 44H中取出数据 08H
送给 ACC
2,直接寻址操作数不是立即数,也不是地址,而是一个寄存器名称,则称为寄存器寻址,例如 指令
MOV A,R1。 其中 R1即 寄存器名称。
从寄存器 R1中取数将 R1中的数据送 ACC
3,寄存器寻址这类指令先从指令上所标明的寄存器中找出存放数据的地址,然后再从所标明的的地址中取数。由于存储数据的地址不直接标明在指令中,所以称之为 间接寻址。例如指令 MOV A,@R0 (注意 !只有
R0,R1可以间接寻址)。
从寄存器中找出存放数据的地址从该地址中取数将数送 ACC
4,寄存器间接寻址这种寻址方式是将基址值 (包括寄存器 PC或 DPTR)加上变址值 (只能是 A),并以此为地址,从该地址单元中取数,
例如指令 MOVC A,@A+DPTR和 MOVC A,@A+DPTR。
1.从 ACC中取出变址
30H
2.从 DPTR,取出基址值 2010H
4.求得 2010H+30H=2040H
从 2040H中取数 27H送 ACC
5.变址间接寻址相对寻址只限于转移类指令使用,例如
SJMP rel
DJNZ Rn,rel
它以 PC当前值为基地址,加上指令中的偏移量 rel,求出转移地址值。由于转移地址可能位于基址之前,也可能位于基址之后,如果位于基址之后,则实际的转移地址等于基址加偏移量。如果位于基址之前,则实际的转移地址等于基址减偏移量。如果指令上的偏移量采用补码以表示正负,则计算转移地址可以一律使用加法。
6,相对寻址返回本章首页一、数据传送指令的功能数据传送指令的功能是将数据从源送到目标源可以是立即数、寄存器、寄存器间接地址,片外存储器或片外存储器间接地址。
目标可以是寄存器、寄存器间接地址,片外存储器或片外存储器间接地址。
第二节 数据传送指令源 目标源和目标在片内,使用 MOV类指令,例如:
MOV A,#data
MOV direct,Rn
MOV @Ri,direct
源和目标在片外,使用 MOVX类指令,例如:
MOVX A,@DPTR
MOVX @DPTR,A
MOVC A,@A+PC
MOVC A,@A+DPIR
MOVX A,@Ri
MOVX @Ri,A
二、数据传送指令的书写格式交换指令所指定的交换对象。一方必须是 A,另一方为寄存器或寄存器间接地址。为此交换前要先把交换一方传送到 A,然后进行交换。例如:
XCH A,Rn
XCH A,direct
XCH A,@Ri
XCHD A,@Ri (低半字节交换,高半字节不变 )
堆栈是指在片内 RAM中划定的一个区,它可以用来暂时保存一些需要重新使用的数据或地址 。 使用堆栈可以是在执行某些指令时自动完成;例如调用子程序时,把当前 PC
值保存于堆栈,以便返回时便用 。 也可以使用堆栈操作指令,将数据压入或弹出,例如:
PUSH direct
POP direct
三、交换指令与堆栈操作指令返回本章首页第三节 算术与逻辑运算指令一、算术运算指令 的功能与书写格式
1.加法运算指令加法运算指令包括 ADD,ADDC和 INC。 其中 ADD
为不带进位位的加法指令; ADDC为带进位位的加法指令 。 INC为加 1指令 。 例如:
ADD 第一操作数,第二操作数
ADDC 第一操作数,第二操作数
INC 操作数其中操作数可以是累加器 A,立即数,直接地址,或间接地址 。
2,减法运算指令减法运算指令都是带进位位的,助记符为 SUBB例如 SUBB A,Rn。
减法运算中的所谓进位就是借位,带进位位的减法运算就是两数相减后还要再减去前一次运算留下的进位位 CY。
减 1运算指令可以使指定单元内容减 1,
和加法指令同样,指令 DEC A 比 指 令
SUBC A,#01H所占用字节少;但前者不会影响标志 。
除法运算指令为:
DIV AB
被乘数放在累加器 A 乘数放在寄存器 B
两个 8位无符号数相乘,可能得到
16位数,因此规定积的低 8位送到 A,
积的高 8位放在寄存器 B。
被除数放在累加器 A
除数放在寄存器 B
相除结果的商数回送到 A,余数回送到 B
MCS51指令系统设有两条乘除指令,要求两个相乘或相除的数必须是无符号的 8位数 。 其中乘法运算指令为:
MUL AB
3.乘除运算指令执行加法运算指令时,被运算的数属于什么类型,
CPU并不了解,运算时一律视之为二进制数 。 如果所运算的数不是二进制数而是 BCD码,必须在编制 BCD码加法程序时,在加法指令之后加一个 DAA指令,进行加 6
调整 。
例如 33H与 34H两个存储单元内容 为 BCD码,求 和 时必须进行调整 。 即
MOV A,33H
ADD A,34H
DA A
MOV 42H,A
33H与 34H两个存储单元内容 为 BCD码求 和 时必须进行调整
4.十进制调整指令二,逻辑 运算指令 的功能与书写格式第一操作数与第二作数可以是立即数、寄存器、寄存器间接地址
1.逻辑与指令
ANL 第一操作数,第二操作数
2.逻辑或指令
ORL 第一操作数,第二操作数
3.逻辑异或指令
XRL 第一操作数,第二操作数
4.清零指令和求反指令清零指令
CLR A
求反指令
CPL A
这两条指令只对累加器 A进行操作。
5.移位操作指令循环左移 RL A
带进位循环左移指令 RLC A
循环右移指令 RR A
带进位循环右移指令 RRC A
A半字节交换指令 SWAP
返回本章首页第四节 控制转移指令一、无条件转移指令长跳转指令 LJMP addrl6
长跳转指令必须用 16位的转移目标地址。
短跳转指令 AJMP addrl1
短 跳转指令用 11位的转移目标地址,目标地址的高 5位与当前地址相同。
相对跳转指令 SJMP rel
相对跳转指令目标地址 =下一条指令地址 +rel。
( rel必须用补码以示正负)
散转指令 JMP @A+DPTR
散转指令 的转移目标地址为 A+DPTR。
二、条件转移指令零条件转移指令 JZ rel A为 0转移 。
JNZ rel A非 0转移 。
比较转移指令 CJNE A,direct,rel
CJNE A,#data,rel
CJNE Rn,#data,rel
CJNE @Ri,#data,rel
第一操作数不等于第二操作数时转移 。
减 1非零跳转指令 DJNZ Rn,rel
DJNZ direct,rel
第一操作数不等零时加 1转移 。
以上都属于相对转移指令,目标地址等于下一条指令地址 + rel,通常指令上不写 rel而 直接 写目标地址标号。
返回本章首页第五节 位操作指令一,对进位位 CY进行操作的指令
CLR C
SETB C
CPL C
在 MCS-51指令系统中,有些指令操作时要有进位位
CY参与,例如 ADDC,SUBB,RLCA,RRCA 等等,
因此在使用这些指令前,要先对进位位 CY做一些必要的处理,例如使之置 0、置 1或取反。有了以上指令,要进行这些操作,就比较方便。
二,对具有位地址的空间进行操作的指令
CLR bit
SET bit
CPL bit
ANL C,bit
ORL C,bit
以上具有位地址的空间进行操作的指令包括置 0、置 1、取反,以及与进位位 C进行 与或 逻辑运算 的 指令。
三,位控制转移指令
JC rel 以进位位 CY等 1作为是否转移的条件。
JNC rel 以进位位 CY等 0作为是否转移的条件。
JB bit,rel 以指定的位单元内容是否等于 1为条件,决定是否转移。
JNB bit,rel 以指定的位单元内容是否等于 0为条件,决定是否转移。
JBC bit,rel 与 JB bit,rel的功能相同,即以指定的位单元内容是否等于 1为条件,决定是否转移,若条件不满足,继续顺序执行下一条指令。与 JB bit,rel的区别是能同时将位单元内容清零。
返回本章首页
指令系统是编写程序的基础,MCS-51
指令系统有数据传送、算术 与逻辑运算、
控制转移、位操作等指令共 111条,本章介绍 MCS-51指令系统的书写格式、寻址方式以及各指令的特点与使用场合。
第一节 概述一,MCS-51指令书写格式
MCS-51指令的书写格式为每条指令写成一行,每行分成若干段,第一段总是为操作符,第一段之后为操作数,有的指令有操作数也有的指令没有操作数,例如:
无操作数指令 RET
有一个操作数指令 INC A
有两个操作数指令 MOV A,21H
有三个操作数指令 CJNE A,#50H,TARGET
指令码也称操作符指令码与操作数间应留一空格 操作数与操作数之间应用逗号隔开操作数二、寻址方式
1.立即寻址将立即数 44送 ACC
操作数值直接标明在指令上,称为 立即数,采用立即数的寻址方式称为立即寻址。立即数要 用
#号打头,例如指令 MOV A,#44H (对应机器码为 74 44,其中 #44即为立即数 ) 。
操作数不是立即数,而是地址值,所需的数从该地址单元中获得,由于这类指令的地址直接标注在指令上,所以称为直接寻址。地址值和立即数的区别是前面是否加 #号,例如 44H为 地址,
#44H为 立即数 。
从 44H中取出数据 08H
送给 ACC
2,直接寻址操作数不是立即数,也不是地址,而是一个寄存器名称,则称为寄存器寻址,例如 指令
MOV A,R1。 其中 R1即 寄存器名称。
从寄存器 R1中取数将 R1中的数据送 ACC
3,寄存器寻址这类指令先从指令上所标明的寄存器中找出存放数据的地址,然后再从所标明的的地址中取数。由于存储数据的地址不直接标明在指令中,所以称之为 间接寻址。例如指令 MOV A,@R0 (注意 !只有
R0,R1可以间接寻址)。
从寄存器中找出存放数据的地址从该地址中取数将数送 ACC
4,寄存器间接寻址这种寻址方式是将基址值 (包括寄存器 PC或 DPTR)加上变址值 (只能是 A),并以此为地址,从该地址单元中取数,
例如指令 MOVC A,@A+DPTR和 MOVC A,@A+DPTR。
1.从 ACC中取出变址
30H
2.从 DPTR,取出基址值 2010H
4.求得 2010H+30H=2040H
从 2040H中取数 27H送 ACC
5.变址间接寻址相对寻址只限于转移类指令使用,例如
SJMP rel
DJNZ Rn,rel
它以 PC当前值为基地址,加上指令中的偏移量 rel,求出转移地址值。由于转移地址可能位于基址之前,也可能位于基址之后,如果位于基址之后,则实际的转移地址等于基址加偏移量。如果位于基址之前,则实际的转移地址等于基址减偏移量。如果指令上的偏移量采用补码以表示正负,则计算转移地址可以一律使用加法。
6,相对寻址返回本章首页一、数据传送指令的功能数据传送指令的功能是将数据从源送到目标源可以是立即数、寄存器、寄存器间接地址,片外存储器或片外存储器间接地址。
目标可以是寄存器、寄存器间接地址,片外存储器或片外存储器间接地址。
第二节 数据传送指令源 目标源和目标在片内,使用 MOV类指令,例如:
MOV A,#data
MOV direct,Rn
MOV @Ri,direct
源和目标在片外,使用 MOVX类指令,例如:
MOVX A,@DPTR
MOVX @DPTR,A
MOVC A,@A+PC
MOVC A,@A+DPIR
MOVX A,@Ri
MOVX @Ri,A
二、数据传送指令的书写格式交换指令所指定的交换对象。一方必须是 A,另一方为寄存器或寄存器间接地址。为此交换前要先把交换一方传送到 A,然后进行交换。例如:
XCH A,Rn
XCH A,direct
XCH A,@Ri
XCHD A,@Ri (低半字节交换,高半字节不变 )
堆栈是指在片内 RAM中划定的一个区,它可以用来暂时保存一些需要重新使用的数据或地址 。 使用堆栈可以是在执行某些指令时自动完成;例如调用子程序时,把当前 PC
值保存于堆栈,以便返回时便用 。 也可以使用堆栈操作指令,将数据压入或弹出,例如:
PUSH direct
POP direct
三、交换指令与堆栈操作指令返回本章首页第三节 算术与逻辑运算指令一、算术运算指令 的功能与书写格式
1.加法运算指令加法运算指令包括 ADD,ADDC和 INC。 其中 ADD
为不带进位位的加法指令; ADDC为带进位位的加法指令 。 INC为加 1指令 。 例如:
ADD 第一操作数,第二操作数
ADDC 第一操作数,第二操作数
INC 操作数其中操作数可以是累加器 A,立即数,直接地址,或间接地址 。
2,减法运算指令减法运算指令都是带进位位的,助记符为 SUBB例如 SUBB A,Rn。
减法运算中的所谓进位就是借位,带进位位的减法运算就是两数相减后还要再减去前一次运算留下的进位位 CY。
减 1运算指令可以使指定单元内容减 1,
和加法指令同样,指令 DEC A 比 指 令
SUBC A,#01H所占用字节少;但前者不会影响标志 。
除法运算指令为:
DIV AB
被乘数放在累加器 A 乘数放在寄存器 B
两个 8位无符号数相乘,可能得到
16位数,因此规定积的低 8位送到 A,
积的高 8位放在寄存器 B。
被除数放在累加器 A
除数放在寄存器 B
相除结果的商数回送到 A,余数回送到 B
MCS51指令系统设有两条乘除指令,要求两个相乘或相除的数必须是无符号的 8位数 。 其中乘法运算指令为:
MUL AB
3.乘除运算指令执行加法运算指令时,被运算的数属于什么类型,
CPU并不了解,运算时一律视之为二进制数 。 如果所运算的数不是二进制数而是 BCD码,必须在编制 BCD码加法程序时,在加法指令之后加一个 DAA指令,进行加 6
调整 。
例如 33H与 34H两个存储单元内容 为 BCD码,求 和 时必须进行调整 。 即
MOV A,33H
ADD A,34H
DA A
MOV 42H,A
33H与 34H两个存储单元内容 为 BCD码求 和 时必须进行调整
4.十进制调整指令二,逻辑 运算指令 的功能与书写格式第一操作数与第二作数可以是立即数、寄存器、寄存器间接地址
1.逻辑与指令
ANL 第一操作数,第二操作数
2.逻辑或指令
ORL 第一操作数,第二操作数
3.逻辑异或指令
XRL 第一操作数,第二操作数
4.清零指令和求反指令清零指令
CLR A
求反指令
CPL A
这两条指令只对累加器 A进行操作。
5.移位操作指令循环左移 RL A
带进位循环左移指令 RLC A
循环右移指令 RR A
带进位循环右移指令 RRC A
A半字节交换指令 SWAP
返回本章首页第四节 控制转移指令一、无条件转移指令长跳转指令 LJMP addrl6
长跳转指令必须用 16位的转移目标地址。
短跳转指令 AJMP addrl1
短 跳转指令用 11位的转移目标地址,目标地址的高 5位与当前地址相同。
相对跳转指令 SJMP rel
相对跳转指令目标地址 =下一条指令地址 +rel。
( rel必须用补码以示正负)
散转指令 JMP @A+DPTR
散转指令 的转移目标地址为 A+DPTR。
二、条件转移指令零条件转移指令 JZ rel A为 0转移 。
JNZ rel A非 0转移 。
比较转移指令 CJNE A,direct,rel
CJNE A,#data,rel
CJNE Rn,#data,rel
CJNE @Ri,#data,rel
第一操作数不等于第二操作数时转移 。
减 1非零跳转指令 DJNZ Rn,rel
DJNZ direct,rel
第一操作数不等零时加 1转移 。
以上都属于相对转移指令,目标地址等于下一条指令地址 + rel,通常指令上不写 rel而 直接 写目标地址标号。
返回本章首页第五节 位操作指令一,对进位位 CY进行操作的指令
CLR C
SETB C
CPL C
在 MCS-51指令系统中,有些指令操作时要有进位位
CY参与,例如 ADDC,SUBB,RLCA,RRCA 等等,
因此在使用这些指令前,要先对进位位 CY做一些必要的处理,例如使之置 0、置 1或取反。有了以上指令,要进行这些操作,就比较方便。
二,对具有位地址的空间进行操作的指令
CLR bit
SET bit
CPL bit
ANL C,bit
ORL C,bit
以上具有位地址的空间进行操作的指令包括置 0、置 1、取反,以及与进位位 C进行 与或 逻辑运算 的 指令。
三,位控制转移指令
JC rel 以进位位 CY等 1作为是否转移的条件。
JNC rel 以进位位 CY等 0作为是否转移的条件。
JB bit,rel 以指定的位单元内容是否等于 1为条件,决定是否转移。
JNB bit,rel 以指定的位单元内容是否等于 0为条件,决定是否转移。
JBC bit,rel 与 JB bit,rel的功能相同,即以指定的位单元内容是否等于 1为条件,决定是否转移,若条件不满足,继续顺序执行下一条指令。与 JB bit,rel的区别是能同时将位单元内容清零。
返回本章首页