AVR.6 分支指令 (Branch Instructions)
指令集的符號 :
k : 程式計數器....
P : I/O暫存器
b : 暫存器的位元(3-bit)
s : 狀態暫存器的位元
|
分支指令 (Branch Instructions) |
||||
|
|
運算元 |
過程的描述 |
說明 |
Flag Clock |
|
RJMP |
k |
PC <- PC + k +1 STACK <- PC +1 SP <- SP - 2 |
相對跳躍 Relative Jump |
None 2 |
|
IJMP |
|
PC <- Z |
絕對跳躍 Indirect Jump to (Z) |
None 2 |
|
RCALL |
k |
PC <- PC + k +1 STACK <- PC +1 SP <- SP - 2 |
相對呼叫副程式 Relative Call Subrotine |
None 3 |
|
ICALL |
|
PC <- Z STACK <- PC +1 SP <- SP - 2 |
呼叫Z所指的位址的副程式 Indirect Call to (Z) |
None 3 |
|
RET |
|
PC <- STACK SP <- SP + 2 |
從副程式回到主程式 Subrotine Return |
None 4 |
|
RETI |
|
PC <- STACK SP <- SP + 2 |
從中斷回到主程式 Interrupt Return |
I 4 |
|
CPSE |
Rd, Rr |
if Rd=Rr,則 PC <- PC+2(or3), else PC <- PC+1 |
比較Rd,Rr,如果Rd=Rr,就執行PC+2 (或3)的指令;否則執行PC+1的指令 Compare, Skip if Equal |
None 1/2/3 |
|
SBRC |
Rr, b |
if (Rr(b)=0),則 PC<- PC+2 (or3) else PC <- PC+1 |
如果Rr (b) =0,執行PC+2 (或3)的指令;否則執行PC+1的指令 Skip if Bit in Register Clear |
None 1/2/3 |
|
SBRS |
Rr, b |
if Rr(b)=1,則PC<- PC+2 (or3) else PC <- PC+1 |
如果Rr (b) =1,執行PC+2 (或3)的指令;否則執行PC+1的指令 Skip if Bit in Register Set |
None 1/2/3 |
|
SBIC |
P, b |
if P(b)=0,則PC<- PC+2 (or3) else PC <- PC+1 |
如果I/O暫存器的P(b) =0,執行PC+2 (或3)的指令;否則執行PC+1的指令 Skip if Bit in I/O Register Clear |
None 1/2/3 |
|
SBIS |
P, b |
if P(b)=1,則PC <- PC+2 (or3) else PC <- PC+1 |
如果I/O暫存器的P(b) =1,執行PC+2 (或3)的指令;否則執行PC+1的指令 Skip if Bit in I/O Register Set |
None 1/2/3 |
|
BRBC |
s, k |
if SREG(s)=0,則PC <- PC+2 (or3) else PC <- PC+1 |
如果狀態暫存器的(s) =0,執行PC+2 (或3)的指令;否則執行PC+1的指令 Skip if Status Flag Clear |
None 1/2 |
|
BRBS |
s, k |
if SREG(b)=1,則PC <- PC+2 (or3) else PC <- PC+1 |
如果狀態暫存器的(s) =1,執行PC+2 (或3)的指令;否則執行PC+1的指令 Skip if Status Flag Set |
None 1/2 |
指令的說明
1. RJMP k--相對跳躍, k限於+2K,而PC的計數是PC + k + 1;例如 :
CPI R16,$20 ; R16和$20大小比較
BRNE L0 ;不相等則分支,執行L1;相等,執行下一行
RJMP OK ;跳去執行OK那一行
L0: ADD R16,R17 ;
INC R16
OK: NOP
2. IJMP--絕對跳躍, 跳到Z所指的位址, Z限於64K words (128K bytes)
3. RCALL k--呼叫副程式, k限於+2K, 而且PC+k+1, 並且把PC+1存放到SRAM的堆疊裡 (SP-2, 因為PC是16位元的暫存器,而SP是8位元的暫存器)
Note : 記得指定堆疊指標SP的初始值
RCALL roution ;呼叫"routin"的副程式,
ADD R16,R17 ;
...
routin: LD R22,$20 ;
...
RET ;回到主程式
4. ICALL是呼叫Z所指的位址的副程式, PC+Z,同時把PC+1存放到SRAM的堆疊裡,同樣的SP-2
5. CPSE Rd,Rr是Rd和Rr比較大小, 如果Rd=Rr, 就執行PC+2 (或3) 的指令, 否則執行PC+1的指令; 例如 :
CPSE R4,R5 ;比較R4,R5大小,如果R4=R5,則執行NOP 那一行的指令(PC+3)
LDI R26,$10
LDI R27,$20 ; X暫存器
NOP ;
- 1. SBRC和SBRS是暫存器Rr的 (b) 位元如果等於0或1, 則執行PC + 2 (或3) 的指令; 否則進行PC+1的指令
SBIC和SBIS是I/O暫存器 (P0 ~ P31) 的位元如果等於1或0, 則執行PC + 2 (或3)的指令; 否則進行PC+1的指令
- 2. BRBC和BRBS是狀態暫存器 (SREG) 的 (s) 位元, 如果等於0或1, 則執行PC + k + 1的指令; 否則進行PC+1的指令
BRBS和 BRBC衍生了以下18個指令
|
分支指令 (Branch Instructions) |
||||
|
|
運算元 |
過程的描述 |
說明 |
flag clock |
|
BREQ |
k |
if (Z=1),則PC ¬PC + k + 1 否則PC ¬PC + 1 |
如果Rd = Rr(Z = 1),則執行PC + k +1的指令,否則執行PC+1的指令 Branch if Equal |
None 1 / 2 |
|
BRNE |
k |
if (Z = 0),則PC ¬PC + k + 1 否則PC ¬PC + 1 |
如果Rd≠Rr(Z = 0),則執行PC + k +1的指令,否則執行PC+1的指令 Branch if Not Equal |
None 1 / 2 |
|
BRCS |
k |
if (C = 1),則PC ¬PC + k + 1 否則PC ¬PC + 1 |
如果C = 1,則執行PC + k +1的指令,否則執行PC+1的指令 Branch if Carry Set |
None 1 / 2 |
|
BRCC |
k |
if (C = 0),則PC ¬PC + k + 1 否則PC ¬PC + 1 |
如果C = 0,則執行PC + k +1的指令,否則執行PC+1的指令 Branch if Carry Cleared |
None 1 / 2 |
|
* BRSH |
k |
if (C = 0),則PC ¬PC + k + 1 否則PC ¬PC + 1 |
如果相等或較大(C = 0),則執行PC + k +1的指令,否則執行PC+1的指令(無號數) Branch if Same or Higher (Unsigned) |
None 1 / 2 |
|
* BRLO |
k |
if (C = 1),則PC ¬PC + k + 1 否則PC ¬PC + 1 |
如果較小(C = 0),則執行PC + k +1的指令,否則執行PC+1的指令(無號數) Branch if Lower (Unsigned) |
None 1 / 2 |
|
BRMI |
k |
if (N = 1),則PC ¬PC + k + 1 否則PC ¬PC + 1 |
如果是負數(N = 1),則執行PC + k +1的指令,否則執行PC+1的指令 Branch if Minus |
None 1 / 2 |
|
BRPL |
k |
if (N = 0),則PC ¬PC + k + 1 否則PC ¬PC + 1 |
如果是正數(N = 0),則執行PC + k +1的指令,否則執行PC+1的指令 Branch if Plus |
None 1 / 2 |
|
BRGE |
k |
if (S = 0),則PC ¬PC + k + 1 否則PC ¬PC + 1 |
如果較大或相等(S = 0),則執行PC + k +1的指令,否則執行PC+1的指令(有號數) Branch if Greater or Equal (Signed) |
None 1 / 2 |
|
BRLT |
k |
if (S = 1),則PC ¬PC + k + 1 否則PC ¬PC + 1 |
如果(S = 1),則執行PC + k +1的指令,否則執行PC+1的指令(有號數) Branch if Less Than (Signed) |
None 1 / 2 |
|
BRHS |
k |
if (H = 1),則PC ¬PC + k + 1 否則PC ¬PC + 1 |
如果H = 1,則執行PC + k +1的指令,否則執行PC+1的指令 Branch if Half Carry Flag Set |
None 1 / 2 |
|
BRHC |
k |
if (H = 0),則PC ¬PC + k + 1 否則PC ¬PC + 1 |
如果H = 0,則執行PC + k +1的指令,否則執行PC+1的指令 Branch if Half Carry Flag Cleared |
None 1 / 2 |
|
BRTS |
k |
if (T = 1),則PC ¬PC + k + 1 否則PC ¬PC + 1 |
如果T = 1,則執行PC + k +1的指令,否則執行PC+1的指令 Branch if T Flag Set |
None 1 / 2 |
|
BRTC |
k |
if (T = 0),則PC ¬PC + k + 1 否則PC ¬PC + 1 |
如果T = 0,則執行PC + k +1的指令,否則執行PC+1的指令 Branch if T Flag Cleared |
None 1 / 2 |
|
BRVS |
k |
if (V = 1),則PC ¬PC + k + 1 否則PC ¬PC + 1 |
如果V = 1,則執行PC + k +1的指令,否則執行PC+1的指令 Branch if Overflow Flag Set |
None 1 / 2 |
|
BRVC |
k |
if (V = 0),則PC ¬PC + k + 1 否則PC ¬PC + 1 |
如果V = 0,則執行PC + k +1的指令,否則執行PC+1的指令 Branch if Overflow Flag Cleared |
None 1 / 2 |
|
BRIE |
k |
if (I= 1),則PC ¬PC + k + 1 否則PC ¬PC + 1 |
如果I = 1,則執行PC + k +1的指令,否則執行PC+1的指令 Branch if Interrupt Enabled |
None 1 / 2 |
|
BRID |
k |
if (I = 0),則PC ¬PC + k + 1 否則PC ¬PC + 1 |
如果I = 0,則執行PC + k +1的指令,否則執行PC+1的指令 Branch if Interrupt Disabled |
None 1 / 2 |
