前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >学习笔记 | 单片机指令系统

学习笔记 | 单片机指令系统

作者头像
悠风
发布2019-08-28 16:37:23
1K0
发布2019-08-28 16:37:23
举报

这几天有很多师弟问我有没有去年微机原理的考试资料,一年这么久了我也记不太清了,隐约记得当时有整理过一份单片机指令系统笔记……

插一首轻音乐,缓解一下学习的气氛


寻址方式

立即寻址

指令中直接给出操作数的寻址方式。

代码语言:javascript
复制
 MOV    A, #80H
 MOV    DPTR, #2000H

直接寻址

指令中直接给出操作数所在的地址(dir)的寻址方式。

  • RAM在指令中直接用地址表示。
  • SFR在指令中用寄存器名表示。
代码语言:javascript
复制
 MOV    A, 25H
 MOV    P0, #45H
 MOV    30H, 20H

寄存器寻址

以通用寄存器的内容为操作数的寻址方式。通用寄存器包括 A, B, DPTR, R0~R7, 其中 B 仅在乘除法指令中为寄存器寻址,在其他指令为直接寻址;A 既可以寄存器寻址,又可以直接寻址(此时写作 ACC)。

代码语言:javascript
复制
 MOV    A, R0
 MUL    AB
 MOV    B, R0
 PUSH   ACC
 ADD    A, ACC

寄存器间接寻址

以寄存器中的内容为地址,该地址中的内容为操作数的寻址方式,简称寄存器间址。能够用于寄存器间址的寄存器有 R0, R1, DPTR, 前面加@表示。

代码语言:javascript
复制
 MOV    @R0, A
 MOVX   A, @R1
 MOVX   @DPTR, A

变址寻址

由寄存器DPTR或PC中内容加上A累加器内容之和,形成操作数地址的寻址方式。变址寻址只能对ROM中的数据寻址操作,由于ROM只读,故变址寻址只有读操作。

代码语言:javascript
复制
 MOVC   A, @A+DPTR
 MOVC   A, @A+PC

相对寻址

以当前程序计数器PC的内容为基值,加上指令给出的一字节补码数(偏移量)形成新的PC值的寻址方式。

代码语言:javascript
复制
 SJMP  08H    ; PC + 08H -> PC

位寻址

对位地址中的内容作位操作的寻址方式,是一种直接寻址方式。

代码语言:javascript
复制
 SETB  20H
 MOV   32H, C
 ORL   C, 5AH

数据传送与交换指令

传送类指令

1. 内部RAM和SFR之间的传送指令 MOV
代码语言:javascript
复制
 ;(1) 以A为目的操作数
 MOV    A, Rn
 MOV    A, dir
 MOV    A, @Ri
 MOV    A, #data
 
 ;(2) 以Rn为目的操作数
 MOV    Rn, A
 MOV    Rn, dir
 MOV    Rn, #data
 
 ;(3) 以DPTR为目的操作数
 MOV    DPTR, #data16
 
 ;(4) 以直接地址为目的操作数
 MOV    dir, A
 MOV    dir, Rn
 MOV    dir, dir
 MOV    dir, @Ri
 MOV    dir, #data
 
 ;(5) 以间接地址为目的操作数
 MOV    @Ri, A
 MOV    @Ri, dir
 MOV    @Ri, #data
2. 外部存储器与A累加器之间传送
代码语言:javascript
复制
 ;(1) 访问外部RAM指令
 MOVX   @Ri, A
 MOVX   @DPTR, A
 MOVX   A, @Ri
 MOVX   A, @DPTR
 
 ;(2) 访问ROM指令(查表)
 MOVC   A, @A+PC
 MOVC   A, @A+DPTR
3. 堆栈操作
代码语言:javascript
复制
 ;(1) 入栈操作
 PUSH   dir    ; SP +1 -> SP,               ; (dir) -> (SP) 
 ;(2) 出栈操作
 POP    dir    ; (SP) -> (dir),                ; SP - 1 -> SP

压入堆栈时,SP先加1,数据再压入;弹出堆栈时,数据先弹出,SP再减1。

交换指令

1. 字节交换指令
代码语言:javascript
复制
 XCH    A, Rn
 XCH    A, dir
 XCH    @Ri
2. 低半字节交换
代码语言:javascript
复制
 XCHD   A, @Ri
3. A的高、低半字节交换
代码语言:javascript
复制
 SWAP   A

算术运算与逻辑运算指令

算术运算和逻辑运算指令对标志位的影响

  • P(奇偶) 标志位仅对A操作的指令有影响。
  • 传送指令、加1、减1指令、逻辑运算指令不影响CY(进位)、OV(溢出)、AC(辅助进位) 标志位。
  • 加、减运算指令影响P、OV、CY、AC 4个测试标志位,乘、除指令使CY=0,当乘积大于255或除数为0时,OV=1。

以 A 为目的操作数的算术运算和逻辑运算指令

代码语言:javascript
复制
 ADD   A, <@Ri,dir,Rn,#data> ; 加
 ADDC  A, <@Ri,dir,Rn,#data> ; 进位加  
 SUBB  A, <@Ri,dir,Rn,#data> ; 借位减
 ANL   A, <@Ri,dir,Rn,#data> ; 与
 ORL   A, <@Ri,dir,Rn,#data> ; 或
 XRL   A, <@Ri,dir,Rn,#data> ; 异或

以 dir 为目的操作数的逻辑运算指令

代码语言:javascript
复制
 ANL    dir, <A,#data>  ; 与
 ORL    dir, <A,#data>  ; 或
 XRL    dir, <A,#data>  ; 异或

加1、减1指令

代码语言:javascript
复制
 ;(1) 加1指令
 INC    A
 INC    @Ri
 INC    dir
 INC    Rn
 INC    DPTR
 
 ;(2) 减1指令
 DEC    A
 DEC    @Ri
 DEC    dir
 DEC    Rn

十进制调整指令

代码语言:javascript
复制
 ; 将A中二进制数相加和调整成BCD码
 DA     A

指令按下列原则进行调整:

和低4位大于9或有半进位,则低4位加6;如果和的高4位大于9或有进位,则高4位加6。指令根据相加和及标志自行判断,因此,该指令应紧跟在加指令之后,至少在加指令和该指令之间不能有影响标志的指令。

专对 A 的指令

代码语言:javascript
复制
 CPL    A    ; A 取反
 CLR    A    ; A 清零
 RL     A    ; A 左环移
 RR     A    ; A 右环移
 RLC    A    ; A 左大环移
 RRC    A    ; A 右大环移

乘、除法指令

代码语言:javascript
复制
 ;(1) 乘法指令
 MUL    AB    ; A×B -> BA
 
 ;(2) 除法指令
 DIV    AB    ; A÷B -> A···B

均为8位无符号乘、除法。若除数B=00H,则指令执行后,溢出标志OV=1,且A、B内容不变。


控制转移指令

调用程序和返回类指令

1. 长调用
代码语言:javascript
复制
 LCALL  addr16 ; addr16 -> PC[0~15]
  • 该指令功能是保护断点,即当前PC(本指令的下一条指令的首地址)压入堆栈;子程序的入口地址addr16送PC,转子程序执行。
  • 本指令的地址范围为64KB。
  • 机器码:12<addr16>,3字节。
2. 短调用
代码语言:javascript
复制
 ACALL  addr11 ; addr11 -> PC[0~10]
  • 该指令的功能是保护断点,即当前PC压入堆栈,addr11 -> PC[0~10], 而PC[11~15]保持原值不变。
  • 本指令的地址范围为2KB。
  • 机器码:a10 a9 a8 10001 a7 a6 a5 a4 a3 a2 a1 a0,2字节。
3. 子程序返回指令
代码语言:javascript
复制
 RET    ; 从调用子程序返回
 ; 功能:从栈顶弹出断点到PC, ; 从子程序返回主程序。 
 RETI    ; 从中断服务程序返回
 ; 功能:从栈顶弹出断点到PC, ; 并恢复中断优先级状态触发器, ; 从中断服务返回主程序。

转移指令

1. 无条件转移指令
代码语言:javascript
复制
 ;(1) 短转移(绝对转移)
 AJMP  addr11  ; addr11 -> PC[0~10],                ; 2KB范围 
 ;(2) 长转移(绝对转移)
 LJMP  addr16  ; addr16 -> PC[0~15],                ; 64KB范围 
 ;(3) 间接转移(绝对转移)
 JMP   @A+DPTR ; A+DPTR -> PC
 
 ;(4) 无条件相对转移
 SJMP  rel     ; PC + rel -> PC
2. 条件转移指令

条件转移指令均为相对转移指令。

代码语言:javascript
复制
 ;(1) 累加器为零转移
 JZ    rel    ; A=0时转移
 
 ;(2) 累加器非零转移
 JNZ   rel    ; A≠0时转移
 
 ;(3) 减1非零转移
 DJNZ  Rn, rel  ; Rn-1 -> Rn,                 ; Rn≠0时转移 DJNZ  dir, rel ; (dir)-1 -> (dir),                 ; (dir)≠0时转移 
 ;(4) 比较转移
 CJNE  A, dir,rel     ; A≠dir时转移
 CJNE  A, #data,rel   ; A≠#data时转移
 CJNE  Rn, #data,rel  ; Rn≠#data时转移
 CJNE  @Ri, #data,rel ;(Ri)≠#data时转移
  • CJNE指令都是3字节指令,做两数相减操作,不回送结果,影响CY标志。

空操作指令

代码语言:javascript
复制
 NOP

常用于产生一个机器周期的延时。


位操作指令

位清零、置1、取反指令

代码语言:javascript
复制
 CLR    C    ; 0 -> C
 CLR    bit  ; 0 ->bit
 SETB   C    ; 1 -> C
 SETB   bit  ; 1 -> bit
 CPL    C    ; /CY -> CY
 CPL    bit  ; /bit -> bit

位与、位或指令

代码语言:javascript
复制
 ANL    C, bit   ; CY & bit -> CY
 ANL    C, /bit  ; CY & /bit -> CY
 ORL    C, bit   ; CY | bit -> CY
 ORL    C, /bit  ; CY | /bit -> CY

位传送

代码语言:javascript
复制
 MOV    C, bit
 MOV    bit, C

位转移

代码语言:javascript
复制
 JC    rel        ; CY=1时转移
 JNC   rel        ; CY=0时转移
 JB    bit, rel   ; (bit)=1时转移
 JNB   bit, rel   ; (bit)=0时转移
 JBC   bit, rel   ; (bit)=0时转移,                  ; 且该位清零

水平有限,资料不够全面,希望这份笔记对大家有所帮助,祝师弟师妹们考试顺利!!

参考资料:李群芳《单片微型计算机与接口技术(第5版)》


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 悠风的采坑日记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 寻址方式
    • 立即寻址
      • 直接寻址
        • 寄存器寻址
          • 寄存器间接寻址
            • 变址寻址
              • 相对寻址
                • 位寻址
                • 数据传送与交换指令
                  • 传送类指令
                    • 1. 内部RAM和SFR之间的传送指令 MOV
                    • 2. 外部存储器与A累加器之间传送
                    • 3. 堆栈操作
                  • 交换指令
                    • 1. 字节交换指令
                    • 2. 低半字节交换
                    • 3. A的高、低半字节交换
                • 算术运算与逻辑运算指令
                  • 算术运算和逻辑运算指令对标志位的影响
                    • 以 A 为目的操作数的算术运算和逻辑运算指令
                      • 以 dir 为目的操作数的逻辑运算指令
                        • 加1、减1指令
                          • 十进制调整指令
                            • 专对 A 的指令
                              • 乘、除法指令
                              • 控制转移指令
                                • 调用程序和返回类指令
                                  • 1. 长调用
                                  • 2. 短调用
                                  • 3. 子程序返回指令
                                • 转移指令
                                  • 1. 无条件转移指令
                                  • 2. 条件转移指令
                                • 空操作指令
                                • 位操作指令
                                  • 位清零、置1、取反指令
                                    • 位与、位或指令
                                      • 位传送
                                        • 位转移
                                        领券
                                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档