80c51笔记
80C51单片机的指令系统
具有255种操作码(00H~FFH)除A5H外的集合
只需数机42种助记符,代表33种功能
指令功能助记符与操作数各种寻址方式结合,构造出111中指令
80C51系统
寻址方式
- 立即寻址
- 直接寻址
- 寄存器寻址
- 寄存器间接寻址
- 相对寻址
- 变址寻址
- 位寻址
-
立即寻址
直接给出操作数,出现的操作数称为立即数
立即数前必须加上#MOV DPTR, #1234H -
直接寻址
在指令中直接给出操作单元地址
MOV A, 3AH① 只能给出8位地址
② 寻址范围只限于片内数据存储器
③ 低128单元,在指令中直接以单元地址形式给出
④ 特殊功能寄存器,这使除单元地址形式给出外,还可以寄存器符号形式给出 -
寄存器寻址
指在指令中将指定寄存器的内容作为操作数
寻址范围
① 4个寄存器组共32个通用寄存器,单在指令中只能使用当前寄存器组
② 在使用前要通过指定PSW中指定的RS1、RS0,以选择使用的当前寄存器组
③ 部分特殊功能寄存器 -
寄存器间接寻址
指在指令中给出的寄存器内容是操作数的地址,从该地址中取出的为操作数
在寄存器间接寻址中,应在寄存器的名称前加@寻址范围
① 片内数据存储器的低128字节单位,只能采用R0/R1间址寄存器,形式为@Ri
② 片外数据存储器的64KB单元,使用DPTR作为间址寄存器,形式为@DPTR
③ 片外数据存储器低256字节单元,除可使用DPTR作为间址寄存器外,也可使用R0、R1作为间址寄存器
④ 堆栈区,堆栈操作指令(PUSH和POP也算作间址寻址) -
相对寻址
在指令中给出的操作数为程序转移的偏移量
相对寻址为实现程序相对转移而设定的,为相对转移指令采用
给出的偏移量用 rel 表示,把PC的当前值加上偏移量得到程序的相对转移的目的地址目的地址 = 转移指令所在的地址 + 转移指令字节数 + rel
rel为一个带符号的8位二进制补码数,表示范围-128B ~ +127B
-
变址寻址(基址+变址)
一般用于查表操作
指以DPTR或PC作为基址寄存器,累加器A作为变址寄存器,二者内容相加MOVC A, @A+DPTR特点
① 只能对程序存储器进行寻址
② 变址寻址指令只有3条:MOVC A, @A+DPTR ; 程序存储器读指令 MOVC A, @A+PC ; 程序存储器读指令 JMP @A+DPTR ; 无条件转移指令③ 上面的3条指令都是单字节指令
④ 变址寻址方式用于查表操作 -
位寻址
位寻址区:
片内数据存储器中的单元地址20H ~ 2FH,共16个单元128位,为位寻址区,位地址是0H ~ 7FHMOVC C, 2BH可供位寻址的特殊功能寄存器共有11个,实有寻址位83位
位寻址只能使用C寄存器,不能使用其他寄存器,否则会报错
表示方法:
① 直接使用位地址表示方法
② 单元地址加位的表示方法88H单元的位5 => 88H.5
③ 特殊功能寄存器符号加位的表示方法PSW寄存器的位5 => PSW.5
⑤ 位名称表示方法,特殊功能寄存器中的一些寻址位是有名称的PSW的位5为F0标志位,使用F0表示该位
总结
| 寻址方式 | 寻址空间 |
|---|---|
| 寄存器寻址 | R0~R7、A、B、CY(bit)、DPTR |
| 直接寻址 | 内部数据存储器低128字节 特殊功能寄存器 |
| 寄存器间接寻址 | 内部数据存储器(@R0,@R1,@SP仅PUSH、POP) 外部数据存储器(@R0,@R1,@DPTR) |
| 立即寻址 | 程序存储器 |
| 变址寻址 | 程序存储器(@A+PC,@A+DPTR) |
| 相对寻址 | 程序存储器(PC+位移量) |
| 位寻址 | 内部数据存储器中有128个可寻址位 特殊功能寄存器中可位寻址的位 |
指令格式
-
通常由操作码和操作数两部分组成
- 操作码用来规定指令完成的操作
- 操作数表示操作的对象
① 单字节指令
只有一个字节,操作码和操作数在同一个字节中
共有49条单字节指令
② 双字节指令
双字节指令包括两个字节,一个字节为操作码,另一个为操作符
共有45条双字节指令
③ 三字节指令
在三字节指令中,操作数(既可能是数据又可能是地址)占2个字节,操作码占1个字节
共有17条指令 -
指令分类
共111条指令
- 数据传送类(28)
- 算数运算类(24)
- 逻辑运算类(25)
- 控制转移类(17)
- 布尔(位)操作类(17)
-
符号说明
| 符号 | 含义 |
|---|---|
| Rn | n=07,表示当前寄存器组的8个通用寄存器R0R7中的一个 |
| Ri | i=0、1,可用作间址寻址的寄存器,只能是R0,R1中的一个 |
| Direct | 内部的8位地址,既可指片内数据存储器的低128个单元地址,也可指SFR的地址或符号名称,direct表示直接寻址方式 |
| #data | 指令中的8位立即数 |
| #data16 | 指令中的16位立即数 |
| addr16 | 16位目的地址,只限于LCALL和LJMP中使用 |
| addr11 | 11位目的地址,只限于ACALL和AJMP指令使用 |
| rel | 相对转移指令中的偏移量,为8位带符号数,为SJMP和所有条件转移指令所使用 |
| DPTR | 数据指针 |
| bit | 片内数据存储器中的直接寻址位 |
| A | 累加器 |
| B | B寄存器 |
| C | 进位标志位 |
| / | 位地址的前缀标志,表示对该位操作数取反 |
数据传送类指令
- 内部8位数据传送指令
- 16位数据传送指令(专用于设定地址指针)
- 程序存储器传送指令
- 交换指令
- 堆栈操作指令
特点
① 不影响标志位C、AC、OV,只有一种堆栈操作指令可以直接修改程序状态字(PSW)
② 可以进行直接地址到直接地址的数据传送,能把一个并行I/O口中的内容传送到片内数据存储器
③ 用R0,R1间址访问片外数据存储器256字节地址及片内数据存储器中的任一单元,用DPTR访问片外全部64KB的数据存储器或I/O
④ A能够对Rn寄存器寻址
⑤ 能用变址寻址访问程序存储器中的表格
-
内部8位数据传送指令
主要用于内部数据存储器和寄存器之间的数据传送
MOV <目的字节>, <源字节>操作属于拷贝属性
① 以累加器A为目的操作数的指令组
指令 目的操作数 源操作数 功能 寻址范围 MOV A Rn A <- Rn R0~R7 MOV A direct A <- direct 00~FFH MOV A @Ri A <- Ri 00~FFH MOV A #data A <- #data #00~#FFH ② 以寄存器Rn为目的操作数的指令数
指令 目的操作数 源操作数 功能 MOV Rn A Rn <- A MOV Rn direct Rn <- direct MOV Rn #data Rn <- data ③ 以直接地址direct为目的操作数的指令组
指令 目的操作数 源操作数 功能 MOV direct A direct <- A MOV direct Rn direct <- Rn MOV direct direct direct <- direct MOV direct @Ri direct <- Ri MOV direct #data dierct <- data ⑤ 以间接寻址寄存器Ri为目的操作数的指令组
指令 目的操作数 源操作数 MOV @Ri A MOV @Ri direct MOV @Ri #data -
16位数据传送指令
MOV DPTR, #data16 ; DPTR <- data16数据的高8位送入DPH寄存器,数据低8位送入DPL寄存器
-
外部数据传送指令
① 采用间址寻址方式访问外部数据存储器,有Ri和DPTR两种间接寻址方式
② 采用R0或R1作为间址寄存器时,可寻址256个外部数据存储器单元,8位地址和数据均由P0口分时输入和输出
③ 采用16位DPTR作间址可寻址整个64KB片外数据存储空间,低8位(DPL)由P0口进行分时使用,高8位(DPH)由P2口输出-
外部数据存储器或I/O内容送累加器A(读)
MOVX A, @Ri MOVX A, @DPTR在P3.7引脚上输出\(\overline{RD}\)有效信号,可作为外部数据存储器或I/O的读选通信号
-
累加器A内容送外部数据存储器或I/O(写)
MOVX @Ri, A MOVX @DPTR, A在P3.6引脚上输出\(\overline{WR}\)有效信号,可作为外部数据存储器或I/O的写选通信号
-
-
程序存储器数据传送指令(查表指令)
MOVC A, @A+PC MOVC A, @A+DPTR均从程序存储器中读取数据(如表格、常数等)
累加器A为变址寄存器,而PC、DPTR为基址寄存器
DPTR为基址寄存器时为远程查表, PC为基址寄存器时为近程查表 -
数据交换指令
-
字节交换指令XCH组
XCH A, Rn XCH A, direct XCH A, @Ri将累加器A与源操作数的字节内容互换
-
半字节交换指令组
XCH A, @Ri将Ri间址寻址单元的低4位内容与累加器A的低4位内容互换,高4位不变,不影响标志位
SWAP A将累加器A的高、低半字节交换,也可看做4位循环指令
-
-
堆栈操作指令
PUSH direct POP direct
算术运算类指令
-
加法指令
ADD A, Rn ; A + Rn -> A ADD A, direct ; A + direct -> A ADD A, @Ri ; A + Ri -> A ADD A, #data ; A + data -> A影响AC、CY、OV、P
① 当和的第3位有进位时,AC标志位置位,否则为0
② 当和的第7位有进位时,CY标志位置位,否则为0 -
带进位加法指令
ADDC A, Rn ; A <- A + Rn + CY ADDC A, direct ; A <- A + direct + CY ADDC A, @Ri ; A <- A + Ri + CY ADDC A, #data ; A <- A + data + CY影响AC、CY、OV、P
① 和的第3位有进位时,AC将置位
② 和的第7位有进位时,CY将置位,表示和溢出 -
加1指令
INC Rn INC direct INC @Ri INC A INC DPTR不影响标志位
-
二-十进制调整指令
DA A修正方法:
① 当累加器低4位大于9或半进位标志AC=1时,进行低4加6修正
\(A_{0~3}\) + 6 -> \(A_{0~3}\)
即 A = A + 06H② 当累加器高4位大于9或进位标志CY=1时,进行低4位加6修正
\(A_{4~7}\) + 6 -> \(A_{4~7}\)
即 A = A + 60H -
带借位减法指令
SUBB A, Rn SUBB A, direct SUBB A, @Ri SUBB A, #data若第7位有借位则CY置1;若第3位有借位,则AC置1
若第7位和第5位中有1位需借位而另一位不借位,则OV置1 -
减1指令
DEC Rn DEC direct DEC @Ri DEC A不影响各个标志位
注意
执行对并行I/O口的输出内容减1操作,是将该口输出锁存器的内容读出并减1,再写入锁存器 -
减法/除法指令
-
乘法指令
MUL AB将A和B中两个无符号数8位二进制相乘,所得16积的低8位存在A中,高8位存在B中
若乘积大于255,即高位B不为0,OV置位;CY总是清0 -
除法指令
DIV AB将A中无符号8位二进制数除以B中的无符号8位二进制数,所得商的二进制部分存在A中,余数存在B中,并将CY和OV置0
-
逻辑运算类指令
包括:与、或、异或、清除、求反、移位等操作
助记符有ANL、ORL、XRL、RL、RLC、RR、RRC、CPL、CLR等
只按位进行逻辑运算,结果不影响PSW中标志位
-
逻辑与运算
ANL A,Rn/direct/@Ri/#data
将目的地址单元中的数和源地址单元中的数按位相与
作用:用作清除或屏蔽某些位
-
逻辑或运算
ORL A,Rn/direct/@Ri/#data
将目的地址单元中的数和源地址单元中的数按位相或
作用:给某些位强迫置1,合并两个数中的1
-
逻辑异或运算
XOR A,Rn/direct/@Ri/#data
作用:对目的操作数的某些位取反,也可用于判单两个数是否相等,若相等则结果为0
-
累加器移位/循环指令
(1) 循环右移指令RR A将累加器的内容逐位循环右移一位,并将A0的内容移到A7,不影响标志位
(2) 带进位循环右移指令RRC A将累加器的内容和进位一起循环右移一位,并且A0移入进位位CY,CY的内容移到A7,不影响CY之外的标志位
(3) 循环左移指令RL A将累加器的内容逐位循环左移一位,并且A7的内容移到A0
(4) 带进位循环左移指令RLC A将累加器的内容和进位位一起循环左移一位,并且A7移入进位位CY,CY的内容移到A0,不影响CY之外的标志位
(5) 累加器按位取反指令CPL A对进行累加器的内容逐位取反,结果仍存在A中,此操作不影响标志位
(6) 累加器清0指令CLR A对累加器进行清0,此操作不影响标志位
控制转移类指令
- 无条件转移指令
- 条件转移指令
- 循环转移指令
- 子程序调用和返回指令
- 空操作指令
采用的助记符有:AJMP、LJMP、SJMP、JZ、JNZ、CJNE、DJNZ、ACALL、LACALL、RET、RETI、NOP等
-
无条件转移指令
(1) 短转移指令SJMP rel其目标地址是由当前PC(程序计数器)值和指令的第二个字节提供的8位带符号的相对地址相加而成
有以下2种情况
① 根据偏移量计算转移的目的地址
② 根据目的地址计算偏移量
(2) 绝对转移指令AJMP addr11其目标地址由指向第一个字节的高位A10A8和指令第二个字节的A7A0组成
目标地址必须包含AJMP后第一条指令的字节在内的2KB范围内
(3) 长转移指令LJMP addr16半酣程序存储器整个64KB的空间
(4) 间接转移指令JMP @A+DPTRA中8位无符号数与DPTR内容相加
DPTR固定,A不同则可实现多分支转移 -
条件转移指令
JZ rel
A = 0,PC = PC+2+rel
A ≠ 0,PC = PC+2
JNZ rel
A = 0,PC = PC+2+rel
A ≠ 0,PC = PC+2
数值比较转移指令
(1) CJNZ A,direct,rel
(2) CJNZ A,#data,rel
(3) CJNZ Rn,#data,rel
(4) CJNZ @Ri,#data,rel -
循环转移指令
(1) DJNZ Rn,rel
(2) DJNZ direct,rel
先将Rn/direct相减,再判别其内容是否为0
为0,结束循环
不为0,转向目标地址,继续执行循环程序
子程序调用
-
ACALL addr11
无条件调用首地址为addr11的子程序,不影响标志位
过程
① 断点地址压栈,先PCL,后PCH,堆栈指针加2
② 将指令提供的11位目标地址送入PC10~PC0,所调用的子程序地址须与ACALL后指令第一个字节在同一个2KB区域内 -
长调用 LCALL addr16
过程
① 断点地址压栈
PC+3 -> 获F一条指令地址
将这16位的地址压栈后,SP <- SP+2
② 将指令第二个和第三个字节所提供的16位目标地址送PC15~PC0,程序转向子程序首地址开始执行 -
返回指令 RET
返回调用指令ACALL或LCALL的下一条指令 -
中断返回指令 RETI
① 清除内部响应的中断状态寄存器
② 中断服务程序须以RETI结束
③ CPU执行RETI指令后至少再执行一条指令,才能响应新的中断请求 -
空操作指令
不作任何操作,仅将程序计数器PC加1,使程序继续向下执行
布尔(位)操作类指令
① 以进位标志CY为位累加器,以内部数据存储器的20H至2FH单元及部分SFR为位存储器
② 以P0,P1,P2,P3为位I/O
只能使用C寄存器和bit位寄存器作为操作数
-
布尔(位)传送指令
MOV C,bit MOV bit,C -
布尔(位)状态控制指令
```assembly 清除 CLR C CLR bit 置1 SETB C SETB bit 取反 CPL C CPL bit ``` -
布尔(位)逻辑操作指令
1. 位逻辑与操作 ANL C,bit ANL C,/bit 2. 位逻辑或操作 ORL C,bit ORL C,/bit -
布尔(位)条件转移指令
1.布尔累加器条件转移指令 JC rel ; C=1时转移 JNC rel ; C=0时转移 操作不影响标志位 2. 位测试条件转移指令 JB bit,rel ;bit=1 JNB bit,rel ;bit=0 检测指定位,当位变量分别位1或0时,程序转向当前PC值(转移指令地址+3)与第二字节中带符号的相对地址(rel)之和的目标地址,否则程序往下顺序执行 操作不想影响标志位 3. 位测试条件转移并清0指令 JBC bit,rel 检测指定位,当位变量为1时,将该位清0,且程序转向当前PC值(转移指令地址+3)与第二字节中带符号的相对地址(rel)之和的目标地址,否则程序往下顺序执行 此操作不影响标志位

浙公网安备 33010602011771号