AVR 微控制器中的条件分支指令

17 Mar 2025 | 6 分钟阅读

在汇编语言编程方面,最重要和最基本的一点是控制程序流程的能力。如果我们控制程序流程,就意味着我们指示单片机在程序中从一个地址跳转到另一个地址。这个过程称为分支。如果没有这个特性,指令将由单片机在其内存中按顺序执行,直到它们运行完毕。如果我们试图在没有条件分支的情况下编写一个非平凡的程序,那将极其困难,但并非不可能。借助寄存器,我们可以理解AVR单片机的指令,它们描述如下

状态寄存器 (SReg)

在AVR单片机中,状态寄存器也称为标志寄存器或条件码寄存器。它由程序员用于某些编程目的。它包含有关处理器状态的信息。该寄存器是8位的。它包含8个标志,这些标志根据前一条指令的结果进行更新。借助6位(从位0到位5),可以表示条件标志:V、S、Z、N、C和H。

在状态寄存器中,8位表示如下

Conditional Branch instruction in AVR Microcontroller

此处,数据位的用法如下

位 0: 它是进位标志,用C表示,也称为D0。

位 1: 它是零标志,用Z表示,也称为D1。

位 2: 它是负数标志,用N表示,也称为D2。

位 3: 它是二进制补码溢出标志,用V表示,也称为D3。

位 4: 它是符号位,用S表示,也称为D4。

位 5: 它是半进位标志,用H表示,也称为D5。

位 6: 它是位复制存储,用T表示,也称为D6。

位 7: 它是全局中断使能,用I表示,也称为D7。

进位标志

进位标志也称为C标志。假设我们正在执行n位算术或逻辑运算。如果运算产生的结果超过n位,则进位标志将被设置为1。否则,进位标志将被重置为0。

零标志

此标志也称为Z标志。如果算术运算的结果为零,则此标志将被设置为1。如果结果不为零,则标志将被重置为0。换句话说,我们可以这样表达零标志

负数标志

此标志也称为N标志。这里我们使用符号位D7,它用于表示有符号数的二进制表示。如果D7位显示1,则标志将被设置为1,结果将为负数。如果D7位显示0,则标志将被重置为0,结果将为正数。换句话说,我们可以这样表达负数标志

溢出标志

此标志也称为V标志。如果带符号数运算的结果非常大,则溢出标志将被设置为1。因此,高位将溢出到符号位。在另一种情况下,溢出标志将被重置为0。

符号标志

此标志也称为S标志。在任何逻辑运算或算术运算后,如果D7显示1,则1表示负数,并且还表明符号标志现在已设置。如果D7显示0,则0表示正数,并表明符号标志已重置。

半进位标志

此标志也称为H标志。在ADD或SUB运算期间,如果从D3到D4有进位,则半进位标志将被设置。

下表显示了各种类型的条件分支指令及其解释

指令说明标志状态
BREQBREQ 指的是“如果相等则跳转”。这是一种条件相对分支。如果零标志(Z)已设置,此指令将测试Z并相对于PC(程序计数器)进行分支。假设有两个寄存器D(目标寄存器)和S(源寄存器),它们包含有符号或无符号二进制数。如果寄存器D和寄存器S中的二进制数相等,则将发生分支。BREQ 相对于程序计数器在两个方向上,即 PC - 63 ≤ 目标 ≤ PC + 64。此处,偏移量由 k 表示。如果 Z = 1 则跳转
BRNEBRNE 指的是“如果不相等则跳转”。这是一种条件相对分支。如果零标志(Z)已清除,此指令将测试Z并相对于PC(程序计数器)进行分支。假设有两个寄存器D(目标寄存器)和S(源寄存器),它们包含有符号或无符号二进制数。如果寄存器D和寄存器S中的二进制数不相等,则将发生分支。如果 Z = 0 则跳转
BRSHBRSH 指的是“如果无符号数相同或更大则跳转”。这是一种条件相对分支。如果进位标志(C)已清除,此指令将测试C并相对于PC(程序计数器)进行分支。假设有两个寄存器D(目标寄存器)和S(源寄存器),它们包含无符号二进制数。如果寄存器D中的无符号数大于或等于寄存器S中的无符号数,则将发生分支。BRSH 相对于程序计数器在两个方向上,即 PC - 63 ≤ 目标 ≤ PC + 64。此处,偏移量由 k 表示。如果 C = 0 则跳转
BRLOBRLO 指的是“如果更小则跳转”。如果进位标志(C)已设置,此指令将测试C并相对于PC(程序计数器)进行分支。假设有两个寄存器D(目标寄存器)和S(源寄存器),它们包含无符号二进制数。如果寄存器D中的无符号数小于寄存器S中的无符号数,则将发生分支。如果 C = 1 则跳转
BRLTBRLT 指的是“如果更小则跳转”。如果符号标志(S)已设置,此指令将测试S并相对于PC(程序计数器)进行分支。假设有两个寄存器D(目标寄存器)和S(源寄存器),它们包含有符号二进制数。如果寄存器D中的有符号数小于寄存器S中的有符号数,则将发生分支。BRLT 相对于程序计数器在两个方向上,即 PC - 63 ≤ 目标 ≤ PC + 64。此处,偏移量由 k 表示。如果 S = 1 则跳转
BRGEBRGE 指的是“如果相等或更大则跳转”。如果符号标志(S)已清除,此指令将测试S并相对于PC(程序计数器)进行分支。假设有两个寄存器D(目标寄存器)和S(源寄存器),它们包含有符号二进制数。如果寄存器D中的有符号数大于或等于寄存器S中的有符号数,则将发生分支。如果 S = 0 则跳转
BRVSBRVS 指的是“如果发生溢出则跳转”。如果溢出标志(V)已设置,此指令将测试V并相对于PC(程序计数器)进行分支。如果 V = 1 则跳转
BRVCBRVC 指的是“如果未发生溢出则跳转”。如果溢出标志(V)已清除,此指令将测试V并相对于PC(程序计数器)进行分支。如果 V = 0 则跳转