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 寻址方式

  1. 立即寻址
    指令中有一个操作数为常数,能直接参与操作称为“立即数”
    在指令中,带#表示立即数,不带的表示位置
  2. 直接寻址
    指令中直接给出操作数的地址()表示取地址中的数据
  3. 寄存器寻址
    指令当中的操作数在特殊寄存器,或工作寄存器中
  4. 寄存器间接寻址
    指令中的操作数的地址在寄存器中,寄存器前要加@符号
    可以作为间址寄存器的只有R0、R1、DPTR(16位的,对外扩展存贮器,只能用这玩意)(堆栈操作除外,SP)
    e·g:MOV A,@R0
  5. 变址寻址
    以16位寄存器PC或DPTR为基址寄存器,A为变址寄存器,将两者之和作为操作数的地址,(三条指令,都是ROM的地址)
    MOVC A,@A+PC;
    MOVC A,@A+DPTR;
    JMP @A+DPTR
  6. 相对寻址
    针对PC,在PC上的基础上给出额外的偏移量,用于短转移指令和条件转移指令。
    JC 03H
  7. 位寻址
    直接按位寻址,例如acc.7

3.3 数据传送指令

  1. 内部数据传送指令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位
  2. 查表指令MOVC(针对程序存储器ROM)
    MOVC<目的操作>,<源操作数>;MOV CODE
    • MOVC A,@A+PC;变址寻址
    • MOVC A,@A+DPTR;变址寻址
  3. 片外数据传送MOVX(片外RAM只能通过间接寻址)
    MOVX<目的操作数><源操作数>;
    • MOVX A,@DPTR;16位,数据8位(外面到里面)
    • MOVX @DPTR,A;片外寻址范围64KB(里面到外面)
    • MOVX A,@Ri;
    • MOVX @Ri,A;
  4. 堆栈操作数
    堆栈的工作原理:后入先出原则。实际的堆栈是一种逻辑运用
    有一个SP(stack point)的指针SFR中的8位寄存器,里面的地址指向栈顶,最后入堆栈的数据。复位上电后SP默认指向07H
    • MOV SP,#6FH;设置堆栈从70H开始区域最低地址减一
    • PUSH direct;ACC是A的地址;
    • POP direct;
  5. 数据交换指令
    • 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

  1. 不带进位的加法指令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码)
  2. 带进位的加法指令ADDC累加A与操作数以及CY相加
    • ADDC A,Rn;
    • ADDC A,direct;
    • ADDC A,@Ri;
    • ADDC A,#data;
      可以用来做多字节相加
  3. 自加1的指令INC(不影响标志位)
    • INC A;
    • INC Rn;
    • INC direct;
    • INC @Ri;
    • INC DPTR;有进位自己会处理
      数据首部是字母要加一个0表示是数不是变量
      单片机做的运算和有符号数无符号数无关,这是程序员来处理的
3.4.2 减法指令

SUBB DEC

  1. 带借位的减法 A与操作数相减,再减CY
    • SUBB A,Rn;
    • SUBB A,direct;
    • SUBB A,@Ri;
    • SUBB A,#data;
      bit7借位CY=1
      bit3有借位AC=1
      bit7bit6有且只有一位借位,OV=1
  2. 自减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;
  1. 异或
    • XRL A,Rn;
    • XRL A,direct;
    • XRL A,@Ri;
    • XRL A,#data;
    • XRL direct,A;
    • XRL direct,#data;
  2. 取反、清零
    • CPL A;取反
    • CLR A;清零
  3. 循环移位指令
    • RL A;累加器A左移位,乘2
    • RR A;累加器A右移位,除以2
    • RLC A;累加A带进位左移位,借助多字节的整体左移位
    • RRC A;累加A带进位右移位

3.6 控制转移指令

该类指令控制PC

  1. 无条件转移指令
    • 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
  2. 条件转移
    • JN rel;A=0
    • JNZ rel;A!=0
    • CJNE A,direct,rel;jump if not equal,操作数1>=操作数2 CY=0,反之CY=1
    • CJNE A,#data,rel
    • CJNE Rn,#data,rel
    • CJNE @Ri,#data,rel
    • DJNZ Rn,rel;不影响标志位
    • DJNZ direct,rel
  3. 间接转移指令
    • JMP @A+DPTR
  4. 子程序调用及返回指令
    • LCALL addr16;PC=PC+3 PC所指的16位地址入栈 同时堆栈指针SP=SP+2
    • ACALL addr11;
    • RET;子程序返回指令。用于子程序的末尾
    • RETI;中断服务子程序返回指令,中断不是设定的,是事件触发,外部0,1,timer0,1,串口通信 5个中断地址0000H,0003H,000BH,00013H,001BH,0023H
  5. 空操作指令
    • NOP;消耗一个周期

3.7 位操作指令

包括位传送、位逻辑运算、位控制
位地址的表达防方式

  1. 直接使用位地址,范围00H~FFH 前128个在20H~2FH,高128在SFR
  2. 字节***.*位序号可访问,如PSW。5、P0.7 20H.7,acc.7

位操作指令

  1. 位数据传送
    • MOV C,bit;C是CY,有点像A
    • MOV bit,C;把c移入bit
  2. 位修改指令
    • CLR C 设置CY=0
    • CLR bit
    • SETB C设置为1
    • SETB bit
    • CPL C取反操作
    • CPL bit
  3. 位的逻辑运算指令
    • ANL C,bit
    • ANL C,/bit
    • ORL C,bit
    • ORL C,/bit
  4. 位转移指令
    • JC rel;C=1转到rel
    • JNC rel;C=0转
    • JB bit,rel;bit=1转到rel
    • JNB bit rel;bit=0转到
    • JBC bit,rel;

3.8 伪指令

  • ORG 改变程序存放位置
  • END 后的程序之后就不会被编译了
  • EQU 赋值伪指令 X1 EQU 50H;把50H命名为X1
  • DB 定义字节
  • DW 定义字,两个字节16位,低地址存放高字节,高地址存饭低字节
  • BIT 位地址赋值 L0 BIT 10H表示10H位地址命名为L0
  • DATA
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wxyice

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值