📜  AVR微控制器中的分支指令

📅  最后修改于: 2021-06-28 16:55:39             🧑  作者: Mango

在本文中,我们将讨论有条件和无条件的AVR和分支指令中的循环。

在AVR中循环播放:
重复的操作或一组指令被称为编程循环。它是最基本的技术之一,在编写代码时非常方便。在AVR中执行循环的一种方法是重复编写一组指令。

例子 –
例如:

LDI R20, 0
LDI R21, 1
ADD R20, R21
ADD R20, R21
ADD R20, R21
ADD R20, R21
ADD R20, R21
ADD R20, R21

如我们所见,这种执行代码的方式效率很低,并且占用了大量代码空间。因此,我们使用分支指令(有条件的和无条件的)来使循环更加简单和节省空间。

条件分支指令:
我们已经在本文中详细讨论了条件分支指令。我们将在这里简要讨论它。

下表显示了不同的条件分支指令及其解释。

INSTRUCTION EXPLANATION FLAG STATUS
BREQ Branch if equal Branch if Z = 1
BRNE Branch if not equal Branch if Z = 0
BRSH Branch if same or higher Branch if C = 0
BRLO Branch if lower Branch if C = 1
BRLT Branch if less than (signed) Branch if S = 1
BRGE Branch if greater than or equal (signed)  Branch if S = 0
BRVS Branch if Overflow flag set  Branch if V = 1
BRVC Branch if Overflow flag clear  Branch if V = 0

使用BRNE循环:
BRNE(如果不相等则为分支)指令使用状态寄存器中的Z标志。

例子 –
编写一个将R20加5的程序20次,然后使用BRNE指令将总和发送到PORTC。

LDI R16, 20; counter register
       LDI R20, 0       
       LDI R21, 5
LOOP:  ADD R20, R21   
       DEC R16;          decrement the counter
       BRNE LOOP;        repeat until counter = 0
       OUT PORTC, R20

所有条件分支都是短跳转:这意味着目标地址必须在程序计数器的64个字节内。

无条件分支指令:
无条件分支是一个跳转,在该跳转中,控制被无条件地转移到目标地址。在AVR中,有3个无条件分支指令:JMP,RJMP和IJMP。使用哪个指令取决于目标地址。

  1. JMP(跳远)–
    JMP是无条件的跳转,可以转到AVR的4M(字)地址空间中的任何存储位置。这是一个4字节指令,其中10位用于操作码,其他22位表示目标位置的22位地址。
  2. RJMP(相对跳转)–
    在此2字节指令中,前4位用于操作码,其余位用于目标位置的相对地址。 000- $ FFF的相对地址范围分为向前跳转和向后跳转,即相对于当前程序计数器的地址,在内存的-2048至+2047之内。
  3. IJMP(间接跳转)–
    这是一个2字节的指令。执行时,程序计数器会加载Z寄存器的内容,因此它将跳转到Z寄存器提供的地址。 IJMP可以在程序存储器的最低64K字内跳转。