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. SBRCSBRS是暫存器Rr的 (b) 位元如果等於0或1, 則執行PC + 2 (或3) 的指令; 否則進行PC+1的指令

 

SBICSBIS是I/O暫存器 (P0 ~ P31) 的位元如果等於1或0, 則執行PC + 2 (或3)的指令; 否則進行PC+1的指令

 

 

 

  • 2. BRBCBRBS是狀態暫存器 (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

 

 

 

 

 

 

 

文章標籤
全站熱搜
創作者介紹
創作者 zeppe 的頭像
zeppe

ZEPPE

zeppe 發表在 痞客邦 留言(0) 人氣(237)