《MCS-51单片机原理及嵌入式系统应用》课件第3章_第1页
《MCS-51单片机原理及嵌入式系统应用》课件第3章_第2页
《MCS-51单片机原理及嵌入式系统应用》课件第3章_第3页
《MCS-51单片机原理及嵌入式系统应用》课件第3章_第4页
《MCS-51单片机原理及嵌入式系统应用》课件第3章_第5页
已阅读5页,还剩190页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章MCS-51系列单片机的指令集及汇编语言程序设计基础3.1MCS-51系列单片机指令系统的寻址方式3.2MCS-51系列单片机指令集及其说明3.3MCS-51系列单片机汇编语言程序设计习题三3.1

MCS-51系列单片机指令系统的寻址方式

MCS-51系列单片机的指令系统使用5种寻址方式,即寄存器寻址、直接地址寻址、立即寻址、寄存器间接寻址及基址寄存器+变址寄存器间接寻址。确定寻址方式的方法是根据指令中操作数的真实地址来判定的。不同的寻址方式有不同的寻址空间,表3-1给出了它们之间的区别。

1.寄存器寻址寄存器寻址一般用于访问选定的通用寄存器区的8个通用寄存器R0~R7。这种寻址方式如果使用了另一个操作数,那么另一个操作数必须是累加器A,这些指令都是单字节指令(一条指令在程序存储器中占一个字节地址)。例如:MOV R0,A ;二进制机器码为“F8H”MOV A,R0 ;二进制机器码为“E8H”INC

R0 ;二进制机器码为“08H”DEC R0 ;二进制机器码为“18H”

2.直接地址寻址

MCS-51系列单片机的所有SFR必须而且只能使用直接地址寻址,内部低128B的RAM都可以使用直接地址寻址,内部RAM区的所有可以位寻址的位都必须使用直接位地址寻址。如果采用直接地址寻址方式的指令中一个操作数是直接地址,而另一个操作数是通用寄存器或SFR,那么这种结构的指令一般都是双字节指令(一条指令在程序存储器中占两个字节地址),指令码中包括一个字节的指令操作码和一个字节的直接地址码。例如:MOV A,B ;二进制机器码为“E5F0H”MOV A,30H ;二进制机器码为“E530H”如果采用直接地址寻址方式的指令中两个操作数都是直接地址,那么这种结构的指令一般都是三字节指令(一条指令在程序存储器中占三个字节地址),指令码中包括一个字节的指令操作码和两个字节地址的直接地址码。例如:MOV 68H,69H ;二进制机器码为“856869H”注意,采用直接地址寻址方式的指令中,如果其中的源地址或目的地址使用了SFR,那么SFR的符号将替代直接地址,例如前面的指令“MOVA,B”。访问MCS-51系列单片机的所有可以位寻址的位指令都属于直接地址寻址方式(可以称做直接位地址寻址方式)。例如:CLR 30H ;二进制机器码为“C230H”SETB 68H ;二进制机器码为“D268H”MOV C,25H ;二进制机器码为“A225H”

3.立即寻址立即寻址方式的指令一般使用于将立即数赋值给SFR、直接或间接地址的操作。在MCS-51系列单片机的汇编程序语言中,为了区分直接地址和立即数,必须在立即数前使用“#”标志。采用立即数寻址方式的指令大多数都属于双字节指令,在指令码中,一个地址用于存放操作码,另一个地址用于存放立即数。例如:MOV

A,#30H;二进制机器码为“7430H”注意,指令“MOVA,30H”是直接地址寻址,其中30H是一个直接地址,而指令“MOV

A,#30H”中的30H是一个立即数。

4.寄存器间接寻址

MCS-51系列单片机的高128B的RAM必须而且只能使用寄存器间接寻址,由于这些RAM地址与SFR的地址相同,而SFR必须而且只能使用直接地址寻址,这样可以区分两块地址相同的RAM区域。低128B的RAM也可以使用寄存器间接寻址。使用寄存器间接寻址方式的指令访问内部RAM时,必须使用R0或R1作为间接寄存器。例如:MOV

A,@R1;二进制机器码为“E7H”MOV

@R0,30H;二进制机器码为“A630H”MOV

@R0,#30H;二进制机器码为“7630H”

MCS-51系列单片机访问外部扩展的并行数据存储器和外部并行I/O端口时,必须而且只能使用寄存器间接寻址,间接寄存器可以是R0、R1或DPTR。例如:MOVX

A,@R1;二进制机器码为“E3H”MOVX

@R0,A;二进制机器码为“F6H”MOVX

@DPTR,A;二进制机器码为“F0H”MOVX

A,@DPTR;二进制机器码为“E0H”寄存器间接寻址方式的实现机理是把间接寄存器作为指针,然后对指针所指向的地址进行寻址。以下面两条顺序执行的指令为例说明寄存器间接寻址的实现机理。MOV

R1,#86H;给间接寄存器(指针)赋值MOV

A,@R1;将间接地址(指针所指向的地址)中的内容移到累加器A中显然,前一句指令执行后使R1寄存器的内容等于“86H”,后一句指令执行时将R1作为指针使用,那么R1就指向内部RAM的86H单元,并将86H单元的内容传送到累加器A中。另外,MCS-51单片机在访问外部扩展的并行数据存储器和外部并行I/O端口时,如果使用8位寄存器R0和R1作为间接寄存器,那么指针所指向的地址空间大小应是28(256)B,也就是说,使用R0和R1访问外部存储器和I/O端口最大只能区分256个地址。例如:MOV R1,#30H

;指针赋值,指向外部8位地址30HMOVX A,@R1

;将外部地址30H单元的内容读到累加器A中MOV

R0,#0FFH

;指针赋值,指向8位外部地址FFHMOVX

@R0,A

;将累加器A中的内容写到外部地址FFH单元中

DPTR是一个16位数据指针,如果使用DPTR作为访问外部扩展的并行数据存储器和外部并行I/O端口的间接寄存器(指针),那么指针所指向的地址空间大小应是216B(64KB),也就是说,使用DPTR访问外部存储器和I/O端口最大寻址能力达64KB。例如:MOV

DPTR,#1234H

;指针赋值,指向16位外部地址1234HMOVX

A,@DPTR

;将外部地址1234H单元的内容读到累加器A中MOV

DPTR,#0FFFFH

;指针赋值,指向16位外部地址FFFFHMOVX

@DPTR,A

;将累加器A中的内容写到外部地址FFFFH单元中

5.变址寄存器+基址寄存器间接寻址在MCS-51系列单片机的程序存储器中常需要存储一些常数表、程序表等,访问这些存储器时,必须使用变址寄存器+基址寄存器间接寻址方式来实现。采用这种寻址方式的指令仅包括查表指令MOVC

A,@A+DPTR;二进制机器码为“93H”MOVC

A,@A+PC

;二进制机器码为“83H”和程序散转指令JMP

@A+DPTR;二进制机器码为“73H”上面的3条指令中都是把累加器A作为变址寄存器,而DPTR或PC作为基址寄存器的间接寄存器寻址。同前面的寄存器间接寻址一样,变址寄存器+基址寄存器间接寻址方式中也是使用指针方式寻址,不同的是,在这里是把变址寄存器+基址寄存器之和作为指针(间接寄存器)。下面的例子是使用变址寄存器+基址寄存器间接寻址方式实现程序常数查表。8000H

MOV

DPTR,#ShowStr

;基址寄存器赋值(指针指向常数表的首地址)8003H

MOV

A,#06H

;变址寄存器赋值(确定地址偏移量)8005H

MOVC

A,@A+DPTR

;从常数表首地址开始偏移6个地址,

;将该单元中的内容取出并存在累加器A中ShowStr: ;常数表的首地址(符号地址)9000H

DB“EnteranykeytoContinue!”

;程序存储区的常数表再通过下面的例子理解如何使用变址寄存器+基址寄存器间接寻址方式实现程序散转。0800H

MOV

A,#02H;需要跳转的函数编址0802H

MOV

DPTR,#FunTable

;基址寄存器赋值(指针指向函数表首地址)0805H

MOV

B,#03H

;“LJMP”指令是三字节指令0807H

MUL

AB

;变址寄存器赋值(确定地址偏移量)0808H

JMP

@A+DPTR

;跳转到指针指向的地址执行指令

…FunTable:;函数表的首地址0910H

LJMP

Function0

;二进制指令码为“021234H”,跳转到地址1234H执行0913H

LJMP

Function1

;二进制指令码为“023000H”,跳转到地址3000H执行0916H

LJMP

Function2

;二进制指令码为“024567H”,跳转到地址4567H执行0919H

LJMP

Function3

;二进制指令码为“028000H”,跳转到地址8000H执行

…ORG

1234HFunction0:;地址“1234H”单元的程序

…ORG

3000HFunction1:;地址“3000H”单元的程序

…ORG

4567HFunction2:;地址“4567H”单元的程序

…ORG

8000HFunction3:;地址“8000H”单元的程序

…3.2

MCS-51系列单片机指令集及其说明按指令的功能分类,MCS-51系列单片机的指令集可以划分为下面五类:

(1)数据传送类指令:实现存储器赋值、数据转移等功能。

(2)算术运算类指令:实现数值的加、减、乘、除运算等功能。

(3)逻辑运算类指令:实现逻辑与、或、异或、移位等功能。

(4)控制转移类指令:实现程序条件转移、无条件转移等功能。

(5)位操作类指令:实现位清零、置位、判断等功能,由MCS-51系列单片机内部特有的布尔处理器完成。在本节中将分类详细介绍MCS-51系列单片机的指令集。在分类介绍之前,首先了解描述指令的一些特殊约定:

(1)当前使用的通用寄存器以“Rn”表示,包括R0~R7(即n=0~7)。

(2)当前使用的间接寄存器以“Ri”表示,包括R0和R1(即i=0、1)。

(3)当前使用的8bit直接地址以“direct”表示,包括低128B的RAM和SFR地址。

(4)当前使用的8bit立即数以“#data”表示。

(5)当前使用的16bit立即数以“#data16”表示。

(6)当前使用的8bit带有符号的相对偏移量用“rel”表示,取值范围为-128~+127。

(7)当前使用的16bit偏移地址和11bit偏移地址分别用“addr16”和“addr11”表示。

(8)内部RAM中可以位寻址的位用“bit”表示。

(9)寄存器或某地址中的内容用带有括号的寄存器名称或地址表示。例如,“(A)”表示累加器A中的内容;“(30H)”表示直接地址30H单元中的内容。3.2.1数据传送类指令数据传送类指令是汇编语言程序中使用最为频繁的一类指令,共有29条。数据传送类指令的操作目的是把源操作数传送到目的操作数,指令执行后源操作数保持不变,目的操作数被修改为与源操作数相同。如果要求在进行数据传送时不丢失目的操作数,这时可以使用数据交换型指令。数据传送类指令不影响Cy、AC和OC标志位;如果指令以累加器A作为目的操作数,那么指令执行后可能会影响奇偶校验标志位P。

1.以累加器A为目的操作数的数据传送类指令(4条)MOV

A,Rn;n=0~7,寄存器寻址MOV

A,direct

;direct可以是128B的RAM或SFR地址,直接地址寻址MOV

A,#data

;#data是8bit的立即数,立即寻址MOV

A,@Ri;i=0或1,寄存器间接寻址这4条指令都是将源操作数的内容传送到累加器A中,源操作数可以是通用寄存器、直接地址、立即数或间接寄存器。例如:MOV

A,R4;(R4)→(A),寄存器寻址MOV

A,30H;(30H)→(A),直接地址寻址MOV

A,#30H;30H→(A),立即寻址MOV

A,@R0;((R0))→(A),寄存器间接寻址

2.以Rn为目的操作数的指令(3条)MOV

Rn,A;n=0~7MOV

Rn,direct;n=0~7MOV

Rn,#data;n=0~7这些指令是将源操作数中的内容传送到当前使用的通用寄存器组对应的R0~R7中。例如:MOV

R2,A;(A)→(R2)MOV

R6,30H;(30H)→(R6)MOV

R7,#30H;30H→(R7)

3.以直接地址为目的操作数的指令(5条)MOV

direct,A

MOV

direct,Rn;n=0~7MOV

direct,direct

;direct可以是128B的RAM或SFR地址MOV

direct,#dataMOV

direct,@Ri;i=0或1这些指令是将源操作数中的内容传送到低128B的RAM区域的某单元中或某个SFR中。例如:MOV

30H,A;(A)→(30H)MOV

30H,R6;(R6)→(30H)MOV

30H,#30H;30H→(30H)MOV

30H,68H;(68H)→(30H)MOV

30H,@R0;((R0))→(30H)

4.以间接寄存器所指向的地址作为目的操作数的指令(3条)MOV

@Ri,A ;i=0或1MOV

@Ri,direct ;i=0或1MOV

@Ri,#data ;i=0或1这些指令是将源操作数中的内容传送到间接寄存器Ri所指向的地址单元中,这里的Ri是当前使用的通用寄存器组R0或R1。例如:MOV

A,#55H ;55H→AMOV

R0,#30H ;30H→(R0)MOV

@R0,A ;(A)→((R0))这3条指令连续执行后内部RAM中30H地址单元中的数据为55H,而寄存器R0中的数据为30H,累加器A中的数据也为55H。

5.堆栈操作指令(2条)PUSH

direct

;将直接地址direct单元中的内容压入堆栈POP

direct

;将堆栈栈顶中的内容弹出传送到直接地址direct单元中

MCS-51系列单片机的汇编语言程序允许使用多级子程序或子过程嵌套调用,而调用子程序或子过程时需要保护某些地址单元中的内容,最快捷的方法是使用堆栈操作,将某些需要保护的寄存器中的内容依次压入堆栈区,当子程序或子过程执行完成后再将这些内容依次从堆栈中弹出恢复到对应的寄存器中。MCS-51系列单片机的堆栈区管理使用8bit的堆栈指针SP来完成,SP作为指针总指向堆栈的栈顶位置,堆栈采用“先进后出(FILO,FirstInandLastOut)”原则。堆栈区必须设置在RAM区域,堆栈的容量必须在255字节以内。MCS-51系列单片机的汇编语言程序使用“PUSH”指令完成进栈操作,如PUSH

direct这条指令中的direct可以是低128B的RAM区域直接地址或SFR,例如:PUSH

ACC ;累加器A的内容进栈PUSH

B ;特殊功能寄存器B进栈PUSH

02H ;RAM区域02H地址单元中的内容进栈PUSH

DPL ;DPTR的低8位内容进栈

PUSH指令的执行过程分为两步:首先将堆栈指针SP加1,然后将直接地址direct单元中的内容压入堆栈指针SP所指向的堆栈区的单元保存。看看下面指令的执行过程:MOV

SP,07H

;内部RAM区域从08H地址开始作为堆栈区,SP初始值为07HMOV

A,#30H

MOV

PSW,#00HPUSH

ACC;(SP)+1=08H→(SP),(A)→((SP))PUSH

PSW;(SP)+1=09H→(SP),(PSW)→((SP))

MCS-51系列单片机的汇编语言程序使用“POP”指令完成出栈操作,如POP

direct这条指令中的direct可以是低128B的RAM区域直接地址或SFR,例如:POP

ACC

;将SP所指向的堆栈单元内容弹出到累加器A中POP

B

;将SP所指向的堆栈单元内容弹出到特殊功能寄存器B中POP

02H

;将SP所指向的堆栈单元内容弹出到RAM区域的02H地址单元中POP

DPL

;将SP所指向的堆栈单元内容弹出到DPTR的低8位中

POP指令的执行过程也分为两步:首先将堆栈指针SP所指向的堆栈区单元中的内容弹出并传送到直接地址direct单元中,然后堆栈指针SP减1。看看下面指令的执行过程:MOV

SP,07H

;内部RAM区域从08H地址开始作为堆栈区,SP初始值为07HMOV

A,#30H

MOV

PSW,#00HPUSH

ACC;(SP)+1=08H→(SP),(A)→((SP))PUSH

PSW;(SP)+1=09H→(SP),(PSW)→((SP))MOV

A,#55HMOV

PSW,#06HPOP

PSW;((SP))→(PSW),(SP)-1=08H→(SP)POP

ACC;((SP))→(A),(SP)-1=07H→(SP)显然,累加器A和程序状态寄存器PSW被依次压入堆栈前,(A)=30H,(PSW)=00H,将A和PSW分别压入堆栈区后,A和PSW又分别被修改为55H和06H,内容都变化了。但是,由于使用“POP”指令又将PSW和A依次弹出堆栈后,A和PSW中的内容又恢复到原来的内容,即(A)=30H,(PSW)=00H。这里必须注意,要正确使用堆栈保存某些地址单元中的内容,使用“PUSH”和“POP”指令必须成对,而且应严格按照“先进后出”原则。

6.16位数据的传送指令(1条)MOV

DPTR,#data16这条指令是将一个16bit的立即数传送给16位数据指针DPTR,这是MCS-51系列单片机的指令集中惟一的一条16bit的数据传送指令。由于DPTR是由特殊功能寄存器DPH和DPL组成的,执行这条指令后,实际上是把data16的高8位传送给DPH,而把低8位数据传送给DPL。所以这条指令与执行下面两条指令是完全相同的:MOV

DPH,#data16_high8bitMOV

DPL,#data16_low8bit例如:MOV

DPTR,#1234H

;1234H→(DPTR),(DPH)=12H,(DPL)=34H等同于MOV

DPH,#12H;12H→(DPH)MOV

DPL,#34H;34H→(DPL)的执行效果。

7.外部数据存储器传送指令(4条)MOVX

A,@Ri;((Ri))→(A),读外部数据存储器或I/O端口,地址在Ri中,i=0或1;MOVX

@Ri,A;(A)→((Ri)),写外部数据存储器或I/O端口,地址在Ri中,i=0或1MOVX

A,@DPTR;((DPTR))→(A),读外部数据存储器或I/O端口,地址在DPTR中MOVX

@DPTR,A;(A)→((DPTR)),写外部数据存储器或I/O端口,地址在DPTR中

8.查表操作指令(2条)MOVCA,@A+PC;以PC作为基址寄存器的查表指令MOVCA,@A+DPTR;以DPTR作为基址寄存器的查表指令这2条指令都是使用变址寄存器(A)+基址寄存器(PC或DPTR)间接寻址方式的指令。指令的执行过程是,首先将变址寄存器(A)中的内容和基址寄存器(PC或DPTR)中的内容相加,得到一个16bit的地址,然后将程序存储器区域中该地址单元中的数据传送到累加器A中。这个过程常常用来访问程序存储器区域的常数表,所以俗称查表指令。注意,这2条指令执行后,基址寄存器(PC或DPTR)中的内容不变。显然,变址寄存器用累加器A,那么,当基址寄存器不变时,这2条指令可以访问的常数表必须小于256个字节。当然,如果将较大的常数表分割成256B大小的块,访问不同的块时,首先修改基址寄存器内容,这样就可以实现访问大于256B的常数表。由于PC是根据当前程序执行的程序位置确定的,不能由程序软件任意设定,因此访问大于256B的常数表时,仅可以使用DPTR作为基址寄存器。例如:8000H

MOV

A,#04H;变址寄存器(A)=04H8002H

MOVC

A,@A+PC ;(PC)+1=8003H→(PC),(PC)+(A)=8007H;(8007H)→A,(A)=31H8003H

LJMP

SKIP8006H

DB

30H8007H

DB

31H8008H

DB

32H…注意,执行“MOVC”指令时,首先需要执行当前的这条指令,即“MOVC”指令,这条指令是单字节指令,那么PC将加1,然后将新的PC值与变址寄存器相加,最后将所指向的地址单元中的内容传送到A中。再看看下面以DPTR作为基址寄存器的查表指令的应用示例,程序首先让DPTR指向常数表“AscTable”,然后用MOVC指令实现查表。0800H

MOV

DPTR,#AscTable

;基址寄存器指向常数表的首地址,即(DPTR)=0900H0803H

MOV

A,#10H

;变址寄存器(A)=10H0805H

MOVC

A,@A+DPTR

;查表,执行后(A)=Q

…AscTable:0900H

DB

'A','B','C','D','E','F','G','H'

;8个字符0908H

DB

'I','J','K','L','M','N','O','P'

;8个字符0910H

DB

'Q','R','S','T','U','V','W','X'

;8个字符0918H

DB

'Y','Z','a','b','c','d','e','f'

;8个字符…

9.字节交换指令(3条)XCH

A,Rn;n=0~7XCH

A,directXCH

A,@Ri;i=0或1这3条指令都是实现将累加器A中的内容与源操作数中的内容互换(交换),执行后,源操作数中的内容与交换前的累加器A中的内容相同,累加器A中的内容与交换前的源操作数中的内容相同。例如:MOV

A,#55H;55H→(A)MOV

R2,#30H;30H→(R2)XCH

A,R2

;(A)与(R2)互换,执行后(A)=30H,(R2)=55H再如:MOV

A,#55H;55H→(A)MOV

30H,#38H;38H→(30H)MOV

R1,#30H;30H→(R1)XCH

A,@R1;(A)与((R1))互换,执行后(A)=38H,((R1))=55H

10.半字节交换指令(1条)XCHD

A,@Ri;i=0或1这条指令是实现累加器A的低4位(低半字节)与间接寄存器所指向的地址单元中的低4位互换,而各自的高4位(高半字节)保持不变。例如:MOV

A,#55H;55H→(A)MOV

30H,#30H;38H→(30H)MOV

R1,#30H;30H→(R1)XCHD

A,@R1;(A)的低半字节与((R1))的低半字节互换执行后(A)=58H,((R1))=35H

11.累加器内部高半字节与低半字节互换指令(1条)SWAP

A这条指令能够实现累加器A内部的高4位与低4位的内容互换,可以用下面的图表示其执行过程。例如:MOV

A,#5AH;5AH→(A)SWAPA;高半字节与低半字节互换,(A)=0A5H3.2.2算术运算类指令

MCS-51系列单片机指令集提供直接使用的8bit数值加、减、乘、除法运算指令,以及自加1和自减1指令,共有24条。这些指令能够为MCS-51系列单片机提供强大的数值运算处理能力,在工业控制领域使用MCS-51系列单片机可以完成复杂的控制算法。算术运算类指令执行后可能影响Cy、AC、OV和P等标志位。

1.不带进位的加法运算指令(4条)ADD

A,Rn ;n=0~7ADD

A,direct;direct可以是低128B的RAM单元或SFR地址ADD

A,@Ri ;i=0或1ADD

A,#data ;data是任意8bit的立即数这些指令都是以累加器A为目的操作数的指令,执行时,不考虑原来进位位的状态,直接将源操作数加到累加器A中,并且源操作数保持不变。这些指令执行后,根据指令的执行情况重新对PSW中的Cy、AC、OV和P等4个标志位进行置位或清零。注意,这里的“不带进位”是指在两个数相加时不考虑原来进位位的状态,但指令执行时仍然会影响进位位。例如:SETB

C ;1→(Cy)MOV

A,#83H ;83H→(A)ADD

A,#80H ;(A)+80H=03H→(A),1→Cy指令执行前,虽然Cy为1,但“ADD”指令是不考虑Cy状态的,执行后累加器A中的内容为03H,由于加法执行后有进位,因此(Cy)=1。再比较下面的指令:CLR

C ;0→(Cy)MOV

A,#83H ;83H→(A)ADD

A,#80H ;(A)+80H=03H→(A),1→(Cy)执行后累加器A中的内容为03H,由于加法执行后有进位,因此(Cy)=1。

2.带进位加法运算指令(4条)ADDC

A,Rn ;n=0~7ADDC

A,direct

;direct可以是低128B的RAM单元或SFR地址ADDC

A,@Ri ;i=0或1ADDC

A,#data ;data是任意8bit的立即数这些指令与不带进位的加法运算指令的区别就在于,带进位加法指令在执行加运算时必须考虑进位位的状态,指令执行后,根据指令的执行情况,重新对Cy、AC、OV、P等标志位置位或清零。比较下面带进位加法和不带进位加法指令的执行结果:①带进位的加法指令程序:SETB

C ;1→(Cy)MOV

A,#98H ;98H→(A)ADDC

A,#0C8H

;执行(A)+(Cy)+C8H=61H→(A),1→(Cy)执行ADDC时,首先将Cy加到累加器A中,然后执行(A)+C8H,执行结果(A)=61H,有进位,进位位Cy被置位。②不带进位的加法指令程序SETB

C ;1→(Cy)MOV

A,#98H ;98H→(A)ADD

A,#0C8H

;执行(A)+C8H=60H→(A),1→(Cy)执行结果(A)=60H,有进位,进位位Cy被置位。显然,执行ADDC和ADD之前如果进位位为“1”,那么两指令执行的结果不相同。再比较下面带进位加法和不带进位加法指令的执行结果。①带进位的加法指令程序:CLR

C ;0→(Cy)MOV

A,#98H ;98H→(A)ADDC

A,#0C8H

;执行(A)+(Cy)+C8H=60H→(A),1→(Cy)执行ADDC时,首先将Cy加到累加器A中,然后执行(A)+C8H,执行结果(A)=60H,有进位,进位位Cy被置位。②不带进位的加法指令程序:CLR

C ;0→(Cy)MOV

A,#98H ;98H→(A)ADD

A,#0C8H

;执行(A)+C8H=60H→(A),1→(Cy)执行结果(A)=60H,有进位,进位位Cy被置位。显然,执行ADDC和ADD之前如果进位位为“0”,那么两指令执行的结果相同。

3.减法运算指令(4条)SUBB

A,Rn ;n=0~7SUBB

A,direct

;direct可以是低128B的RAM单元或SFR地址SUBB

A,@Ri ;i=0或1SUBB

A,#data ;data是任意8bit的立即数首先必须注意,MCS-51系列单片机指令集中的减法指令在被执行时,都必须考虑减运算之前的借位位状态,当然指令执行后会影响Cy(用作减法运算时,Cy被称做借位)、AC、OV、P等标志位。减法指令都是以累加器A作为目的操作数,执行时,先将借位从累加器A中减去,然后将源操作数从A中减去,减后的差值存放到累加器A中。在执行减去借位或减去源操作数而需要借位时,借位位Cy被置位。例如:SETB

C ;1→(Cy)(借位位被置位)MOV

A,#64H ;64H→(A)SUBB

A,#0C8H

;执行(A)-(Cy)-C8H=9BH→(A),1→(Cy)执行SUBB指令时,首先执行(A)-(Cy)=64H-1=63H→A,即(A)=63H,然后继续执行(A)-C8H=9BH,显然需要借位,那么借位位Cy被置位。其他减法指令的例子如下:SUBB

A,R3

;执行(A)-(Cy)-(R3)=?→(A),影响CySUBB

A,30H

;执行(A)-(Cy)-(30H)=?→(A),影响CySUBB

A,@R1

;执行(A)-(Cy)-((R1))=?→(A),影响Cy

4.乘法指令(1条)MUL

AB注意,这条指令和后面的除法指令都是非常特殊的指令寻址方式,它们的源操作数都是A和B,同时A和B又都是它们的目的操作数,执行乘法和除法指令后,两个操作数中的内容都将被修改,这与其他指令大不相同。而且,乘法和除法指令的目的操作数和源操作数之间没有“,”分割符。另外,在MCS-51系列单片机的指令集中,乘法和除法指令的目的操作数和源操作数必须是A和B。执行乘法指令后的乘积是一个16bit的数据,MCS-51指令中约定将乘积分成低8bit(低字节)和高8bit(高字节),分别存放在累加器A和B中。乘法指令执行前不考虑进位位或借位位,指令执行后,Cy将被无条件清零,同时将影响标志位OV和P,但不影响辅助进位位AC。例如:SETB

C ;1→(Cy)MOV

A,#64H ;64H→(A)MOV

B,#03H ;03H→(B)MUL

AB

;执行(A)×(B)=012CH,01H→A,2CH→B,0→Cy

5.除法指令(1条)DIV

AB与乘法指令一样,这条指令也是一种特殊的寻址方式,A和B既都是源操作数又都是目的操作数,执行除法运算后,源操作数A和B中的内容都将被修改。执行除法指令是将累加器A中的内容作为被除数,B中的内容作为除数,即执行“(A)÷(B)”,执行除法运算后的结果包括商和余数,共2个字节,商被存放在累加器A中,而余数存放在B中,执行后Cy被无条件清零,同时将影响OV和P等标志位,但不影响辅助进位位AC的状态。例如:SETB C ;1→(Cy)MOV A,#09H ;09H→(A)OV B,#02H ;02H→(B)DIV

AB

;执行(A)÷(B),商等于04H→(A),余数等于01H→(B);0→(Cy)(进位位/借位位被无条件清零)

6.自加1指令(5条)INC

AINC

Rn ;n=0~7INC

direct ;direct可以是低128B的RAM单元或SFR地址INC

@Ri ;i=0或1INC

DPTR ;16位数据指针自加1这些指令都是自加1指令,执行这些指令会影响某些标志位,并且连续执行自加1指令会造成目的操作数中的内容回滚。例如顺序执行下面的指令:MOV

A,#0FEH ;FEH→(A)INC

A;执行(A)+1=FFH→(A),(A)=0FFHINC

A ;执行(A)+1=00H→(A),(A)=00HINC

A ;执行(A)+1=01H→(A),(A)=01H其他8bit寄存器内容自加1指令与这些指令相同。再如:MOV

DPTR,#0FFFEH

;FFFEH→(DPTR)INC

DPTR

;执行(DPTR)+1=FFFFH→(DPTR),(DPTR)=0FFFFHINC

DPTR

;执行(DPTR)+1=0000H→(DPTR),(DPTR)=0000HINC

DPTR

;执行(DPTR)+1=0001H→(DPTR),(DPTR)=0001H虽然DPTR是由特殊功能寄存器DPH和DPL组成的,执行DPTR自加1指令时,DPL与DPH之间的进位将自动完成。

7.自减1指令(4条)DEC

ADEC

Rn;n=0~7DEC

direct;direct可以是低128B的RAM单元或SFR地址DEC

@Ri;i=0或1这些都是8bit寄存器中内容的自减1指令,执行这些指令会影响某些标志位。与自加1指令一样,连续执行自减1指令会造成目的操作数中的内容回滚。例如顺序执行下面的指令:MOVA,#01H;01H→(A)DEC

A;执行(A)-1=00H→(A),(A)=00HDEC

A;执行(A)-1=FFH→(A),(A)=0FFHDEC

A;执行(A)-1=FEH→(A),(A)=0FEH其他自减1指令的例子如下:DEC

R2 ;(R2)-1=?→(R2)DEC

30H ;(30H)-1=?→(30H)DEC

@R1 ;((R1))-1=?→

((R1))

8.累加器中的内容进行十进制调整指令(1条)DA

A当执行二进制BCD码运算时,往往需要运算结果仍为BCD码,这条指令是对累加器A中存储的由前面二进制BCD码运算的结果进行十进制调整,可以使A中的结果仍保持二进制的BCD码格式。该指令执行时会受Cy和AC标志位的影响,并且指令执行后将影响Cy标志位,但不影响AC标志位。该指令的执行过程可描述为:如果累加器A中的低4位(低半字节)大于9,或者AC标志位已经被置位,那么将A中的低4位加6,如果加之后有进位,则将进位位加到A的高4位(高半字节),低4位调整完毕;然后调整高4位,如果累加器A中的高4位(高半字节)大于9,或者Cy标志位已经被置位,那么将A中的高4位加6,如果加之后有进位,则将进位位Cy置位。例如:MOV

A,#34H ;34H→(A)MOV

R2,#89H ;89H→(R2)ADD

A,R2

;执行(A)+(R2)=BDH→(A),(Cy)=0,(AC)=0DA

A

;(A)=0BDH,(Cy)=0并且(AC)=0,调整后,(A)=23H,(Cy)=1再如:SETB

C ;1→(Cy)MOV

A,#99H ;99H→(A)MOV

R2,#99H ;99H→(R2)ADDC

A,R2

;(A)+Cy+(R2)=33H→(A),(Cy)=1,(AC)=1DA

A

;(A)=33H,(Cy)=1并且(AC)=1,调整后,(A)=99H,(Cy)=13.2.3逻辑运算类指令逻辑运算类指令共有24条。

1.仅可以使用于累加器的单字节逻辑运算指令(6条)① CLRA将累加器A中的8个位一次性全部清零操作。指令执行后标志位P将被清零。② CPLA将累加器A中的8个位同时按位取反操作。指令执行标志位P将被修改。③ RLA将累加器A中的8个位循环左移1位。该指令不影响Cy、AC、OV和P标志位,其执行过程如下图所示:④ RRA将累加器A中的8个位循环右移1位。该指令不影响Cy、AC、OV和P标志位,其执行过程如下图所示:⑤ RLC

A将累加器A中的8个位与Cy一起循环左移1位。该指令不影响AC和OV标志位,但执行后将影响Cy和P标志位,其执行过程如下图所示:⑥ RRCA将累加器A中的8个位与Cy一起循环右移1位。该指令不影响AC和OV标志位,但执行后将影响Cy和P标志位,其执行过程如下图所示:

2.字节按位逻辑与运算指令(6条)ANL

A,Rn ;n=0~7ANL

A,direct

;direct可以是低128B的RAM单元或SFR地址ANL

A,@Ri ;i=0或1ANL

A,#data;data可以是任何8bit立即数ANL

direct,A

ANL

direct,#data前4条指令是实现将源操作数的内容和累加器A中的内容按位执行逻辑与运算,执行后的结果存放在累加器A中,并且源操作数中的内容保持不变;后2条指令是实现将源操作数的内容和直接地址单元中的内容按位执行逻辑与运算,执行后的结果存放在直接地址单元中,并且源操作数中的内容保持不变。例如:MOV

A,#38H ;38H→(A)MOV

R2,#4AH ;4AH→(R2)ANL

A,R2 ;(A)and(R2)=08H→(A)连续执行这3条指令后的结果存放在累加器A中,结果为08H。这种单字节按位逻辑与运算的过程如下图所示:

3.字节按位逻辑或运算指令(6条)ORL

A,Rn ;n=0~7ORL

A,direct

;direct可以是低128B的RAM单元或SFR地址ORL

A,@Ri ;i=0或1ORL

A,#data ;data可以是任何8bit立即数ORL

direct,A

ORL

direct,#data前4条指令是实现将源操作数的内容和累加器A中的内容按位执行逻辑或运算,执行后的结果存放在累加器A中,并且源操作数中的内容保持不变;后2条指令是实现将源操作数的内容和直接地址单元中的内容按位执行逻辑或运算,执行后的结果存放在直接地址单元中,并且源操作数中的内容保持不变。例如:MOV

A,#38H ;38H→(A)MOV

R2,#4AH ;4AH→(R2)ORL

A,R2 ;(A)or(R2)=7AH→(A)

4.字节按位逻辑异或运算指令XRL

A,Rn ;n=0~7XRL

A,direct

;direct可以是低128B的RAM单元或SFR地址XRL

A,@Ri ;i=0或1XRL

A,#data ;data可以是任何8bit立即数XRL

direct,A

XRL

direct,#data前4条指令是实现将源操作数的内容和累加器A中的内容按位执行逻辑异或运算,执行后的结果存放在累加器A中,并且源操作数中的内容保持不变;后2条指令是实现将源操作数的内容和直接地址单元中的内容按位执行逻辑异或运算,执行后的结果存放在直接地址单元中,并且源操作数中的内容保持不变。例如:MOV

A,#38H ;38H→(A)MOV

R2,#4AH ;4AH→(R2)XRL

A,R2 ;(A)xor(R2)=7AH→(A)3.2.4控制转移类指令控制转换类指令共有17条。

1.无条件转移指令(1条)AJMP

addr11这条指令可以控制程序在2KB(211)地址范围内无条件跳转。使用该指令时是将64KB的程序存储器空间分成32个块,每个块为2KB,那么将要跳转的目标地址必须与AJMP的下一条指令的第一个字节保持在2KB范围内(即将要跳转的目标地址与AJMP下一条指令的地址A15~A11相同)。执行该指令时,MCS-51单片机自动先将PC加2(AJMP指令是2字节指令),然后把addr11送入程序计数器PC的PC.10~PC.0,同时保持PC.15~PC.11不变,最终跳转到PC指定的地址继续执行程序。例如:…AJMP

here…;仅允许2KB的程序代码here:…

2.相对转移指令(1条)SJMP

rel这也是一种无条件跳转指令,执行该指令时,MCS-51系列单片机自动先将PC加2(SJMP指令是2字节指令),然后把带有符号的地址偏移量rel加到PC中,得到将要跳转的目标地址在PC中。由于rel是8bit的带有符号的地址偏移量,所以跳转的目标地址可以在SJMP下一条指令的之前128B到之后127B之间。

3.长跳转指令(1条)LJMP

addr16该指令也是一条无条件跳转指令,而且将要跳转的目标地址可以是64KB范围内的任意地址,该指令占用3字节程序存储器。执行该指令时,MCS-51系列单片机自动将指令的第2和3字节的内容分别装入PC的高8位和低8位中,然后无条件跳转到PC确定的目标地址。

4.散转指令(1条)

JMP

@A+DPTR该指令可以实现无条件跳转,以DPTR的值(16bit的基地址)与A的值(8bit偏移地址)之和作为跳转的目标地址。显然,受偏移量(8bit)的限制,将要跳转的目标地址必须位于基地址加256字节范围内。通过修改偏移量,可以改变跳转的目标地址,所以它是程序散转处理。该指令是单字节指令,占用1个字节的程序存储器。例如:0300H

LCALL

GetKey

;返回值在A中,A的内容是键值,等于0~3(四个键)0303H

MOV

DPTR,#KeyPro

;基地址为函数表的起始地址(表头)0306H

MOV

B,#03H ;03H→(B)0308H

MUL

AB ;执行(A)×(B)→(A)0309H

JMP

@A+DPTR

;跳转到以DPTR作为基地址、(A)内容作为偏移量的地址

…KeyPro: ;函数表起始地址(表头)0800H

LJMP

Key0Pro

;3字节地址指令,无条件长跳转到“Key0Pro”目标地址0803H

LJMP

Key1Pro

;3字节地址指令,无条件长跳转到“Key1Pro”目标地址0806H

LJMP

Key2Pro

;3字节地址指令,无条件长跳转到“Key2Pro”目标地址0809H

LJMP

Key3Pro;3字节地址指令,无条件长跳转到“Key3Pro”目标地址080CH

NOP

Key0Pro:;Key0Pro子过程的入口(标号地址)

Key1Pro:;Key1Pro子过程的入口(标号地址)

Key2Pro:;Key2Pro子过程的入口(标号地址)

Key3Pro:;Key3Pro子过程的入口(标号地址)

5.累加器是否为零的条件相对转移指令(2条)

JZ

rel;如果累加器A等于零,则跳转到目标地址

JNZ

rel;如果累加器A不等于零,则跳转到目标地址这是一组条件相对转移指令,执行该指令是以“累加器A中的值是否为零”为条件。执行指令时,如果条件是“真”(即条件满足),按照rel偏移量相对跳转;如果条件不满足,则顺序执行其后的一条指令。将要跳转的目标地址可以在下一条指令的之前128B到之后127B之间。例如:XRL_A,#55H;执行(A)xor55H→(A)JZ_IsEql;如果(A)=00H,跳转到“IsEql”符号地址MUL_AB;如果(A)不为00H,则顺序执行…IsEql:;符号地址…

6.比较不相等的条件相对转移指令(4条)

CJNE

A,direct,rel

CJNE

A,#data,rel

CJNE

Rn,#data,rel ;n=0~7

CJNE

@Ri,#data,rel ;i=0或1这是一组条件相对跳转指令,这些指令都是以“比较两个操作数是否相等”为条件。如果两个操作数不相等(即条件为“真”),根据rel指定的偏移量相对跳转;如果条件不成立(即两个操作数相等),则顺序执行下一条指令。注意,执行这些指令判断条件时,会影响Cy标志位,如果第一个操作数(无符号整型)小于第二个操作数(无符号整型),那么进位标志位Cy被自动置位,否则进位位自动被清零,但是两个操作数中的内容都保持不变。例如:

MOV

A,#55H ;55H→(A)

CJNE

A,B,NotEql

;如果(A)不等于(B),跳转到符号地址“NotEql”

… ;如果(A)=(B),则继续执行NotEql:

JC

BGreater ;如果(A)<(B),跳转到符号地址“BGreater”

… ;如果(A)>(B),则继续执行BGreater:

… ;(A)<(B)时,执行下面的指令

7.自减1是否为零的条件相对转移指令(2条)

DJNZ

Rn,rel;n=0~7

DJNZ

direct,rel这是一组条件相对跳转指令,这些执行是以“操作数自减1后是否为零”为条件。如果操作数自减1后不为零,根据rel指定的偏移量相对跳转;如果条件不成立(即操作数自减1后为零),则顺序执行下一条指令。例如下面的延时子程序:Delay: ;延时时间大约为(A)×100

PUSH

06H ;R6压入堆栈

PUSH

07H ;R7压入堆栈

MOV

R7,A ;延时循环计数器在A中,(A)→(R7)times:

MOV

R6,#100

;嵌套循环计数器初始值,100→(R6)times1:

DJNZ

R6,times1

;执行(R6)-1→(R6),如果R6不为零,则跳转到times1

DJNZ

R7,times

;执行(R7)-1→(R7),如果R7不为零,则跳转到times

POP

07H ;从堆栈中恢复R7的值

POP

06H ;从堆栈中恢复R6的值

RET ;子程序返回

8.调用子程序指令(2条)

ACALL

addr11

LCALL

addr16这是MCS-51系列单片机的两条调用子程序的指令,ACALL指令允许在2KB范围内调用,而LCALL可以在64KB范围内调用。在执行被调用的子程序过程中,遇到子程序返回指令(即RET指令),MCS-51系列单片机将自动返回到ACALL或LCALL指令的下面一条指令继续执行程序。调用过程与无条件跳转指令的惟一区别就是调用过程遇到RET后结束并返回,而无条件跳转却不能。执行ACALL或LCALL指令的具体过程分三步:首先,当前PC的值增加2或3;然后,将PC值分两次压入堆栈,PC的低字节先进栈,之后PC的高字节进栈;最后,修改PC的值为指令操作码所指定的目标地址,即PC的值等于被调用的子程序或子过程的首地址。该指令的执行,由于PC值被修改,因而直接跳转到被调用的子程序。遇到子程序返回指令(即RET指令),PC的值将自动从堆栈中恢复,于是程序将返回到ACALL或LCALL之后的一句指令继续执行程序。例如:GetKey:0100H

MOV

A,#04H

;04H→(A)0102H

JB

P1.0,GetKey1

;如果(P1.0)=1,没有Key0,则跳转到GetKey10105H

ACALL

Delay;PC值进栈,跳转到子程序“Delay”0107H

JB

P1.0,GetKey1

;如果(P1.0)=1,没有Key0,则跳转到GetKey1010AH

MOV

A,#00H

;有Key0键,返回值存放在A中…GetKey1:…Delay: ;子程序的首地址0300H

PUSH

06H ;R6压入堆栈…0309H

POP

06H ;从堆栈中恢复R6的值030AH

RET;从堆栈中恢复PC的值,子程序返回

9.子程序返回和中断返回指令(2条)

RET

RETI这两条都是子过程的返回指令,其中RET作为一般的子程序返回使用,而RETI作为中断服务程序(ISR,InterrupterServiceRoutine)返回专用。在执行这两条指令时,MCS-51系列单片机首先自动从堆栈中恢复PC的高字节和低字节的值,然后返回到PC指定的程序地址继续执行程序。例如:0000H

LJMP

main

;复位向量地址,无条件跳转到main0003H

LJMP

INT0_ISR

;INT0中断向量入口地址,跳转到INT0_ISR0006H

NOP;空操作0007H

NOP;空操作

…ORG

0100H

;程序存放定位,main开始的程序从0100H地址开始存放main:0100H

MOV

SP,#07H

;堆栈指针指向07H,堆栈区从08H开始0103H

LACLL

Delay

;执行该指令先将下一条指令的地址(0106H)压入堆;栈,先将低8位进栈,然后高8位进栈(即堆栈区;(08H)=06H(09H)=01H),保存PC之后立即跳到Delay;去执行程序0106H

SETB

EX0 ;1→(EX0)0108H

SETB

EA ;1→(EA)010AH

MOV

R0,#30H ;30H→(R0)

…ORG

0200H

;程序存放定位,Delay开始的程序从0200H地址开始存放Delay:0200H

MOV

R6,#06H ;06H→(R6)Delay1:0202H

DJNZ

R6,Delay1 ;执行(R6)-1→(R6),然后判断是否跳转0204H

RET

;子程序返回时,首先从堆栈中恢复PC的值(0106H),;然后跳转到PC指定的地址(0106H)继续执行程序

…ORG

0300H

;INT0_ISR开始的程序从0300H地址开始存放INT0_ISR:0300H

NOP ;空操作0301H

JB

P3.2,INT0_ISRret

;如果P3.2为高电平,跳转到INT0_ISRret0304H

SETB

P1.6 ;将P1.6置位INT0_ISRret:0306H

RETI

;中断服务程序返回时,首先清除IE0标志,并从堆栈中恢复;PC的值,然后按照PC定义的程序地址去执行程序

10.空操作指令(1条)NOP执行该指令仅影响PC的值,完成(PC)+1→(PC)操作。3.2.5位操作类指令位操作类指令共有17条。

1.位传送指令(2条)

MOV

C,bit

MOV

bit,C位传送指令必须以Cy作为其中的一个操作数,即位传送指令是实现直接位地址中的位变量与Cy之间的传送。例如:

MOV

C,30H;位地址(30H)→Cy

MOV

P1.3,C;将Cy的状态写入位地址P1.3

2.位变量修改指令(6条)

CLR C

SETB CCPL CCLR bit

SETB bit

CPL bit这组指令是将位操作数进行清零、置位和取反操作,前面的3条指令是以Cy作为操作数,后面的3条是以直接位寻址位作为操作数。例如:CLR

C ;Cy清零操作,0→(Cy)SETB

C ;Cy置位操作,1→(Cy)CPL

C ;Cy取反操作,not(Cy)→(Cy)CLR

30H ;直接位寻址位30H取反操作,0→(30H)SETB

P1.7 ;特殊功能寄存器可位寻址位P1.7置位操作,1→(P1.7)

3.位变量逻辑运算指令(4条)

ANL

C,bit

ANL

C,/bit

ORL

C,bit

ORL

C,/bit这组指令都是以Cy作为目的操作数,直接可位寻址位作为源操作数,指令将源操作数与Cy进行“逻辑与”或“逻辑或”,结果保存在Cy中,并且源操作数保持不变。如果源操作数前面带有“/”符号,表示执行逻辑运算时,使用源操作数的反码作为源操作码,即使如此也不影响源操作数的值。例如:ANL

C,30H

;可位寻址位30H和Cy执行“逻辑与”操作,结果存放在Cy中ANL

C,/30H

;可位寻址位30H的反码和Cy执行“逻辑与”操作,结果存放在Cy中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论