码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • AVR汇编(六):分支指令


    合集 - AVR汇编(7)
    1.AVR汇编(一):搭建交叉编译环境08-092.AVR汇编(二):AVR架构介绍08-093.AVR汇编(三):寻址方式08-104.AVR汇编(四):数据传送指令08-115.AVR汇编(五):算术和逻辑指令08-13
    6.AVR汇编(六):分支指令08-14
    7.AVR汇编(七):位操作和MCU控制指令08-14
    收起

    AVR汇编(六):分支指令

    分支指令用于改变程序的执行流,分为无条件分支和条件分支两类。

    无条件分支指令#

    JMP#

    image.png

    JMP 指令用于无条件跳转,类似于C中的 goto 关键字, JMP 指令的跳转范围为[0, 4M-1]字。

    RJMP 指令用于相对跳转,跳转范围为当前位置[-2K, 2K-1]字。

    IJMP 指令用于间接跳转,跳转的目的地址存放在 Z 寄存器中(记住单位是字)。

    例如:

        JMP f2             ; 跳转到f2
    f1:
        RJMP f3            ; 跳转到f3
    f2:
        LDI ZL, lo8(f1)
        LDI ZH, hi8(f1)    ; Z = f1
        CLC
        ROR ZH
        ROR ZL             ; Z = Z >> 1
        IJMP               ; 跳转到f1
    f3:
        RJMP f2            ; 跳转到f2
    

    注意:实测在GNU汇编下, IJMP 指令中不能直接把标签赋值给 Z 寄存器,因为标签表示的地址的单位是字节,而 Z 寄存器中存放的应该是字地址,所以要将标签右移一位传给 Z 寄存器。而 JMP 指令和 RJMP 指令则可以直接传标签。

    CALL / RET#

    image.png

    CALL 指令用于子程序调用,和 JMP 指令一样,也可以实现程序跳转,但是 CALL 指令在跳转之前会将下一条指令的地址(返回地址)压入栈中。 CALL 指令的跳转范围为[0, 64K-1]字。

    RCALL 指令用于相对子程序调用,跳转范围为当前位置[-2K, 2K-1]字。

    ICALL 指令用于间接子程序调用,子程序的地址存放在 Z 寄存器中(记住单位是字)。

    RET 指令用于子程序返回,先将返回地址从栈中弹出,然后进行跳转。

    RETI 指令用于中断子程序返回,和 RET 指令不同的是,它还会设置全局中断使能位 I 。

    例如:

        CALL f1            ; 调用f1子程序
        RCALL f1           ; 调用f1子程序
        LDI ZL, lo8(f1)
        LDI ZH, hi8(f1)    ; Z = f1
        CLC
        ROR ZH
        ROR ZL             ; Z = Z >> 1
        ICALL              ; 调用f1子程序
    f1:
        ...
        RET                ; 子程序返回
    
    XXX_IRQHandler:
        ...
        RETI               ; 中断子程序返回
    

    条件分支指令#

    CP#

    image.png

    CP 指令用于比较,实际上就是只影响标志位而不保存结果的减法操作。后缀带 C 表示带进位比较,后缀带 I 表示与立即数比较,后缀带 SE 表示如果相等,则跳过下一条指令。

    例如:

        LDI R16, 0x01
        LDI R17, 0x02
        CP R16, R17
        BRLT f1          ; 1 < 2,跳转到f1
        RJMP f3          ; 不会执行
    f1:
        CPI R16, 0x01
        BREQ f2          ; 1 == 1,跳转到f2
        RJMP f3          ; 不会执行
    f2:
        LDI R17, 0x01
        CPSE R16, R17    ; 1 == 1,跳过下一条指令
        RJMP f3          ; 不会执行
        SEC
        CPC R16, R17
        BRLT f3          ; 1 < 1 + C(1),跳转到f3
        RJMP f1          ; 不会执行
    f3:
        RJMP f3
    

    SBxx#

    image.png

    形如 SBxx 的指令根据寄存器中的某一位来选择跳过执行下一条指令, SBRC / SBRS 指令根据的是通用寄存器中的位的清除/设置状态,而 SBIC / SBIS 指令根据的是I/O寄存器中的。

    例如:

    f1:
        LDI R16, 0xAA
        SBRS R16, 1      ; R16.1 == 1,跳过下一条指令
        RJMP f1          ; 不会执行
        SBIC PINB, 2     ; 如果PB2输入为低电平,跳过下一条指令
        RJMP f1
    

    BRxx#

    image.png

    形如 BRxx 的指令用于根据条件改变程序执行流,支持的条件具体见下表:

    image.png

    BRxx 类的指令一般和 CP 或 SUB 指令配合使用。

    例如:

    f1:
        LDI R16, 0X01
        LDI R17, 0X02
        CP R16, R17
        BRLO f2          ; 0x01 < 0x02,跳转到f2
        RJMP f1          ; 不会执行
    f2:
        CPI R16, 0x01
        BRSH f3          ; 0x01 == 0x01,跳转到f3
        RJMP f1          ; 不会执行
    f3:
        RJMP f3
    

    参考资料#

    1. ATmega328P Datasheet
    2. AVR Instruction Set Manual
  • 相关阅读:
    JS element从数组中取出两个字段组成新的数组
    mysql索引不生效
    计算机毕业设计springboot教务管理系统4z3kl源码+系统+程序+lw文档+部署
    An动画基础之散件动画原理与形状提示点
    C++ 常见面试题精选
    go语言相关bug
    如何确定 <board_name>名字
    【Azure Developer】完成算法第4版书中,第一节基础编码中的数组函数 histogrm()
    U-boot下netconsole实现
    Vue 3.0 使用的 diff 算法相比 Vue 2.0 中的双端比对有什么优势?
  • 原文地址:https://www.cnblogs.com/chinjinyu/p/17628626.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号