AVR汇编(六):分支指令
AVR汇编(六):分支指令
分支指令用于改变程序的执行流,分为无条件分支和条件分支两类。
无条件分支指令
JMP

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

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

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

形如 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

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

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
参考资料
AVR汇编(六):分支指令的更多相关文章
- AVR之BOOTLOADER技术详解(转)
源:http://blog.csdn.net/zhenhua10/article/details/6442412 ATmega128具备引导加载支持的用户程序自编程功能(In-System Progr ...
- Markdown 常用语言关键字
Markdown 语法高亮支持的语言还是比较多的,记下来备用. 语言名 关键字 Bash bash CoffeeScript coffeescript C++ cpp C# cs CSS css Di ...
- 32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址
32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址 一丶基址,随机基址的理解 首先,全局变量的地址,我们都知道是固定的,是在PE文件中有保存的 但是高版本有了随机基址,那么要怎么解决这 ...
- PC逆向之代码还原技术,第六讲汇编中除法代码还原以及原理第二讲,被除数是正数 除数非2的幂
目录 一丶简介 二丶代码还原讲解 1.被除数无符号 除数非2的幂 2.被除数无符号 除数为特例7 三丶代码还原总结 一丶简介 上一篇博客说的除2的幂. 如果被除数是有符号的,那么会进行调整,并使用位操 ...
- 汇编学习(六)——代码转换程序
(一)逻辑运算指令 一.双操作数逻辑运算指令 1.指令格式: AND dst,src ; "与"运算, OR dst,src ; "或"运算 XOR dst,s ...
- arm汇编学习(六)---跳转到thumb状态
通常函数返回使用 pop {r7,pc}或bx lr等方式(bx,b类似jmp为跳转指令,但bx可以指定跳转区域究竟为thumb还是arm指令.thumb指令指令的时候,直接填写该地址却总是产生SIG ...
- 计算机系统6-> 计组与体系结构3 | MIPS指令集(中)| MIPS汇编指令与机器表示
上一篇计算机系统5-> 计组与体系结构2 | MIPS指令集(上)| 指令系统从顶层讲解了一个指令集 / 指令系统应当具备哪些特征和工作原理.这一篇就聚焦MIPS指令集(MIPS32),看看其汇 ...
- v87.01 鸿蒙内核源码分析 (内核启动篇) | 从汇编到 main () | 百篇博客分析 OpenHarmony 源码
本篇关键词:内核重定位.MMU.SVC栈.热启动.内核映射表 内核汇编相关篇为: v74.01 鸿蒙内核源码分析(编码方式) | 机器指令是如何编码的 v75.03 鸿蒙内核源码分析(汇编基础) | ...
- 20145212——GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 测试代码 #include <stdio.h> short val = 1; int vv = 2; int g(int xxx) { return xxx + ...
- arm汇编指令
ARM处理器的指令集可以分为跳转指令.数据处理指令.程序状态寄存器(PSR)处理指令.加载/存储指令.协处理器指令和异常产生指令6大指令 一.跳转指令 跳转指令用于实现程序流程的跳转 跳转指令分类 Ⅰ ...
随机推荐
- 2021-02-06:假设字符串str长度为N,请问最长回文子串的长度是多少?
福哥答案2021-02-06: 1.动态规划.无代码,见图.2.中心扩展法.无代码.3.Manacher算法.有代码,见图.1)理解回文半径数组.2)理解所有中心的回文最右边界R,和取得R时的中心点C ...
- 2021-04-10:给定两个可能有环也可能无环的单链表,头节点head1和head2。请实现一个函数,如果两个链表相交,请返回相交的 第一个节点。如果不相交,返回null。【要求】如果两个链表长度之和为N,时间复杂度请达到O(N),额外空间复杂度 请达到O(1)。
2021-04-10:给定两个可能有环也可能无环的单链表,头节点head1和head2.请实现一个函数,如果两个链表相交,请返回相交的 第一个节点.如果不相交,返回null.[要求]如果两个链表长度之 ...
- 2021-11-12:前 K 个高频元素。给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。提示:1 <= nums.length <=
2021-11-12:前 K 个高频元素.给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案.提示:1 <= nums.length ...
- Salesforce LWC学习(四十四) Datatable 显示日期类型的有趣点思考
本篇参考:https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.reference_sale ...
- Qt+QtWebApp开发笔记(一):QtWebApp介绍、下载和搭建基础封装http轻量级服务器Demo
前言 在arm上做了Qt的应用程序,为了在局域网实现web页的访问方式来配置arm上Qt的程序,局域网轻量级http服务器是很好的实现方式之一,有机会做国产麒麟上Qt的http服务器,正好接触到了 ...
- Github Copilot Chat 初体验
最近因为阳了的缘故一直躺在床上.今天终于从床上爬起来了.不是因为好透了,而是因为我收到了申请Copilot Chat preview 权限通过的邮件.实在忍不住,于是起床开电脑在咳嗽声中进行了一番体验 ...
- 深度学习基础入门篇[8]::计算机视觉与卷积神经网络、卷积模型CNN综述、池化讲解、CNN参数计算
深度学习基础入门篇[8]::计算机视觉与卷积神经网络.卷积模型CNN综述.池化讲解.CNN参数计算 1.计算机视觉与卷积神经网络 1.1计算机视觉综述 计算机视觉作为一门让机器学会如何去"看 ...
- windows下搭建docker容器环境
下载Docker Desktop https://www.docker.com/ 安装Docker Desktop(软件默认安装c盘,若要安装到其他盘,在安装之前创建软连接再进行安装) 在自定义磁盘中 ...
- 读文献先读图——主成分分析 PCA 图
上周五彩斑斓的气泡图 有让你眼花缭乱吗? 本周,化繁为简的PCA图 你值得拥有! 数据分析| 科研制图﹒PCA 图 关键词:主成分分析.降维 1665 年的鼠疫 牛顿停课在家提出了万有引力 ;183 ...
- 使用镜像加速 Rtools 下载与安装
在 windows 使用 R,尤其是安装 R 包的时候,经常会遇到一些 Rtools 的问题,今天聊一下. Rtools 是什么 Rtools 作用很大,但我们一般不怎么会直接使用. Rtools p ...