AVR.2     算術和邏輯指令(Arithmetic and Logic Instructions)

 

算術和邏輯指令大致上分為下列3種類型 :

 

  • 1. 暫存器與暫存器之間的運算指令: ADD,ADC,SUB, SBC,AND,OR,EOR,CP, CPC

 

  • 2. 暫存器與常數之間的運算指令 : ADIW,SUBI,SBCI,SBIW,ANDI,ORI,CPI, SBR, CBR

 

  • 3. 暫存器本身的運算指令 : COM,NEG,INC,DEC,TST,CLR,SER

 

 

 

指令集的符號 :

 

Rd :            目的暫存器(Destination Register)

Rr :             來源暫存器(Source Register)

Rd+1 :Rd   16-bit的暫存器,只限R25:R24, R27:R26, R29:R28, R30:R31

K :               常數(Constant)

$ :               16進位

·                 AND

v              OR

Å                 Exclusive OR

 

 

(以下8個是狀態暫存器(SREG)的旗號Flag)


C :              進位旗號

Z :        零旗號

N :        負數旗號

V :        有號數旗號

S :        符號旗號

H :        半進位旗號

T :        位元暫存旗號

I :         中斷致能旗號

 

 註 : " * "代表衍生類似的指令

 

 

  算術和邏輯指令 (Arithmetic and Logic Instructions)

 

運算元

運算

說明

旗號

clock cycle

 ADD

Rd,Rr

PC + 1 ¬ PC

Rd ¬ Rd + Rr

Rd + Rr,結果放回Rd

Add without Carry

Z,C,N,V,S,H

1

 ADC

Rd,Rr

PC + 1 ¬ PC

Rd ¬ Rd + Rr + C

Rd + Rr+C(進位),結果放回Rd

Add with Carry

Z,C,N,V,S,H

1

 ADIW

Rd,K

PC + 1 ¬ PC

(Rd+1:Rd) ¬ Rd+1:Rd + K

(Rd+1:Rd)+常數(K),結果放回(Rd+1:Rd)

Add Immediate to Word

Z,C,N,V,S

2

 SUB

 Rd,Rr

PC + 1 ¬ PC

Rd ¬ Rd-Rr

Rd - Rr,結果放回Rd

Subtract without Carry

Z,C,N,V,S,H

1

 SUBI

 Rd,K

PC + 1 ¬ PC

Rd ¬ Rd-K

Rd - K,結果放回Rd

Subtract Immediate

Z,C,N,V,S,H

1

 SBC

 Rd,Rr

PC + 1 ¬ PC

Rd ¬ Rd-Rr-C

Rd - Rr - C(借位),結果放回Rd

Subtract with Carry

Z,C,N,V,H,S

1

 SBCI

 Rd,K

PC + 1 ¬ PC

Rd ¬ Rd-K-C

Rd - K - C(借位),結果放回Rd

Subtract Immediate with Carry

Z,C,N,V,H,S

1

 SBIW

 Rd,K

PC + 1 ¬ PC

(Rd +1:Rd) ¬ (Rd+1:Rd) - K

(Rd+1:Rd) - 常數(K),結果放回(Rd+1:Rd)

Subtract Immediate from Word

Z,C,N,V,S

2

 AND

 Rd,Rr

PC + 1 ¬ PC

Rd¬Rd ž Rr

Rd ž Rr,結果放回Rd

Logical AND

Z,N,V,S

 

 ANDI

 Rd,K

PC + 1 ¬ PC

Rd ¬ Rd ž K

Rd ž 常數(K),結果放回Rd

Logical AND with Immediate

Z,N,V,S

1

* TST

 Rd

PC + 1 ¬ PC

Rd¬Rd ž Rd

測試Rd是0或負數

Test for Zero or Minus

Z,N,V,S

1

* CBR

 Rd,K

PC + 1 ¬ PC

Rd ¬ Rd ž ($FFh-K)

Rd的位元清除為0

Clear Bit(s) in Register

Z,N,V,S

1

 OR

 Rd,Rr

PC + 1 ¬ PC

Rd ¬ Rd v Rr

Rd v Rr,結果放回Rd

Logical OR

Z,N,V,S

1

 ORI

 Rd,K

PC + 1 ¬ PC

Rd ¬ Rd v K

Rd v常數(K),結果放回Rd

Logical OR with Immediate

Z,N,V,S

1

* SBR

 Rd,K

PC + 1 ¬ PC

Rd ¬ Rd v K

Rd的位元設定為1

Set Bit(s) in Register

Z,N,V,S

1

 EOR

 Rd,Rr

PC + 1 ¬ PC

Rd ¬Rd Å Rr

Rd Å Rr,結果放回Rd

Exclusive OR

Z,N,V,S

1

* CLR

 Rd

PC + 1 ¬ PC

Rd ¬ Rd Å Rd

將Rd清為0

Clear Register

Z,N,V,S

1

 COM

 Rd

PC + 1 ¬ PC

Rd ¬ $FF-Rd

1的補數

One's Complement

Z,C,N,V,S

1

 NEG

 Rd

Rd ¬ $00-Rd

PC + 1 ¬ PC

2的補數

Two's Complement

Z,C,N,V,H,S

1

 SER

 Rd

Rd ¬ $FF

PC + 1 ¬ PC

Rd設定為1

Set Register

1

 INC

 Rd

PC + 1 ¬ PC

Rd ¬ Rd +1

Rd逐次加1

Increment

Z,N,V,S

1

 DEC

 Rd

PC + 1 ¬ PC

Rd ¬ Rd - 1

Rd逐次減1

Decrement

Z,N,V,S

1

 CP

 Rd,Rr

PC + 1 ¬ PC

Rd - Rr

Rd - Rr,比較大小

Compare

Z,C,N,V,H,S

1

 CPC

 Rd,Rr

PC + 1 ¬ PC

Rd - Rr - C

Rd - Rr - C(借位),比較大小

Compare with Carry

Z,C,N,V,H,S

1

 CPI

 Rd,K

PC + 1 ¬ PC

Rd - K

Rd - 常數(K),比較大小

Compare with Immediate

Z,C,N,V,H,S

1

 

 

 

 

 

指令的說明

  • 1. 算術和邏輯指令在運算後,運算的結果除了放入目的暫存器之外,並且還會影響位於I/O暫存器中的狀態暫存器 (Status Register) : 狀態暫存器一共有8種旗號, 運算後的結果,旗號會等於1或0, 供程式設計者作為判斷的依據; 例如ADD R2,R3運算後會影響的旗號有Z,C,N,V,S,H等

 

R2+R3運算後結果等於0,則Z flag=1; 運算後結果不等於0, 則Z flag=0;

 

運算的結果有進位, 則C flag=1, 運算的結果沒有進位則C flag=0

 

運算的結果是負數, 則N flag=1, 運算的結果是正數則N flag=0

 

運算的結果有溢位, 則V flag=1, 運算的結果沒有溢位, 則V=0

 

運算結果低4位元有進位, 則H flag=1, 運算結果低4位元沒有進位, 則H=0

 

 

 

  • 2. ADD, ADC, SUB, SBC, AND, OR, EOR是暫存器與暫存器之間的運算指令,這些指令可以使用在所有的32個暫存器R0 ~ R31, 而SUBI, SBCI, ANDI, ORI, EORI是暫存器與常數之間的運算指令, 則只限於使用在暫存器R16 ~ R31,例如 :

 

 

ADD      R2,R0

 

SUBI     R16,$30           ;$是表示16進位

 

 

  • 3. EOR除了可以做暫存器與暫存器之間的邏輯運算, 它的另一種用法是將暫存器本身清為0, 衍生同義的指令CLR Rd,例如 :

 

 

EOR      R7,R7

 

CLR       R7

 

 

  • 4. ANDI這個邏輯指令具有遮蓋--Mask的功能

 

例1.

 

ANDI    R17,$0F

 

將R17的低4位元保留, 高4位元Mask(成為0); 例如R17=01011010, 和$0F= 00001111作AND之後, 得到的結果是00001010

 

 

例2.

 

ANDI    R18,$10

 

將R18的第4位元保留, 其餘的位元Mask(成為0); 例如R18=10011001, 和$10 = 00010000作AND之後, 得到的結果是00010000

 

 

例3.

 

ANDI    R19,$AA

 

R19的奇數位元保留, 而偶數位元Mask (成為0); 例如R19=10101010,和$AA =10101010作AND之後, 得到的結果是10101010

 

 

  • 5. ADIW,SBIW是一組16 bits的暫存器與常數作加減運算(位於高位元的是Rd+1,位於低位元的是Rd; 例如R25:R24);這類的指令, 只限於使用在暫存器R24, R26, R28, R30; 例如 :

 

 

ADIW   R24,$12           ;R25:R24+$12, 然後把結果放回R25:R24

 

SBIW R30,$64           ;R31:R30-$64, 然後把結果放回R31: R30

 

 

6.   似乎少了ADI, ADCI這兩個指令? 如果需要暫存器與常數作加法運算的時候, 其實可以用SUBI, SBCI這兩個指令代替,例如 :

 

 

SUBI    R17,-$20

 

 

7.   CP, CPC, CPI比較的結果並不放回目的暫存器, 也不會改變任何暫存器的內容; 通常在比較指令的下一個指令是BRNE (Not Equal, 不相等就重新再來),例如 :

 

 

      L1: INC      R27            ;R27+1

 

CPI      R27,20             ;R27-20, 比較大小, CPI只限於R16~R31

 

           BRNE   L1               ;不相等回到L1, 相等 (R27=20) 則繼續下一行

              ....

 

 

 

 

 

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

ZEPPE

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