51单片机笔记(二)
51单片机指令系统
3.1 指令系统基础
机器语言-汇编-高级语言
全部指令的集合叫指令系统
80C51有111条指令,还有8条伪指令
指令分类:
- 字节数分类
- 单字节49 双字节46 三字节16
- 运算数度分类
-单周期64 双45 四周期2 - 功能
- 数据传输 29
- 算数运算 24
- 逻辑运算 24
- 控制转移 17
- 布尔操作 17
3.1.1 指令格式
标号:操作码 <>,<>,<>;
操作数之间要有逗号
操作码:指令
标号是一个地址,指向程序的
3.1.2 通用符号
Rn 当前寄存器中的8个工作寄存器
Ri (i=0,1)可用作地址指针的2个
#data 包含在指令中的8位常数,无#是地址
#data16 16位常数
direct RAM中的地址
addr16 16位的目的地址,用于LCALL和LJMP中
rel 相对地址,也指标号
bit 位寻址的地址
@ 间接寻址方式中用于表示间址寄存器
3.2 寻址方式
- 立即寻址
指令中有一个操作数为常数,能直接参与操作称为“立即数”
在指令中,带#表示立即数,不带的表示位置 - 直接寻址
指令中直接给出操作数的地址()表示取地址中的数据 - 寄存器寻址
指令当中的操作数在特殊寄存器,或工作寄存器中 - 寄存器间接寻址
指令中的操作数的地址在寄存器中,寄存器前要加@符号
可以作为间址寄存器的只有R0、R1、DPTR(16位的,对外扩展存贮器,只能用这玩意)(堆栈操作除外,SP)
e·g:MOV A,@R0
- 变址寻址
以16位寄存器PC或DPTR为基址寄存器,A为变址寄存器,将两者之和作为操作数的地址,(三条指令,都是ROM的地址)
MOVC A,@A+PC;
MOVC A,@A+DPTR;
JMP @A+DPTR
- 相对寻址
针对PC,在PC上的基础上给出额外的偏移量,用于短转移指令和条件转移指令。
JC 03H
- 位寻址
直接按位寻址,例如acc.7
3.3 数据传送指令
- 内部数据传送指令MOV
MOV<目的操作数>,<源操作数>- 以累加器A为目的的操作数的数据传送指令
MOV A,#data;
MOV A,Direct;
寄存器地址或者I/O口的MOV A,Rn;
MOV A,@Ri;
- 以寄存器Rn为目的操作室的数据传送指令
- 不可以MOV Rn,Rn;
- 其余和A寄存器指令类似
- 以RAM或端口直接地址为目的操作数的数据传送指令
MOV direct,A;
MOV direct,Rn;
MOV direct,#data;
MOV direct1,direct2;
这句很特殊,机器码是先放direct2(机器码是逆序)MOV direct,@Ri;
- 以间接地址为目的操作数的数据传输指令
MOV @Ri,A;
MOV @Ri,direct;
MOV @Ri,#data;
- 16位数据传输指令
MOV DPTR,#data16;
是一个片内操作,唯一一条16位
- 以累加器A为目的的操作数的数据传送指令
- 查表指令MOVC(针对程序存储器ROM)
MOVC<目的操作>,<源操作数>;MOV CODEMOVC A,@A+PC;
变址寻址MOVC A,@A+DPTR;
变址寻址
- 片外数据传送MOVX(片外RAM只能通过间接寻址)
MOVX<目的操作数><源操作数>;MOVX A,@DPTR;
16位,数据8位(外面到里面)MOVX @DPTR,A;
片外寻址范围64KB(里面到外面)MOVX A,@Ri;
MOVX @Ri,A;
- 堆栈操作数
堆栈的工作原理:后入先出原则。实际的堆栈是一种逻辑运用
有一个SP(stack point)的指针SFR中的8位寄存器,里面的地址指向栈顶,最后入堆栈的数据。复位上电后SP默认指向07HMOV SP,#6FH;
设置堆栈从70H开始区域最低地址减一PUSH direct;
ACC是A的地址;POP direct;
- 数据交换指令
XCH A,Rn;
XCH A,direct;
XCH A,@Ri;
XCHD A,@Ri;
换低四位SWAP A;
A的低高4位互换
3.4 算数运算指令
这类指令主要是对8位数进行加减乘除,除了加一减一指令,运算结果将影响PSW的标志位CY,AC,OV
3.4.1 加法指令
ADD,ADDC,INC
- 不带进位的加法指令ADD,累加器A与操作数相加,相加结果只能放在累加器A中
ADD A,RN;
ADD A,direct;
ADD A,@Ri;
ADD A,#data;
注意:有符号数加数或被加数为负数时,需要放置该负数的补码;结果为负数时,A中为该负数的结果的补码
8位无符号数(0~255),8位有符号数(-128~+127)(因为10000001是-127的补码,所约定10000000是-128,00000000是0,状态一直都是256的状态)
/无符号数用CY=1表示和溢出(把CY看成第九位)
\有符号数用OV=1表示和溢出
/若bit7和bit6有且仅有一位进位,OV=1,否则OV=0
\若bit3有进位,AC=1,反正AC=0(压缩BCD码)
- 带进位的加法指令ADDC累加A与操作数以及CY相加
ADDC A,Rn;
ADDC A,direct;
ADDC A,@Ri;
ADDC A,#data;
可以用来做多字节相加
- 自加1的指令INC(不影响标志位)
INC A;
INC Rn;
INC direct;
INC @Ri;
INC DPTR;
有进位自己会处理
数据首部是字母要加一个0表示是数不是变量
单片机做的运算和有符号数无符号数无关,这是程序员来处理的
3.4.2 减法指令
SUBB DEC
- 带借位的减法 A与操作数相减,再减CY
SUBB A,Rn;
SUBB A,direct;
SUBB A,@Ri;
SUBB A,#data;
bit7借位CY=1
bit3有借位AC=1
bit7bit6有且只有一位借位,OV=1
- 自减1指令DEC不影响标志位
DEC A;
DEC Rn;
DEC direct;
DEC @Rn;
3.4.3 乘法
MUL AB;
A<-AxB低八位,B<-AxB高八位
只对于累加器A和B寄存器的无符号数
运算结果两个字节,低位放在A中,高位存在B中
运算结果大于00FFH,OV=1,否则OV=0。CY一定被清零,不影响AC
只占一个字节,速度是4个机器周期
3.4.4 除法
DIV AB;
A/B,A中是商,B中是余数
B=0 OV=1,否则OV等于0,CY一定被清零,不影响AC
3.4.5 十进制调整指令
DA A;
若A的低四位>9或AC=1,则A+06H
若A的高四位>9或CY=1,则A+60H
只用于压缩BCD码加法运算后的调整
指令用在ADD和ADDC后不影响标志位,
不可以在SUBB后用
3.5 逻辑操作指令
与、或、异或、清除、移位、取反,操作不影响标志位
- 与
ANL A,Rn;
ANL A,direct;
ANL A,@Ri;
ANL A,#data;
ANL direct,A;
ANL direct,#data;
- 或
ORL A,Rn;
ORL A,direct;
ORL A,@Ri;
ORL A,#data;
ORL direct,A;
ORL direct,#data;
- 异或
XRL A,Rn;
XRL A,direct;
XRL A,@Ri;
XRL A,#data;
XRL direct,A;
XRL direct,#data;
- 取反、清零
CPL A;
取反CLR A;
清零
- 循环移位指令
RL A;
累加器A左移位,乘2RR A;
累加器A右移位,除以2RLC A;
累加A带进位左移位,借助多字节的整体左移位RRC A;
累加A带进位右移位
3.6 控制转移指令
该类指令控制PC
- 无条件转移指令
LJMP addr16;
长转移 PC指向addr16 实现64K范围内程序转移AJMP addr11;
绝对转移,双字节指令,指令取出后PC+2,之后PC高5位不变,低11位被addr11覆盖(2K范围,基于AJMP执行后的PC+2)SJMP rel;
相对转移,双字节,相对于指令执行之前的PC,执行后PC=PC+2+rel。rel是有符号数,范围-128+~128
- 条件转移
JN rel;
A=0JNZ rel;
A!=0CJNE A,direct,rel;
jump if not equal,操作数1>=操作数2 CY=0,反之CY=1CJNE A,#data,rel
CJNE Rn,#data,rel
CJNE @Ri,#data,rel
DJNZ Rn,rel;
不影响标志位DJNZ direct,rel
- 间接转移指令
JMP @A+DPTR
- 子程序调用及返回指令
LCALL addr16;
PC=PC+3 PC所指的16位地址入栈 同时堆栈指针SP=SP+2ACALL addr11;
RET;
子程序返回指令。用于子程序的末尾RETI;
中断服务子程序返回指令,中断不是设定的,是事件触发,外部0,1,timer0,1,串口通信 5个中断地址0000H,0003H,000BH,00013H,001BH,0023H
- 空操作指令
NOP;
消耗一个周期
3.7 位操作指令
包括位传送、位逻辑运算、位控制
位地址的表达防方式
- 直接使用位地址,范围00H~FFH 前128个在20H~2FH,高128在SFR
- 字节***.*位序号可访问,如PSW。5、P0.7 20H.7,acc.7
位操作指令
- 位数据传送
MOV C,bit;
C是CY,有点像AMOV bit,C;
把c移入bit
- 位修改指令
CLR C
设置CY=0CLR bit
SETB C
设置为1SETB bit
CPL C
取反操作CPL bit
- 位的逻辑运算指令
ANL C,bit
ANL C,/bit
ORL C,bit
ORL C,/bit
- 位转移指令
JC rel;
C=1转到relJNC rel;
C=0转JB bit,rel;
bit=1转到relJNB bit rel;
bit=0转到JBC bit,rel;
3.8 伪指令
ORG
改变程序存放位置END
后的程序之后就不会被编译了EQU
赋值伪指令X1 EQU 50H;
把50H命名为X1DB
定义字节DW
定义字,两个字节16位,低地址存放高字节,高地址存饭低字节BIT
位地址赋值L0 BIT 10H
表示10H位地址命名为L0DATA