AVR 微控制器中的条件分支指令17 Mar 2025 | 6 分钟阅读 在汇编语言编程方面,最重要和最基本的一点是控制程序流程的能力。如果我们控制程序流程,就意味着我们指示单片机在程序中从一个地址跳转到另一个地址。这个过程称为分支。如果没有这个特性,指令将由单片机在其内存中按顺序执行,直到它们运行完毕。如果我们试图在没有条件分支的情况下编写一个非平凡的程序,那将极其困难,但并非不可能。借助寄存器,我们可以理解AVR单片机的指令,它们描述如下 状态寄存器 (SReg)在AVR单片机中,状态寄存器也称为标志寄存器或条件码寄存器。它由程序员用于某些编程目的。它包含有关处理器状态的信息。该寄存器是8位的。它包含8个标志,这些标志根据前一条指令的结果进行更新。借助6位(从位0到位5),可以表示条件标志:V、S、Z、N、C和H。 在状态寄存器中,8位表示如下  此处,数据位的用法如下 位 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有进位,则半进位标志将被设置。 下表显示了各种类型的条件分支指令及其解释 指令 | 说明 | 标志状态 |
---|
BREQ | BREQ 指的是“如果相等则跳转”。这是一种条件相对分支。如果零标志(Z)已设置,此指令将测试Z并相对于PC(程序计数器)进行分支。假设有两个寄存器D(目标寄存器)和S(源寄存器),它们包含有符号或无符号二进制数。如果寄存器D和寄存器S中的二进制数相等,则将发生分支。BREQ 相对于程序计数器在两个方向上,即 PC - 63 ≤ 目标 ≤ PC + 64。此处,偏移量由 k 表示。 | 如果 Z = 1 则跳转 | BRNE | BRNE 指的是“如果不相等则跳转”。这是一种条件相对分支。如果零标志(Z)已清除,此指令将测试Z并相对于PC(程序计数器)进行分支。假设有两个寄存器D(目标寄存器)和S(源寄存器),它们包含有符号或无符号二进制数。如果寄存器D和寄存器S中的二进制数不相等,则将发生分支。 | 如果 Z = 0 则跳转 | BRSH | BRSH 指的是“如果无符号数相同或更大则跳转”。这是一种条件相对分支。如果进位标志(C)已清除,此指令将测试C并相对于PC(程序计数器)进行分支。假设有两个寄存器D(目标寄存器)和S(源寄存器),它们包含无符号二进制数。如果寄存器D中的无符号数大于或等于寄存器S中的无符号数,则将发生分支。BRSH 相对于程序计数器在两个方向上,即 PC - 63 ≤ 目标 ≤ PC + 64。此处,偏移量由 k 表示。 | 如果 C = 0 则跳转 | BRLO | BRLO 指的是“如果更小则跳转”。如果进位标志(C)已设置,此指令将测试C并相对于PC(程序计数器)进行分支。假设有两个寄存器D(目标寄存器)和S(源寄存器),它们包含无符号二进制数。如果寄存器D中的无符号数小于寄存器S中的无符号数,则将发生分支。 | 如果 C = 1 则跳转 | BRLT | BRLT 指的是“如果更小则跳转”。如果符号标志(S)已设置,此指令将测试S并相对于PC(程序计数器)进行分支。假设有两个寄存器D(目标寄存器)和S(源寄存器),它们包含有符号二进制数。如果寄存器D中的有符号数小于寄存器S中的有符号数,则将发生分支。BRLT 相对于程序计数器在两个方向上,即 PC - 63 ≤ 目标 ≤ PC + 64。此处,偏移量由 k 表示。 | 如果 S = 1 则跳转 | BRGE | BRGE 指的是“如果相等或更大则跳转”。如果符号标志(S)已清除,此指令将测试S并相对于PC(程序计数器)进行分支。假设有两个寄存器D(目标寄存器)和S(源寄存器),它们包含有符号二进制数。如果寄存器D中的有符号数大于或等于寄存器S中的有符号数,则将发生分支。 | 如果 S = 0 则跳转 | BRVS | BRVS 指的是“如果发生溢出则跳转”。如果溢出标志(V)已设置,此指令将测试V并相对于PC(程序计数器)进行分支。 | 如果 V = 1 则跳转 | BRVC | BRVC 指的是“如果未发生溢出则跳转”。如果溢出标志(V)已清除,此指令将测试V并相对于PC(程序计数器)进行分支。 | 如果 V = 0 则跳转 |
|