AVR 微控制器中的分支指令

28 Aug 2024 | 5 分钟阅读

要理解分支指令,我们应该先了解 AVR 微控制器中的循环。之后,我们将学习分支指令的两种类型:条件分支指令和无条件分支指令。

AVR 微控制器中的循环

当我们编写代码时,首先想到的最基本的技术就是循环。循环可以描述为一组指令或编程中的重复操作。如果我们在 AVR (Alf and Vegard's RISC 处理器) 中重复编写一组指令,只有一种方法可以执行循环。

例如

通过上面的例子,我们可以看到上面的代码占用了大量的空间,效率也很低。因此,我们可以借助分支指令,使上述循环代码更简单、更节省空间。

分支指令

在程序循环和条件语句中,控制流通过分支指令实现。如果满足给定条件,则只执行特定指令序列。当我们执行分支指令时,执行会切换到不同的指令。分支指令有两种类型:条件分支指令和无条件分支指令。

条件分支指令

条件分支指令可以描述为一组指令。它用于通过提供跳出循环的分支来控制程序流程。

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

指令说明标志状态
BREQBREQ 指“如果相等则分支”。它是一种条件相对分支。如果零标志 (Z) 置位,此指令将测试 Z 并相对于 PC(程序计数器)进行分支。假设有两个寄存器 D(目标寄存器)和 S(源寄存器),其中包含有符号或无符号二进制数。如果寄存器 D 和寄存器 S 的二进制数相等,则会发生分支。如果 Z = 1 则分支
BRNEBRNE 指“如果不相等则分支”。如果零标志 (Z) 清除,此指令将测试 Z 并相对于 PC(程序计数器)进行分支。假设有两个寄存器 D(目标寄存器)和 S(源寄存器),其中包含有符号或无符号二进制数。如果寄存器 D 和寄存器 S 的二进制数不相等,则会发生分支。如果 Z = 0 则分支
BRSHBRSH 指“如果相同或更高则分支”。如果进位标志 (C) 清除,此指令将测试 C 并相对于 PC(程序计数器)进行分支。假设有两个寄存器 D(目标寄存器)和 S(源寄存器),其中包含无符号二进制数。如果寄存器 D 的无符号数大于或等于寄存器 S 的无符号数,则会发生分支。如果 C = 0 则分支
BRLOBRLO 指“如果更低则分支”。如果进位标志 (C) 置位,此指令将测试 C 并相对于 PC(程序计数器)进行分支。假设有两个寄存器 D(目标寄存器)和 S(源寄存器),其中包含无符号二进制数。如果寄存器 D 的无符号数小于寄存器 S 的无符号数,则会发生分支。如果 C = 1 则分支
BRLTBRLT 指“如果更低则分支”。如果符号标志 (S) 置位,此指令将测试 S 并相对于 PC(程序计数器)进行分支。假设有两个寄存器 D(目标寄存器)和 S(源寄存器),其中包含有符号二进制数。如果寄存器 D 的有符号数小于寄存器 S 的有符号数,则会发生分支。如果 S = 1 则分支
BRGEBRGE 指“如果大于或等于则分支”。如果符号标志 (S) 清除,此指令将测试 S 并相对于 PC(程序计数器)进行分支。假设有两个寄存器 D(目标寄存器)和 S(源寄存器),其中包含有符号二进制数。如果寄存器 D 的有符号数大于或等于寄存器 S 的有符号数,则会发生分支。如果 S = 0 则分支
BRVSBRVS 指“如果溢出置位则分支”。如果溢出标志 (V) 置位,此指令将测试 V 并相对于 PC(程序计数器)进行分支。如果 V = 1 则分支
BRVCBRVC 指“如果溢出清除则分支”。如果溢出标志 (V) 清除,此指令将测试 V 并相对于 PC(程序计数器)进行分支。如果 V = 0 则分支

使用 BRNE 的循环

BRNE 指“如果不相等则分支”。如果 Z 清除,它将测试零标志 (Z) 并相对于 PC 进行分支。它基本上使用状态寄存器中的 Z 标志。

例如

在这个例子中,我们将编写代码将 5 添加到 C,这个过程将重复 20 次。最后,借助 BRNE 指令,我们将和发送到 PORTC。

所有条件分支都基本上使用短跳。这意味着目标地址必须在程序计数器 64 字节范围内。

无条件分支指令

无条件分支可以描述为将控制无条件地转移到目标地址的跳转。AVR 基本上有三种类型的无条件分支指令,即 JMP、IJMP 和 RJMP。无条件分支的指令描述如下:

JMP

JMP 指令也称为长跳转。它是一种无条件跳转,可以跳转到任何内存位置,但该位置必须在 AVR 的 4M(字)地址空间内。JMP 指令是 4 字节指令。其中 10 位表示操作码,其余 22 位表示目标位置的 22 位地址。

RJMP

RJMP 指令也称为相对跳转。RJMP 指令是 2 字节指令。其中前四位表示操作码,其余位表示目标位置的相对地址。相对地址的范围是 000-$FFF,它分为两个跳转:后向跳转和前向跳转。此跳转必须在相对于当前程序计数器地址的 -2048 和 +2047 内存范围内。

IJMP

IJMP 指令也称为间接跳转。IJMP 指令是 2 字节指令。当我们执行 IJMP 指令时,程序计数器将通过 Z 寄存器的内容加载。这意味着 Z 寄存器提供一个地址,IJMP 跳转到此地址。此指令能够在 PC(程序计数器)的最低 64k 字(128KB)内跳转。