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