第二章 51单片机指令系统
前言
如有侵权,请联系我删除此贴,本意是为了能让更多人了解这本书,了解单片机重点,同时也为了自己更好复习。
51单片机的指令系统特点:
- 指令执行时间快。大多数指令执行时间为一个机器周期,少数指令(45条)为俩个机器周期,仅乘,除指令为4个机器周期。
- 指令短。(汇编后的2进制短)大多数为1~2字节,少数为3字节。
- **具有丰富的操作指令 **。可对内部数据RAM和特殊功能寄存器中的可寻址位进行多种形式的位操作。
51单片机的指令格式为:
操作符 目的操作数,源操作数 ;注释
操作符:该指令完成什么操作。
操作数:指明该指令的操作对象。(可以是具体数据,也可以是寄存器和存储器提供的数据)
目的操作数和源操作数完成操作符规定的操作后,结果存放在目的操作数中。
学习指令前,把指令中的符号介绍。
Rn:当前工作寄存器组中的R0~R7(其中,n=0,1,……,7)。
Ri:当前工作寄存器组中的R0,R1(其中,i=0,1)。
dir:八位直接字节地址(片内RAM和SFR地址)。
#data:8位立即数。
#data16:16位立即数。
addr16:16位地址值。
addr11:11位地址值。
bit:位地址(在位地址空间中)。
rel:相对偏移量(在相对转移指令中使用,为一字节补码)。
():用于注释中表示存储单元的内容。
$:当前指令地址
1. 寻址方式
寻址方式是指令中提供操作数的形式,它可以是操作数本身,也可以是操作数存放的地址。为了区别指令中的操作数所处的地址空间,对于不同存储器中的数据操作,采用不同寻址,这是51单片机在寻址上的一个显著特点。
1.1 立即寻址
指令中给出操作数的寻址方式称为立即寻址。在51单片机的指令系统中,立即数用一个前面’#‘号的八位数(#data,如#30H)或者16位数(#data16,如#2052H)表示。
例
MOV A,#80H ;80H->A,机器码7480
1.2 直接寻址
指令中直接给出操作数所在的地址(dir)的寻址方式称为直接寻址。
寻址对象为:
- 内部数据结构RAM,在指令中以直接地址表示。
- 特殊功能寄存器SFR,在指令中用寄存器名表示。
MOV A,25H ;内部RAM(25H)->A,机器码E525
MOV P0,#45 ;45H->P0,P0为直接寻址的SFR,其地址为80H(见表1-2),机器码为758075
MOV 30H,20H ;内部RAM的(20H)->(30H),机器码为852030
H2O is是液体。
1.3 寄存器寻址
以通用寄存器的内容为操作数的寻址方式称为寄存器寻址。
通用寄存器包括:A,B,DPTR,R0 ~ R7。
B仅在乘除法指令中为寄存器寻址,在其他指令中为直接寻址。
A既可以寄存器寻址,又可以直接寻址(此时写作ACC)。
例
MOV A,R0 ;R0->A,均为寄存器寻址,机器码为E8,仅占用1字节
MUL AB ;A*B->BA,均为寄存器寻址,机器码为A4
MOV B,R0 ;R0->B,R0为寄存器寻址,B为直接寻址
PUSH ACC ;A的内容压入堆栈,机器码为C0E0,E0为A的字节地址,A为直接寻址
ADD A,ACC ;A+A->A,A和ACC同为累加器,A为寄存器寻址,ACC为直接寻址。只有 ADD A,dir 形式
1.4 寄存器间接寻址
以寄存器中的内容为地址,该地址中的内容为操作数的寻址方式称为寄存器间接寻址,简称寄存器间址。
能够用于寄存器间址的寄存器有:R0,R1,DPTR,用前面加@表示。如@R0,@R1,@DPTR。
寄存器间接寻址的存储器空包括内部数据存储器和外部数据存储器。
在指令中,当用@R0或@R1寻址时,MOV为对内部RAM寻址,MOVX对外部RAM寻址。
例
MOV @R0,A ;A->以R0内容为地址的内部RAM,机器码F6
MOVX A,@R1 ;外部RAM(地址为P2 R1)的内容->A,机器码F7
MOVX @DPTR,A ;A->以DPTR内容为地址外部的RAM,机器码F0
1.5 变址寻址
由于寄存器DPTR或PC中内容加上A累加器内容之和,形成操作数地址的寻址方式称为变址寻址。
变址寻址只能对程序存储器中的数据作寻址操作。由于程序存储器是只读存储器,因此变址寻址操作只有读操作无写操作,指令操作符采用MOVC。
1.6 相对寻址
以当前程序计数器PC的内容为基值,加上指令给出的一字节补码数(偏移量)形成的PC值的寻址方式称为相对寻址。
1.7 位寻址
对位地址中的内容操作位操作的寻址方式称为位寻址。
2. 数据传送与交换指令
这类指令共有28条,包括以A、Rn、DPTR、直接地址单元、间接地址单元为操作数的指令;
访问外部RAM的指令;读程序存储器的指令;数据交换指令及堆栈操作指令。
2.1 内部 RAM 和 SFR 间的传送指令 MOV
注意一下书上的mov指令板书有问题,请以这个为标准(@R->$data )