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) 則繼續下一行
....
