目录   一.单片机指令简述 二.汇编指令 指令中的常用符号 三.寻址方式 寻址方式与相应的存储器的空间、寄存器 1.寄存器寻址方式 2.寄存器间接寻址 3.立即寻址 4.直接寻址 5.基址寄存器+变址寄存器的间接寻址 6.相对寻址 7.位寻址 四.指令系统 1.数据传送指令 1.1内部八位数据传送指令 举例分析: 举例分析: 举例分析: 举例分析: 举例分析: 举例分析: 举例分析: 数据传送指令总表    

一.单片机指令简述

单片机的功能是从外部世界接收信息,并在 CPU 中进行加工,处理,然后再将结果送回外部世界。
 
要完成上述一系列操作, 首先要提供一套具有单片机能够识别特定功能的操作命令,这种操作命令就叫
做指令 。 CPU 所能执行的各种指令的集合称为指令系统 。不同的机种有不同的指令系统
 
单片机指令系统共有指令 111 条,分为五大类:
 
数据传送类指令(29 条)
算术运算类指令(24 条)
逻辑运算及移位类指令(24 位)
控制转移类指令(17 条)
位操作类指令(17 条)
 

二.汇编指令

 
MCS-51 系列单片机的汇编指令由 操作码助记符字段和操作数助记符字段 组成。指令格式如下:
 
微信图片_20201120165708
 
第一部分为操作码助记符,表示要执行的操作指令 ,一般由二至五个英文字母组成,例如 JC 、MOV 、
ADD 、 ORL 、 SETB 、 ACALL 等。
 
第二部分为操作数,指明参与操作的数据。 操作码与操作数之间用一个或几个空格隔开。根据指令
功能的不同,操作数可以有一个、两个、三个或者没有,操作数之间用逗号“,”分隔开。
 

指令中的常用符号

在描述 指令系统时,经常使用各种缩写符号,其含义如表 所示:
 
微信图片_20201120165732
 

三.寻址方式

MCS-51 系列单片机共有 7 种寻址方式: 立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址
寻址、相对寻址和位寻址。
 
寻址方式是指令中确定操作数的形式。 在 单片机中,存放数据的存储器空间有 4 种形式: 内
部数据 RAM、特殊功能寄存器 SFR、外部数据 RAM 和程序存储器 。其中,除内部数据 RAM 和SFR 统
一编址外,其它存储器都是独立编址的
 
为了区别指令中操作数所 处的地址空间,对于不同存储器中的
数据操作,采用了不完全相同的寻址方式,这是51 单片机在寻址方式上的一个显著特点。
 

寻址方式与相应的存储器的空间、寄存器

  微信图片_20201120165756  

1.寄存器寻址方式

寻址空间:
R0~R7,由程序状态字 PSW 的 RS1、RS0 两位的值选定工作寄存器区;
 
A、B、CY、DPTR。
 
寄存器寻址是指由指令选定寄存器中的内容作为操作数的寻址方式,由指令的操作码字节的最低 3
位所寻址的工作寄存器 R0~R7。 对累加器 A 、寄存器 B 、数据指针 DPTR 、位处理累加器 CY等,也以
寄存器方式寻址
 
例如:MOV A,R0;
该指令的功能为将工作寄存器 R0 的内容送入累加器 A 中,其中的操作数 A、R0 都是寄存器寻址。
 
其执行过程如图 所示:
微信图片_20201120165819
 

2.寄存器间接寻址

寻址空间:
内部 RAM(@R0、@R1、SP);
外部数据存储器(@R0、@R1、DPTR)。
 
指令所选中的寄存器内容是实际操作数的地址(而不是操作数本身),这种寻址方式称为寄存器间接
寻址。 当用 R0 、 R1 寄存器间接寻址之前,需要有一个确定的寄存器间接寻址区,并且各个寄存器均是
有操作数地址的。
 
寄存器间接寻址是指将指令指定的寄存器内容作为操作数所在的地址,对该地址单元中的内容进行
操作的寻址方式。51单片机 规定,使用 R0 和 R1 作为间接寻址寄存器,对于51 系列单片机,
可寻址内部 RAM 中地址从 00H ~ 7FH 的 128 个字节单元内容。对于 8052 子系列单片机,则为256 个字
节单元的内容,而且高 128 个字节的 RAM ,只能使用寄存器间接寻址方式访问。
 
另外,数据指针DPTR也可作为间接寻址寄存器,寻址外部数据存储器的 64KB 空间。
 
例如:MOV A,@R1;
 
该指令的功能是将当前工作区 以 R1 中的内容作为地址的存储单元中的数据送到累加器 A 中 ,其源
操作数采用寄存器间接寻址方式,以 R1 作为地址指针。假设 R1 中的内容为 30H ,则该指令是将地址为
30H 存储单元中的内容为 45H ,指令执行后累加器 A 中内容为 45H 。
 
其执行过程如图 所示:
 
微信图片_20201120165842

3.立即寻址

寻址空间:
程序存储器。
 
立即寻址是指指令的操作数以指令字节的形式存放在程序存储器中 。即操作码后紧跟着一个称为立
即数的操作数,这是在编程时由用户给定存放在程序存储器中的常数。
 
立即寻址的是指令中的操作数即为立即数。其特征为数前加符号“#”。指令中的立即数有 8 位立即
数#data8 和 16 位立即数#data16。 由于立即数是一个常数,不是物理空间,所以立即数只能作为源操作
数,不能作为目的操作数使用。
 
例如:MOV A,#67H
 
该指令是数据传送指令,此指令功能为将立即数 67H 送入累加器 A 中, 67H 为立即数。
 
指令执行过程如图所示:
 
微信图片_20201120165906
 

4.直接寻址

寻址空间:
内部 RAM 的低 128 字节;
特殊功能寄存器 SFR (直接寻址是访问 SFR 的唯一方式)。
 
直接寻址是指操作码后面一个字节是实际操作数地址。
 
例如:MOV A,80H ;
 
该指令是数据传送指令,80H 是内部 RAM 地址,功能是把 80H 单元的内容 12H 送入累加器 A 中。
 
指令执行过程如图所示。
 
微信图片_20201120165926
 

5.基址寄存器+变址寄存器的间接寻址

寻址空间:
程序存储器( @A+DPTR , A+PC )。
 
基址寄存器 + 变址寄存器的间接寻址是 51 系列单片机指令系统所特有的一种寻址方式, 它以
DPTR 或 PC 作基址寄存器,A 作变址寄存器(存放 8 位无符号数),两者相加形成 16 位程序存储器地址
作操作数地址。
 
这种寻址方式是单字节的,用于读出程序存储器中数据表格的常数。
 
例如:MOVC A,@A+DPTR;
 
该指令的功能是 从程序存储器某地址单元中取一个字节数据送入累加器 A 中 。假设累加器 A 的内容
为 30H , DPTR 的内容为 2100H ,执行该指令时, 把程序存储器中地址为 2100H+30H=2130H 的单元中的
数据送入累加器 A 中。
 
该指令的执行过程如图所示。
 
微信图片_20201120165946
 

6.相对寻址

寻址空间:
程序存储器。
 
相对寻址用于程序控制,利用指令修正 PC 指针的方式实现转移。 即以程序计数器 PC 的内容为基
址,加上指令中给出的偏移量 rel,所得结果为转移目标地址。
 
其中,偏移量 rel 是 8 位符号补码数,范围为 -128 ~ +127 。故可知,转移范围应当在前面 PC 的-128 ~
+127 之间的某一程序存储器地址中。相对寻址一般为双字节或三字节。
 
例如:JC 70H
 
若此指令所在地址为 2000H 且 CY=1 ,由于指令本身占用 2 个单元,所以,取出此指令后 PC 内容
为 2000H+2=2002H,程序将转移到 2002H+70H=2072H 的单元去执行
 
该指令的执行过程如图 所示:
 
微信图片_20201120170008
 

7.位寻址

寻址空间:
片内 RAM 的 20H ~ 2FH ;
SFR 中有定义的能被 8 整除的字节地址。
 
位寻址是指以访问位的方式对内部 RAM ,特殊功能寄存器 SFR 中位地址空间进行访问。
 
例如:MOV C,06H
该指令的功能是将位地址为 06H 的位单元的内容送入位累加器 C 中。
 

四.指令系统

1.数据传送指令

 
数据传送指令的助记符为 MOV ,其汇编语言指令格式为:
MOV [目的操作数],[源操作数];
 
指令功能是将源操作数的内容传送到目的操作数中,源操作数的内容不变。 这类指令不影响标志位。
 

1.1内部八位数据传送指令

内部 8 位数据传送指令共有 15 条,用于单片机内部的数据存储器和寄存器之间的数据传送。所采用
的寻址有 立即寻址、直接寻址、寄存器寻址和寄存器间接寻址。
 
其数据传输的形式如图:
 
微信图片_20201120170036
 
(1)以累加器 A 为目的指令
 
微信图片_20201120170059
 
这组指令的功能: 把源操作数的内容送入累加器 A 中。 源操作数有寄存器寻址、直接寻址、寄存
器间接寻址和立即寻址等寻址方式。其中 rrr 为寄存器编码
 
(2)以 Rn 为目的操作数的指令
 
微信图片_20201120170119
 
这组指令的功能: 把源操作数的内容送入当前工作寄存器区的 R0~R7 中的某一个寄存器 。源操作
数有寄存器寻址、直接寻址和立即寻址等。
 
(3)以直接地址为目的操作数的操作指令
 
微信图片_20201120170141
 
这组指令的功能: 把源操作数的内容送入直接地址所指的存储单元 。源操作数有寄存器寻址、直接
寻址、寄存器间接寻址和立即寻址方式。
 
(4)以寄存器间接寻址的单元为目的的操作数指令
这组指令的功能: 把源操作数的内容送入 R0 或 R1 所指的内部 RAM 存储单元中 。 源操作数有寄存
器寻址、直接寻址和立即寻址 方式。
 

举例分析:

 
1.设内部 RAM 中 30H 单元的内容 50H,试分析执行下面程序后各有关单元的内容。
 
MOV 60H ,# 30H ; 立即数 30H 送 60H 单元,即(60H)=30H
MOV R0 ,# 60H ;   立即数 60H 送入 R0,即(R0)=60H
MOV A , @R0 ;       间接寻址, 将(R0)=60H 的单元内容 送入 A,即(A)=30H
MOV R1 , A ;           将 A 中的内容送入 R1,即(R1)=30H
MOV 40H , @R1 ;   间接寻址, 将(R1)=30H 中的内容 送入 40H 单元,即(40H)=50H
MOV 60H , 30H ;    30H 单元的内容送入 60H,即(60H)=50H
 
程序执行结果是( A ) =30H ,( R0 ) =60H ,( R1 ) =30H ,( 60H ) =50H ,( 40H )=50H ,( 30H ) =50H
 
内容未变。
 
2.将累加器 A 中的内容送入外部数据存储器的 60H 单元。
 
MOV R0 ,# 60H ; 设置地址指针寄存器
MOVX @R0 , A ; (R0)←A,A 中内容送外部数据存储器的 60H 单元
 
(5)16 位数据传送指令
 
微信图片_20201120170231
 
这条指令的功能: 把 16 位常数送入 DPTR 中。16 位的数据指针 DPTR 由 DPH 和 DPL 组成,这条
指令的执行结果是把高位立即数送入 DPH,低位立即数送入 DPL 中 。
 
(6)栈操作指令
 
在 内部 RAM 中设有一个 先进后出 的堆栈,在特殊功能寄存器中有一个 堆栈指针 SP,它
指出栈顶位置 ,在指令系统中有两条用于数据传送的栈操作指令:
 
微信图片_20201120170301
 
进栈指令 PUSH 的功能: 先将 SP 的指针加 1,然后把直接地址指出的内容传送到栈指针 SP 寻址的
内部 RAM 单元中。
 
出栈指令 POP 的功能: 将栈指针 SP 寻址的内部 RAM 单元的内容送入直接地址所指的字节单元中
去,同时栈指针减 1。
 

举例分析:

进入中断服务程序后,( SP ) =30H ,( DPTR ) =5544H 。下列指令
PUSH DPL ; 将 DPL 压入堆栈,指令代码 C082H
PUSH DPH ; 将 DPH 压入堆栈,指令代码 C083H
 
执行结果 将把 44H 和 55H 两个 8 位数据分别压入片内 RAM 的 31H 和 32H 两个地址单元,SP 的内
容两次增 1 后将变成 32H ,如图:
 
微信图片_20201120170325
 
特殊说明:
 
堆栈操作压栈与出栈相反,压栈时先进行指针操作,后进行数据操作,出栈时先进行数据操作,
后进行指针操作;
 
上电复位后(SP)=07H,由于入栈操作是先指针上移,后压入数据,所以堆栈空间并未占用 0 区
的 R7 寄存器;
 
一般来说,如果应用系统要使用 1-3 寄存器区,在主程序开始执行初期,应将 SP 移至内部数据
存储器的高端。
 
一般情况下,除上电初始化外,不易轻易修改 SP 。
 
(7)字节交换指令
 
微信图片_20201120170352
 
这组指令的功能: 将累加器 A 中的内容和源操作数的内容互相交换。 源操作数有寄存器寻址、直接
寻址、寄存器间接寻址方式
 

举例分析:

设(A)=0ABH,(R1)=12H,执行指令 XCH A,R1;则结果为(A)=12H,(R1)=0ABH
(8)累加器 A 的半字节交换指令
 
微信图片_20201120170419
 
这条指令: 将累加器 A 的高 4 位和低 4 位互换 ,不影响标志位。
 

举例分析:

 
【例】 设( A ) =0ABH , 执行指令 SWAP A 后,(A)=0BAH。
 
(9)半字节交换指令
 
微信图片_20201120170446
 
这条指令的功能: 将累加器 A 的低 4 位和 R0 或 R1 的低 4 位进行交换,各自的高 4 位不变
 

举例分析:

 
设( A ) =12H ,( R0 ) =30H ,( 30H ) =45H 执行指令 XCHD A , @R0 后( A ) =35H,( 30H )
=42H
 
交换类指令的传送形式如图:
 
微信图片_20201120170517
 
(10)累加器 A 与外部数据存储器的传送指令
 
微信图片_20201120170545
 
这组指令:累加器 A 和外部扩展的 RAM 或 I/O 口的数据传送指令。 由于外部 RAM 或 I/O 口是统一
编址的,共占外部数据的 64KB 空间,所以指令本身看不出是对 RAM 还是对 I/O 口的操作,这是由硬件
的地址分配而定。
 

举例分析:

 
将外部数据存储器的 2000H 单元的内容传送到内部 RAM 的 60H 单元。
 
MOV DPTR ,# 2000H ; 将外部数据指针 DPTR 指向 2000H
MOVX A , @DPTR ;      从外部将数据送到 A
MOV 60H , A ;               再将数据送到 60H
 
(11)查表指令
 
微信图片_20201120170625
 
查表指令的源字节单元都采用变址寻址方式 ,第一条指令的基址寄存器为 DPTR ,因此其寻址范
围为整个程序存储器的 64K 空间,表格可以放在程序存储器的任何位置。第二条指令的基址寄存器为PC ,
该指令中访问程序存储器的地址( A ) + ( PC ),其中 (PC)为程序计数器的当前内容,即查表指令的地
址加 1 。
 
因此,当基址寄存器为 PC 时,查表范围实际为查表指令后 256 个字节的地址空间
 

举例分析:

 
1232H : MOV A ,# 30H
1234H : MOVC A , @A+PC
1235H : MOV 60H , A
1265H : 3FH
 
当执行查表指令时,PC 的当前值为 1235H,所以,查表指令访问的程序存储器单元的地址为:
(A)+(PC)=30H+1235H=1265H
 
执行查表指令后(A)= 3FH。
 
已知累加器 A 中有一个 0~9 范围内的数,试用以上查表指令编出能查找出该数的平方值
的程序.
 
为了进行查表,必须确定一张 0 ~ 9 的平方值表。若该平方表始址为 1000H ,则相应的平方值表
如表 所示:
 
微信图片_20201120170701
 
累加器 A 中的数恰好等该数平方值对表始地址的偏移量。 例如: 5 的平方值为 25 , 25 的
地址为 1005H ,它对 1000H 的地址偏移量也为 5 。因此,查表时作为基址寄存器用的 DPTR 或 PC的当
前值必须是 1000H 。采用 DPTR 作为基址寄存器的查表程序比较简单,也容易理解,只要预先使用一条
16 位数传送指令,把表的始址 1000H 送入 DPTR ,然后进行了查表就行了,相应程序为:
 
MOV DPTR ,# 1000H ; 设置 DPTR 为表始址
MOVC A , @A+DPTR ; 将 A 的平方值查表后送 A
 

数据传送指令总表

 
此表为数据传送指令总表,包含了指令的助记符、功能说明、字节数和振荡器周期数。
 
微信图片_20201120170737
 
微信图片_20201120170801