?
11.4??Thumb數(shù)據(jù)處理指令
數(shù)據(jù)處理指令是指那些操作寄存器中數(shù)據(jù)的指令。Thumb指令集中的數(shù)據(jù)處理指令是ARM指令集數(shù)據(jù)處理指令的一個子集,其中包括MOV指令、算術(shù)指令、移位指令、邏輯指令、比較指令和乘法指令。表11.3列出了Thumb數(shù)據(jù)處理指令。
表11.3 Thumb狀態(tài)數(shù)據(jù)處理指令
助??記??符 |
說????明 |
操????作 |
ADC??Rd,Rm |
帶進位的32位加 |
Rd:=Rd+Rm+C?flag |
ADD??Rd,Rn,Rm |
32位加 |
Rd:=Rn+Rm |
ADD??Rd,Rn,#0~#7 |
32位加 |
Rd:=Rn+3_bit_immed |
ADD??Rd,#0~#277 |
32位加 |
Rd:=Rn+8_bit_immed |
AND??Rd,Rm |
邏輯與 |
Rd:=Rd?AND?Rm |
ASR??Rd,Rm,#1~#32 |
算術(shù)右移 |
Rd:=Rm?ASR?5_bit_immed |
ASR??Rd,Rs |
算術(shù)右移 |
Rd:=Rm?ASR?Rs |
BIC??Rd,Rm |
位清零 |
Rd:=Rd?AND?NOT?Rm |
CMN??Rn,Rm |
32位取負比較 |
Rn+Rm?并設(shè)置標(biāo)志位 |
CMP??Rn,#0~#255 |
32位整數(shù)比較 |
Rn-8_bit_immed?并設(shè)置標(biāo)志位 |
CMP??Rn,Rm |
32位整數(shù)比較 |
Rn-Rm?并設(shè)置標(biāo)志位 |
EOR??Rd,Rm |
異或 |
Rd:=Rd?EOR?Rm |
LSL??Rd,Rm,#0~#31 |
邏輯左移 |
Rd:=Rm?LSL?5_bit_immed |
LSL??Rd,Rs |
邏輯左移 |
Rd:=Rd?LSL?Rs |
LSR??Rd,Rm,#1~#32 |
邏輯右移 |
Rd:=Rm?LSR?5_bit_immed |
LSR??Rd,Rs |
邏輯右移 |
Rd:=Rd?LSR?Rs |
MOV??Rd,#0~#255 |
將數(shù)據(jù)送入寄存器 |
Rd:=8_bit_immed |
MOV??Rd,Rn |
將數(shù)據(jù)送入寄存器 |
Rd:=Rn |
MUL??Rd,Rm |
乘 |
Rd:=Rm*Rd |
MVN??Rd,Rm |
將32位數(shù)的“反”送入寄存器 |
Rd:=NOT?Rm |
NEG??Rd,Rm |
求反 |
Rd:=0-Rm |
ORR??Rd,Rm |
邏輯或 |
Rd:=Rd?OR?Rm |
ROR??Rd,Rs |
邏輯右移 |
Rd:=Rd?ROR?Rs |
SBC??Rd,Rm |
帶進位減 |
Rd:=Rd-Rm-NOT(Carry?Flag) |
SUB??Rd,Rn,Rm |
減 |
Rd:=Rn-Rm |
SUB??Rd,Rn,#0~#7 |
減 |
Rd:=Rn-3_bit_immed |
SUB??Rd,#0~#255 |
減 |
Rd:=Rn-8_bit_immed |
TST??Rn,Rm |
位測試指令 |
Rn?AND?Rm?并更新標(biāo)志位 |
Thumb的數(shù)據(jù)處理指令與等價的ARM指令使用相同的格式。所有對r0~r7低8個寄存器操作的數(shù)據(jù)處理指令都更新條件標(biāo)志位,對r8~r14和PC高8個寄存器操作的指令除MOV指令外,其他指令均不改變條件標(biāo)志位。這些指令包括:
·??MOV??Rd,Rn
·??ADD??Rd,Rm
·??CMP??Rn,Rm
·??ADD??sp,#0~#508
·??SUB??sp,#0~#508
·??ADD??Rd,sp,#0~#1020
·??ADD??Rd,pc,#0~#1020
Thumb數(shù)據(jù)處理指令的基本語法格式分為以下8種。
①?<opcode1>??<Rd>,<Rn>,<Rm>
???<opcode1>:=ADD|SUB
②?<opcode2>??<Rd>,<Rn>,#<3_bit_immed>
???<opcode2>:=ADD|SUB
③?<opcode3>??<Rd>|<Rn>,#<8_bit_immed>
???<opcode3>:=ADD|SUB|MOV|CMP
④?<opcode4>??<Rd>,<Rm>,#<shift_immed>
???<opcode4>:=LSL|LSR|ASR
⑤?<opcode5>??<Rd>|<Rn>,<Rm>|<Rs>
???<opcode5>:=MVN|CMP|CMN|TST|ADC|SBC|NEG|MUL|LSL|LSR|ASR|ROR|AND|EOR|BIC
⑥?ADD??<Rd>,<reg>,#<8_bit_immed>
???<reg>:=SP|PC
⑦?<opcode6>??SP,SP,#<7_bit_immed>
???<opcode6>:=ADD|SUB
⑧?<opcode7>??<Rd>|<Rn>,<Rm>
???<opcode7>:=MOV|ADD|CMP
注意 |
上面的指令和語法格式中,3_bit_immed、7_bit_immed、8_bit_immed分別表示3位、7位、8位立即數(shù)。 |
?
下面詳細介紹各指令的語法和使用。
11.4.1??ADC指令
(1)編碼格式
帶進位的加法指令A(yù)DC的編碼格式如圖11.7所示。
圖11.7??ADC指令的編碼格式
帶進位的ADC指令和加法指令A(yù)DD配合使用可以實現(xiàn)多字相加(multi-word),詳見ARM指令集介紹。
(2)指令的語法格式
ADC??<Rd>,<Rm>
①?<Rd>
第一個操作數(shù)寄存器,并且是操作結(jié)果的目的寄存器。
②?<Rm>
第二操作數(shù)寄存器。
(3)指令操作的偽代碼
Rd?=?Rd+Rm+C?Flag
N?Flag?=?Rd[31]
Z?Flag?=?if?Rd==0?then?1?else?0
C?Flag?=?CarryFrom{Rd+Rm+C?Flag}
V?Flag?=?OverflowFrom{Rd+Rm+C?Flag}
(4)對應(yīng)的ARM指令
ADCS??<Rd>,<Rd>,<Rm>
11.4.2??小立即數(shù)加法指令A(yù)DD(1)
(1)編碼格式
立即數(shù)加法指令A(yù)DD(1)的編碼格式如圖11.8所示。
圖11.8??ADD(1)指令的編碼格式
ADD加法指令實現(xiàn)“小常數(shù)”的加法運算,并將相加的結(jié)果保存到指定的寄存器中。
(2)指令的語法格式
ADD??<Rd>,<Rn>,#<immed_3>
①?<Rd>
加法操作的目標(biāo)寄存器。
②?<Rn>
操作數(shù)寄存器。
③?#<immed_3>
3位的立即數(shù)。該立即數(shù)將和寄存器<Rn>的值相加,并將結(jié)果保存到<Rd>中。
(3)指令操作的偽代碼
Rd?=?Rn+immed_3
N?Flag?=?Rd[31]
Z?Flag?=?if?Rd==0?then?1?else?0
C?Flag?=?CarryFrom{Rn+?immed_3}
V?Flag?=?OverflowFrom{Rn+?immed_3}
(4)對應(yīng)的ARM指令
ADDS??<Rd>,<Rn>,#<immed_3>
11.4.3??大立即數(shù)加法指令A(yù)DD(2)
(1)編碼格式
立即數(shù)加法指令A(yù)DD(2)的編碼格式如圖11.9所示。
圖11.9??ADD(2)指令的編碼格式
此中形式的ADD(2)指令將一個大的立即數(shù)(8?bit)與指定寄存器的值相加,并將運算結(jié)果保存到此寄存器中。
(2)指令的語法格式
ADD??<Rd>,#<immed_8>
①?<Rd>
加法操作的目標(biāo)寄存器。
②?#<immed_8>
8位的立即數(shù)。該立即數(shù)將和寄存器<Rd>的值相加,并將結(jié)果保存到<Rd>中。
(3)指令操作的偽代碼
Rd?=?Rd+immed_8
N?Flag?=?Rd[31]
Z?Flag?=?if?Rd==0?then?1?else?0
C?Flag?=?CarryFrom{Rn+?immed_8}
V?Flag?=?OverflowFrom{Rn+?immed_8}
(4)對應(yīng)的ARM指令
ADDS??<Rd>,<Rd>,#<immed_8>
?
11.4.4??寄存器加法指令A(yù)DD(3)
(1)編碼格式
寄存器加法指令A(yù)DD(3)的編碼格式如圖11.10所示。
圖11.10??ADD(3)指令的編碼格式
此種形式的加法指令將兩個寄存器的值相加,將結(jié)果放入第三個目標(biāo)寄存器,并根據(jù)操作結(jié)果更新標(biāo)志位。
(2)指令的語法格式
ADD??<Rd>,<Rn>,<Rm>
①?<Rd>
加法操作的目標(biāo)寄存器。
②?<Rn>
操作數(shù)寄存器。存放加法操作的第一個操作數(shù)。
③?<Rm>
操作數(shù)寄存器。存放加法操作的第二個操作數(shù)。
(3)指令操作的偽代碼
Rd=Rn+Rm
N?Flag?=?Rd[31]
Z?Flag?=?if?Rd?=?=0?then?1?else?0
C?Flag?=?CarryFrom(Rn+Rm)
V?Flag?=?OverflowFrom(Rn+Rm)
11.4.5??寄存器加法指令A(yù)DD(4)
(1)編碼格式
寄存器加法指令A(yù)DD(4)的編碼格式如圖11.11所示。
圖11.11??ADD(4)指令的編碼格式
此種形式的加法指令將兩個寄存器的值相加,將結(jié)果放入第三個目標(biāo)寄存器。該指令不更新程序狀態(tài)字的標(biāo)志位。
注意 |
該指令與ADD(3)的區(qū)別在于其操作數(shù)寄存器。該指令的操作數(shù)寄存器為r8~r14和PC高寄存器。操作結(jié)果對程序狀態(tài)字的標(biāo)志位沒有影響。 |
(2)指令的語法格式
ADD??<Rd>,<Rm>
①?<Rd>
指令的操作數(shù)寄存器,其中保存加法操作的一個操作數(shù),并將指令的操作結(jié)果放入該寄存器。取值范圍為r0~r15。
②?<Rm>
操作數(shù)寄存器。存放加法操作的第二個操作數(shù)??梢詾閞0~r15的任意寄存器。
(3)指令操作的偽代碼
Rd?=?Rd+Rm
11.4.6??PC相關(guān)加法指令A(yù)DD(5)
(1)編碼格式
寄存器加法指令A(yù)DD(5)的編碼格式如圖11.12所示。
圖11.12??ADD(5)指令的編碼格式
該指令將一個立即數(shù)和PC值相加,并將PC相關(guān)地址寫入目標(biāo)寄存器。立即數(shù)可以是0~1020范圍內(nèi)的任意數(shù)值的4倍。該指令不更新程序狀態(tài)字的標(biāo)志位。
(2)指令的語法格式
ADD??<Rd>,PC,#<immed_8>×4
①?<Rd>
指令的目的寄存器,存放指令的操作結(jié)果。
②?PC
PC相關(guān)地址。
③?<immed_8>
加到PC值上的8位立即數(shù)。
(3)指令操作的偽代碼
Rd=(PC?AND?0xfffffffc)+(immed_8<<2)
?
11.4.7??SP相關(guān)加法指令A(yù)DD(6)
(1)編碼格式
寄存器加法指令A(yù)DD(6)的編碼格式如圖11.13所示。
圖11.13??ADD(6)指令的編碼格式
該指令將一個立即數(shù)和SP值相加,并將SP相關(guān)地址寫入目標(biāo)寄存器。立即數(shù)可以是0~1020范圍內(nèi)的任意4的倍數(shù)。該指令不更新程序狀態(tài)字的標(biāo)志位。
(2)指令的語法格式
ADD??<Rd>,SP,#<immed_8>×4
①?<Rd>
指令的目的寄存器,存放指令的操作結(jié)果。
②?SP
SP相關(guān)地址。
③?<immed_8>
該立即數(shù)的4倍將與SP值相加。
(3)指令操作的偽代碼
Rd=SP+(immed_8<<2)
11.4.8??SP相關(guān)加法指令A(yù)DD(7)
(1)編碼格式
寄存器加法指令A(yù)DD(6)的編碼格式如圖11.14所示。
該指令將一個立即數(shù)和SP值相加,并將SP相關(guān)地址寫回SP寄存器。立即數(shù)可以是0~508范圍內(nèi)的任意數(shù)值的4倍。該指令不更新程序狀態(tài)字的標(biāo)志位。
圖11.14??ADD(7)指令的編碼格式
(2)指令的語法格式
ADD??SP,#<immed_7>×4
①?SP
SP相關(guān)地址,同時也為指令的目標(biāo)寄存器。
②?<immed_7>
指定的7位立即數(shù),該立即數(shù)的4倍將與SP值相加。
11.4.9??邏輯與指令A(yù)ND
(1)編碼格式
邏輯與指令A(yù)ND的編碼格式如圖11.15所示。
圖11.15??AND指令的編碼格式
AND指令實現(xiàn)兩個寄存器值的按位“與”操作。程序狀態(tài)字的標(biāo)志位根據(jù)指令的執(zhí)行結(jié)果更新。
(2)指令的語法格式
AND??<Rd>,<Rm>
①?<Rd>
操作數(shù)寄存器,包含指令的第一個操作數(shù)。同時也為指令操作結(jié)果的目的寄存器。
②?<Rm>
操作數(shù)寄存器,保護指令的第二個操作數(shù)。
(3)指令操作的偽代碼
Rd?=?Rd?AND?Rm
N?Flag?=?Rd[31]
Z?Flag?=?if?Rd?=?=?0?then?1?else?0
C?Flag?=?unaffected
V?Flag?=?unaffected
(4)對應(yīng)的ARM指令
ANDS??<Rd>,<Rd>,<Rm>
?
11.4.10??算術(shù)右移指令A(yù)SR(1)
(1)編碼格式
算術(shù)右移指令A(yù)SR(1)的編碼格式如圖11.16所示。
圖11.16??ASR(1)指令的編碼格式
這種形式的算術(shù)右移指令可以方便的實現(xiàn)將一個寄存器的值除以一個常數(shù)。該常數(shù)是以2為底的冪。
(2)指令的語法格式
ASR??<Rd>,<Rm>,#<immed_5>
①?<Rd>
目的寄存器。用于存放指令操作的結(jié)果。
②?<Rm>
操作數(shù)寄存器。存放將要被右移的數(shù)據(jù)。
③?<immed_5>
指定右移的位數(shù)。該常數(shù)取值范圍為1~31。
(3)指令操作的偽代碼
If??immed_5?==?0
??????C?Flag?=?Rm[31]
??????If?Rm[31]?=?=0?then
???????????Rd?=?0
??????Else?/*Rm[31]?=?=1*/
???????????Rd?=?0xffffffff
Else?/*immed_5?>?0*/
??????C?Flag?=?Rm[immed_5-1]
??????Rd?=?Rm?Arithmetic_shift_Right?immed_5
N?Flag?=?Rd[31]
Z?Flag?=?if?Rd?=?=0?then?1?else?0
V?Flag?=?unaffected
(4)對應(yīng)的ARM指令
MOVS??<Rd>,<Rm>,ASR#<immed_5>
注意 |
在ARMv5以前的體系結(jié)構(gòu)版本中,沒有單獨的Thumb移位指令。在ARMv6版本中已經(jīng)增加了位移指令,詳細信息請參加ARM體系結(jié)構(gòu)相關(guān)文檔。 |
?
11.4.11??算術(shù)右移指令A(yù)SR(2)
(1)編碼格式
算術(shù)右移指令A(yù)SR(2)的編碼格式如圖11.17所示。
圖11.17??ASR(2)指令的編碼格式
此種形式的ASR指令的操作數(shù)均為寄存器。該指令根據(jù)指令的操作結(jié)果更新程序狀態(tài)字的標(biāo)志位。
(2)指令的語法格式
ASR??<Rd>,<Rs>
①?<Rd>
存放指令的操作數(shù)和操作結(jié)果。
②?<Rs>
指定操作數(shù)將要被移動的位數(shù)。
(3)指令操作的偽代碼
If??Rs[7:0]?=?=?0?then
?????C?Flag?=?unaffected
?????Rd?=?unaffected
Else?if?Rs[7:0]?<?32?then
?????C?Flag?=?Rd[Rs[7:0]?-?1]
?????Rd?=?Rd?arithmetic_shift_Right?Rs[7:0]
Else?/*Rs[7:0]?>=?32*/
?????C?Flag?=?Rd[31]
?????If?Rd[31]?=?=?0?then
??????????Rd?=?0
?????Else?/*Rd[31]?=?=?1*/
??????????Rd?=?0xffffffff
N?Flag?=?Rd[31]
Z?Flag?=?if?Rd?=?=?0?then?1?else?0
V?Flag?=?unaffected
(4)對應(yīng)的ARM指令
MOVS??<Rd>,<Rd>,ASR<Rs>
11.4.12??位清零指令BIC
(1)編碼格式
位清零指令BIC的編碼格式如圖11.18所示。
圖11.18??BIC指令的編碼格式
BIC指令將兩個寄存器的值按位做“異或”操作。該指令根據(jù)指令的執(zhí)行結(jié)果更新程序狀態(tài)字的標(biāo)志位。
(2)指令的語法格式
BIC??<Rd>,<Rm>
①?<Rd>
存放指令的操作數(shù)和操作結(jié)果。
②?<Rm>
操作數(shù)寄存器,該寄存器中的數(shù)據(jù)的反碼將會和<Rd>中的值做“與”操作。
(3)指令操作的偽代碼
Rd?=?Rd?AND?NOT?Rm
N?Flag?=?Rd[31]
Z?Flag?=?if?Rd?=?=?0?then?1?else?0
C?Flag?=?unaffected
V?Flag?=?unaffected
(4)對應(yīng)的ARM指令
BICS??<Rd>,<Rd>,<Rm>
?
11.4.13??比較指令CMN
(1)編碼格式
比較指令CMN的編碼格式如圖11.19所示。
圖11.19??CMN指令的編碼格式
比較指令CMN將一個寄存器的值和另一個寄存器的值取負做比較,并根據(jù)比較結(jié)果更新程序狀態(tài)字的標(biāo)志位。程序中比較指令后通常跟條件執(zhí)行指令。
(2)指令的語法格式
CMN??<Rn>,<Rm>
①?<Rn>
操作數(shù)寄存器。用于存放指令的第一個操作數(shù)。
②?<Rm>
操作數(shù)寄存器。用于存放指令的第二個操作數(shù)。
(3)指令操作的偽代碼
Alu_out?=?Rn?+?Rm
N?Flag?=?alu_out[31]
Z?Flag?=?if?alu_out?=?=?0?then?1?else?0?
C?Flag?=?NOT?BorrowFrom(Rn?+?Rm)
V?Flag?=?OverflowFrom(Rn+Rm)
(4)對應(yīng)的ARM指令
CMN??<Rn>,<Rm>
11.4.14??比較指令CMP(1)
(1)編碼格式
比較指令CMP(1)的編碼格式如圖11.20所示。
圖11.20??CMP(1)指令的編碼格式
比較指令CMP(1)將一個寄存器的值和8位立即數(shù)做比較,并根據(jù)比較結(jié)果更新程序狀態(tài)字的標(biāo)志位。程序中比較指令后通常跟條件執(zhí)行指令。
(2)指令的語法格式
CMP??<Rn>,#<immed_8>
①?<Rn>
操作數(shù)寄存器。
②?<immed_8>
8位常數(shù)。將與寄存器<Rn>的值做比較。
(3)指令操作的偽代碼
Alu_out?=?Rn?–?immed_8
N?Flag?=?alu_out[31]
Z?Flag?=?if?alu_out?==?0?then?1?else?0
C?Flag?=?NOT?BorrowFrom(Rn?–?immed_8)
V?Flag?=?OverflowFrom(Rn?–?immed_8)
(4)對應(yīng)的ARM指令
CMP??<Rn>,#<immed_8>
11.4.15??比較指令CMP(2)
(1)編碼格式
比較指令CMP(2)的編碼格式如圖11.21所示。
圖11.21??CMP(2)指令的編碼格式
比較指令CMP(2)將兩個寄存器的值做比較,并根據(jù)比較結(jié)果更新程序狀態(tài)字的標(biāo)志位。程序中比較指令后通常跟條件執(zhí)行指令。
(2)指令的語法格式
CMP??<Rn>,<Rm>
①?<Rn>
操作數(shù)寄存器,存放比較的第一個操作數(shù)。
②?<Rm>
操作數(shù)寄存器,存放比較的第二個操作數(shù)。
(3)指令操作的偽代碼
alu_out?=?Rn?–?Rm
N?Flag?=?alu_out[31]
Z?Flag?=?if?alu_out?=?=?0?then?1?else?0
C?Flag?=?NOT?BorrowFrom(Rn?-?Rm)
V?Flag?=?OverflowFrom(Rn?-?Rm)
(4)對應(yīng)的ARM指令
CMP??<Rn>,<Rm>
?
11.4.16??比較指令CMP(3)
(1)編碼格式
比較指令CMP(3)的編碼格式如圖11.22所示。
圖11.22??CMP(3)指令的編碼格式
比較指令CMP(3)將兩個寄存器的值做比較,其中一個寄存器為r8~r14或PC寄存器高16位。并根據(jù)比較結(jié)果更新程序狀態(tài)寄存器的標(biāo)志位。程序中比較指令后通常跟條件執(zhí)行指令,實現(xiàn)指令的分支跳轉(zhuǎn)。
(2)指令的語法格式
CMP??<Rn>,<Rm>
①?<Rn>
操作數(shù)寄存器。保存將要進行比較的第一個操作數(shù),其取值可以為r0~r15的任意寄存器。
②?<Rm>
操作數(shù)寄存器。保存將要進行比較的第二個操作數(shù),其取值可以為r0~r15的任意寄存器。
(3)指令操作的偽代碼
alu_out?=?Rn?–?Rm
N?Flag?=?alu_out[31]
Z?Flag?=?if?alu_out?=?=?0?then?1?else?0
C?Flag?=?NOT?BorrowFrom(Rn?-?Rm)
V?Flag?=?OverflowFrom?(Rn?-?Rm)
注意 |
指令操作數(shù)寄存器<Rn>和<Rm>中,至少有一個寄存器為r8~r14或PC寄存器的高16位,否則,指令的執(zhí)行結(jié)果不可預(yù)知。 |
(4)對應(yīng)的ARM指令
CMP??<Rn>,<Rm>
11.4.17??異或指令EOR
(1)編碼格式
比較指令EOR的編碼格式如圖11.23所示。
圖11.23??EOR指令的編碼格式
EOR指令將兩個寄存器中的數(shù)值按位執(zhí)行“異或”操作,并根據(jù)指令的執(zhí)行結(jié)果更新程序狀態(tài)寄存器的標(biāo)志位。
(2)指令的語法格式
EOR??<Rn>,<Rm>
①?<Rn>
操作數(shù)寄存器。同時保存指令的第一個操作數(shù)和指令的執(zhí)行結(jié)果。
②?<Rm>
操作數(shù)寄存器。保存將要進行比較的第二個操作數(shù)。
(3)指令操作的偽代碼
Rd?=?Rd?OR?Rm
N?Flag?=?Rd[31]
Z?Flag?=?if?Rd?=?=?0?then?1?else?0
C?Flag?=?unaffected
V?Flag?=?unaffected
(4)對應(yīng)的ARM指令
EORS??<Rd>,<Rd>,<Rm>
11.4.18??邏輯左移指令LSL(1)
(1)編碼格式
邏輯左移指令LSL(1)的編碼格式如圖11.24所示。
圖11.24??LSL(1)指令的編碼格式
邏輯左移指令LSL(1)可以實現(xiàn)以2為底的冪的乘法。進行移位后空出的位添0。
(2)指令的語法格式
LSL??<Rd>,<Rm>,#<immed_5>
①?<Rd>
目的寄存器。存儲指令的操作結(jié)果。
②?<Rm>
操作數(shù)寄存器。該寄存器保存的數(shù)據(jù)將進行左移操作。
③?<immed_5>
邏輯左移位數(shù),范圍為0~31。
(3)指令操作的偽代碼
if??immed_5?=?=?0
??????C?Flag?=?unaffected
??????Rd?=?Rm
Else??/*immed_5?>?0*/
??????C?Flag?=Rm[32?–?immed_5]
??????Rd?=?Rm?logical_shift_left?immed_5
N?Flag?=?Rd[31]
Z?Flag?=?if?Rd?=?=?0?then?1?else?0
V?Flag?=?unaffected
(4)對應(yīng)的ARM指令
MOVS??<Rd>,<Rm>,LSL#<immed_5>
?
11.4.19??邏輯左移指令LSL(2)
(1)編碼格式
邏輯左移指令LSL(2)的編碼格式如圖11.25所示。
圖11.25??LSL(2)指令的編碼格式
邏輯左移指令LSL(2)可以實現(xiàn)以2為底的冪的乘法。進行移位后空出的位添0并根據(jù)指令的操作結(jié)果更新程序狀態(tài)寄存器的標(biāo)志位。
(2)指令的語法格式
LSL??<Rd>,<Rs>
①?<Rd>
操作數(shù)寄存器,包含被移位的值并保存指令的執(zhí)行結(jié)果。
②?<Rs>
包含邏輯左移位數(shù)的寄存器。
(3)指令操作的偽代碼
if??Rs[7:0]?=?=?0
?????C?Flag?=?unaffected
?????Rd?=?unaffected
Else??if??Rs[7:0]?<?32?then
?????C?Flag?=?Rd[32?–?Rs[7:0]]
?????Rd?=?Rd?logical_shift_left??Rs[7:0]
Else??if??Rs[7:0]?=?=?32?then
?????C?Flag?=?Rd[0]
?????Rd?=?0
Else??if??Rs[7:0]?=?=?32?then
?????C?Flag?=?Rd[0]
?????Rd?=?0
Else??/*Rs[7:0]?>?32*/
?????C?Flag?=?0
?????Rd?=?0
N?Flag?=?Rd[31]
Z?Flag?=?if?Rd?=?=?0?then?1?else?0
V?Flag?=?unaffected
(4)對應(yīng)的ARM指令
MOVS??<Rd>,<Rd>,LSL<Rs>
11.4.20??邏輯右移指令LSR(1)
(1)編碼格式
邏輯左移指令LSR(1)的編碼格式如圖11.26所示。
圖11.26??LSR(1)指令的編碼格式
邏輯右移指令LSR(1)可以實現(xiàn)以2為底的冪做除數(shù)的除法。進行移位后空出的位添0,并根據(jù)指令的執(zhí)行結(jié)果更新程序狀態(tài)寄存器的標(biāo)志位。
(2)指令的語法格式
LSR??<Rd>,<Rm>,#<immed_5>
①?<Rd>
目的寄存器。存儲指令的操作結(jié)果。
②?<Rm>
操作數(shù)寄存器。該寄存器保存的數(shù)據(jù)將進行右移操作。
③?<immed_5>
邏輯右移位數(shù),范圍為0~31。
(3)指令操作的偽代碼
if??immed_5?=?=?0
??????C?Flag?=?Rd[31]
??????Rd?=?0
Else?/*immed_5>0*/
??????C?Flag?=?Rd[immed_5?-?1]
??????Rd?=?Rm?Logial_shift_right?immed_5
N?Flag?=?Rd[31]
Z?Flag?=?if?Rd?=?=?0?then?1?else?0
V?Flag?=?unaffected
(4)對應(yīng)的ARM指令
MOVS??<Rd>,<Rm>,LSR#<immed_5>
11.4.21??邏輯右移指令LSR(2)
(1)編碼格式
邏輯左移指令LSR(2)的編碼格式如圖11.27所示。
圖11.27??LSR(2)指令的編碼格式
邏輯右移指令LSR(2)可以實現(xiàn)以2為底的冪做除數(shù)的無符號除法。進行移位后空出的位添0,并根據(jù)指令的操作結(jié)果更新程序狀態(tài)寄存器的標(biāo)志位。
(2)指令的語法格式
LSR??<Rd>,<Rs>
①?<Rd>
操作數(shù)寄存器,包含被移位的值并保存指令的執(zhí)行結(jié)果。
②?<Rs>
包含邏輯右移位數(shù)的寄存器。
(3)指令操作的偽代碼
if??Rs[7:0]?=?=?0
?????C?Flag?=?unaffected
?????Rd?=?unaffected
Else??if??Rs[7:0]?<?32?then
?????C?Flag?=?Rd[Rs[7:0]?-?1]
?????Rd?=?Rd?logical_shift_Right??Rs[7:0]
Else??if??Rs[7:0]?=?=?32?then
?????C?Flag?=?Rd[31]
?????Rd?=?0
Else??if??Rs[7:0]?=?=?32?then
?????C?Flag?=?Rd[0]
?????Rd?=?0
Else??/*Rs[7:0]?>?32*/
?????C?Flag?=?0
?????Rd?=?0
N?Flag?=?Rd[31]
Z?Flag?=?if?Rd?=?=?0?then?1?else?0
V?Flag?=?unaffected
(4)對應(yīng)的ARM指令
MOVS??<Rd>,<Rd>,LSR<Rs>
?
11.4.22??移位指令MOV(1)
(1)編碼格式
數(shù)據(jù)傳送指令MOV(1)的編碼格式如圖11.28所示。
圖11.28??MOV(1)指令的編碼格式
(2)指令的語法格式
MOV??<Rd>,#<immed_8>
①?<Rd>
目的寄存器。存放指令的執(zhí)行結(jié)果。
②?<immed_8>
8位立即數(shù)。指示要移入寄存器的數(shù)據(jù)。
(3)指令操作的偽代碼
Rd?=?immed_8
N?Flag?=?Rd[31]
Z?Flag?=?if?Rd?=?=?0?then?1?else?0
C?Flag?=?unaffected
V?Flag?=?unaffected
(4)對應(yīng)的ARM指令
MOVS??<Rd>,#<immed_8>
11.4.23??移位指令MOV(2)
(1)編碼格式
數(shù)據(jù)傳送指令MOV(2)的編碼格式如圖11.29所示。
圖11.29??MOV(2)指令的編碼格式
此種形式的MOV指令用于數(shù)據(jù)在r0~r7低寄存器間傳送,并根據(jù)的指令的執(zhí)行結(jié)果更新程序狀態(tài)寄存器的標(biāo)志位。
注意 |
從指令的編碼形式可以看出,MOV(2)指令被作為ADD??Rd,Rn,#0指令來編譯。 |
(2)指令的語法格式
MOV??<Rd>,<Rn>
①?<Rd>
目的寄存器。存放指令的執(zhí)行結(jié)果。
②?<Rn>
源寄存器。用于存放被傳送的數(shù)據(jù)。
(3)指令操作的偽代碼
Rd?=?Rn
N?Flag?=?Rd[31]
Z?Flag?=?if?Rd?=?=?0?then?1?else?0
C?Flag?=?0
V?Flag?=?0
(4)對應(yīng)的ARM指令
ADD??<Rd>,<Rn>,#0
11.4.24??移位指令MOV(3)
(1)編碼格式
數(shù)據(jù)傳送指令MOV(3)的編碼格式如圖11.30所示。
圖11.30??MOV(3)指令的編碼格式
此種形式的MOV指令用于在r8~r14和PC寄存器的高16位內(nèi)傳送數(shù)據(jù)。與MOV(2)指令不同,該指令不影響程序狀態(tài)寄存器。
(2)指令的語法格式
MOV??<Rd>,<Rm>
①?<Rd>
目的寄存器??梢允莚0~r15中的任意寄存器,用于存放指令的執(zhí)行結(jié)果。
②?<Rm>
源寄存器??梢允莚0~r15中的任意寄存器,用于存放被傳輸?shù)臄?shù)據(jù)。
(3)指令操作的偽代碼
Rd?=?Rm
(4)指令的使用
可以使用此種形式的MOV指令MOV??PC,r14用于子程序的返回(返回的程序是Thumb子程序)。它和BX指令的區(qū)別在于BX指令可以用于ARM和Thumb程序間的相互調(diào)用。
注意 |
如果目的寄存器<Rd>和源寄存器<Rm>同時為r0~r7低寄存器,則指令的執(zhí)行結(jié)果不可預(yù)知。 |
(5)對應(yīng)的ARM指令
MOV??<Rd>,<Rm>
?
11.4.25??乘法指令MUL
(1)編碼格式
乘法指令MUL的編碼格式如圖11.31所示。
圖11.31??MUL指令的編碼格式
MUL指令實現(xiàn)兩個數(shù)(可以為無符號數(shù),也可以為有符號數(shù))的乘積,并將指令的執(zhí)行結(jié)果存放到一個32位的寄存器中,同時可以根據(jù)運算結(jié)果設(shè)置CPSR寄存器中相應(yīng)的條件標(biāo)志位。
(2)指令的語法格式
MUL??<Rd>,<Rm>
①?<Rd>
目的寄存器,存放乘法操作的第一個乘數(shù)。
②?<Rm>
第二個乘數(shù)所在寄存器。
(3)指令操作的偽代碼
Rd?=?(Rm?*?Rd)[31:0]
N?Flag?=?Rd[31]
Z?Flag?=?if?Rd?=?=?0?then?1?else?0
C?Flag?=?unaffected
V?Flag?=?unaffected
注意 |
如果乘法指令MUL的源和目的寄存器使用相同的寄存器,則指令的執(zhí)行結(jié)果不可預(yù)知;對于有符號數(shù)和無符號數(shù),指令的操作結(jié)果是一樣的。 |
(4)對應(yīng)的ARM指令
MULS??<Rd>,<Rm>,<Rd>
11.4.26??傳送指令MVN
(1)編碼格式
傳送指令MVN的編碼格式如圖11.32所示。
圖11.32??MVN指令的編碼格式
MVN指令將一個數(shù)的反碼傳送到目標(biāo)寄存器,并根據(jù)指令的執(zhí)行結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。
(2)指令的語法格式
MVN??<Rd>,<Rm>
①?<Rd>
目的寄存器,存放指令的操作結(jié)果。
②?<Rm>
源寄存器,存放要傳送反碼的數(shù)據(jù)。
(3)指令操作的偽代碼
Rd?=?NOT?Rm
N?Flag?=?Rd[31]
Z?Flag?=?if?Rd?=?=?0?then?1?else?0
C?Flag?=?unaffected
V?Flag?=?unaffected
(4)對應(yīng)的ARM指令
MVNS??<Rd>,<Rm>
11.4.27??取反指令NEG
(1)編碼格式
取反指令NEG的編碼格式如圖11.33所示。
圖11.33??NEG指令的編碼格式
NEG取反指令將一個寄存器的值取反存入另一個寄存器。同時根據(jù)指令的操作結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。
(2)指令的語法格式
NEG??<Rd>,<Rm>
①?<Rd>
目的寄存器,存放指令的操作結(jié)果。
②?<Rm>
源寄存器,包含將要被取反的數(shù)據(jù)。
(3)指令操作的偽代碼
Rd?=?0?–?Rm
N?Flag?=?Rd[31]
Z?Flag?=?if?Rd?=?=?0?then?1?else?0
C?Flag?=?NOT?BorrowFrom(0?-?Rm)
V?Flag?=?OverflowFrom(0?-?Rm)
(4)對應(yīng)的ARM指令
RSBS??<Rd>,<Rm>,#0
?
11.4.28??邏輯或指令ORR
(1)編碼格式
邏輯或指令ORR的編碼格式如圖11.34所示。
圖11.34??ORR指令的編碼格式
ORR指令將兩個寄存器的值做按位做或運算,并根據(jù)指令的執(zhí)行結(jié)果更新程序狀態(tài)寄存器的標(biāo)志位。
(2)指令的語法格式
ORR??<Rd>,<Rm>
①?<Rd>
目的寄存器,存放指令的操作結(jié)果,存放做邏輯或運算的其中一個操作數(shù)。
②?<Rm>
存放做邏輯或運算的另一個操作數(shù)。
(3)指令操作的偽代碼
Rd?=?Rd?OR?Rm
N?Flag?=?Rd[31]
Z?Flag?=?if?Rd?=?=?0?then?1?else?0
C?Flag?=?unaffected
V?Flag?=?unaffected
(4)對應(yīng)的ARM指令
ORRS??<Rd>,<Rd>,<Rm>
11.4.29??循環(huán)右移指令ROR
(1)編碼格式
循環(huán)右移指令ROR的編碼格式如圖11.35所示。
圖11.35??ROR指令的編碼格式
ROR指令將一個給定寄存器的值循環(huán)右移一定的位數(shù)。并根據(jù)指令的操作結(jié)果更新狀態(tài)寄存器的條件標(biāo)志位。詳見指令操作偽代碼。
(2)指令的語法格式
ROR??<Rd>,<Rs>
①?<Rd>
目的寄存器。存儲指令的操作結(jié)果和被移位的數(shù)值。
②?<Rs>
循環(huán)左移的位數(shù)。
(3)指令操作的偽代碼
if??Rs[7:0]?=?=?0?then
?????C?Flag?=?unaffected
?????Rd?=?unaffected
Else?if?Rs[4:0]?=?=?0?then
?????C?Flag?=?Rd[31]
?????Rd?=?unaffected
Else?/*Rs[4:0]?>?0?*/
?????C?Flag?=?Rd[Rs[4:0]-?1?]
?????Rd?=?Rd?Rotate_Right?Rs[4:0]
N?Flag?=?Rd[31]
Z?Flag?=?if?Rd?=?=?0?then?1?else?0
V?Flag?=?unaffected
(4)對應(yīng)的ARM指令
MOVS??<Rd>,<Rd>,ROR<Rs>
11.4.30??帶進位的減指令SBC
(1)編碼格式
帶進位的減指令SBC的編碼格式如圖11.36所示。
圖11.36??SBC指令的編碼格式
SBC指令從指定寄存器中減去另一個寄存器的數(shù)值,再減去寄存器CPSR中C條件標(biāo)志位的反碼,并把結(jié)果保存到目標(biāo)寄存器中,同時根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。
(2)指令的語法格式
SBC??<Rd>,<Rm>
①?<Rd>
被減數(shù)寄存器,同時保存指令的操作結(jié)果。
②?<Rm>
減數(shù)寄存器,保存減法操作的減數(shù)。
(3)指令操作的偽代碼
Rd?=?Rd?–?Rm?–?NOT(C?Flag)
N?Flag?=?Rd[31]
Z?Flag?=?if?Rd?=?=?0?then?1?else?0?
C?Flag?=?NOT?BorrowFrom(Rd?–?Rm?–?NOT(C?Flag))
V?Flag?=?Overflow?From(Rd?–?Rm?–?NOT(C?Flag))
(4)對應(yīng)的ARM指令
SBCS??<Rd>,<Rd>,<Rm>
?
11.4.31??減法指令SUB(1)
(1)編碼格式
減法指令SUB(1)的編碼格式如圖11.37所示。
圖11.37??SUB(1)指令的編碼格式
SUB(1)指令從指定寄存器減去3位立即數(shù)(取值范圍為0~8),并把指令的操作結(jié)果保存到寄存器,同時根據(jù)結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。
(2)指令的語法格式
SUB??<Rd>,<Rn>,#<immed_3>
①?<Rd>
目的寄存器,存放指令的操作結(jié)果。
②?<Rn>
被減數(shù)寄存器,包含減法操作的被減數(shù)。
③?<immed_3>
作為減數(shù)的立即數(shù),該立即數(shù)的取值范圍為0~8。
(3)指令操作的偽代碼
Rd?=?Rn?–?immed_3
N?Flag?=?Rd[31]
Z?Flag?=?if?Rd?=?=?0?then?1?else?0
C?Flag?=?NOT?BorrowFrom?(Rn?–?immed_3)
V?Flag?=?OverflowFrom(Rn?–?immed_3)
(4)對應(yīng)的ARM指令
SUBS??<Rd>,<Rn>,#<immed_3>
11.4.32??減法指令SUB(2)
(1)編碼格式
減法指令SUB(2)的編碼格式如圖11.38所示。
SUB(2)指令從指定寄存器減去8位立即數(shù)(即,取值范圍為0~256),并把指令的操作結(jié)果保存到寄存器,同時根據(jù)結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。
圖11.38??SUB(2)指令的編碼格式
(2)指令的語法格式
SUB??<Rd>,#<immed_8>
①?<Rd>
第一個源操作數(shù)所在的寄存器,存放減法操作的被減數(shù),同時將減法操作的執(zhí)行結(jié)果保存到該寄存器。
②?<immed_8>
8位立即數(shù),即減法操作的減數(shù),取值范圍為0~255。
(3)指令操作的偽代碼
Rd?=?Rd?–?immed_8
N?Flag?=?Rd[31]
Z?Flag?=?if?Rd?=?=?0?then?1?else?0
C?Flag?=?NOT?BorrowFrom?(Rn?–?immed_8)
V?Flag?=?OverflowFrom(Rn?–?immed_8)
(4)對應(yīng)的ARM指令
SUBS??<Rd>,<Rd>,#<immed_8>
11.4.33??減法指令SUB(3)
(1)編碼格式
減法指令SUB(3)的編碼格式如圖11.39所示。
圖11.39??SUB(3)指令的編碼格式
SUB(3)指令將指定寄存器的值和另一個寄存器表示的值做減法運算,并根據(jù)指令的操作結(jié)果更新狀態(tài)寄存器的標(biāo)志位。
(2)指令的語法格式
SUB??<Rd>,<Rn>,<Rm>
①?<Rd>
目的寄存器,存放指令操作的結(jié)果。
②?<Rn>
源寄存器,存放第一個操作數(shù),即減法運算的被減數(shù)。
③?<Rm>
源寄存器,存放第二個操作數(shù),即減法運算的減數(shù)。
(3)指令操作的偽代碼
Rd?=?Rd?–?Rm
N?Flag?=?Rd[31]
Z?Flag?=?if?Rd?=?=?0?then?1?else?0
C?Flag?=?NOT?BorrowFrom?(Rn?–Rm)
V?Flag?=?OverflowFrom(Rn?–?Rm)
(4)對應(yīng)的ARM指令
SUBS??<Rd>,<Rn>,<Rm>
?
11.4.34??減法指令SUB(4)
(1)編碼格式
減法指令SUB(4)的編碼格式如圖11.40所示。
圖11.40??SUB(4)指令的編碼格式
SUB(4)指令從堆棧指針SP中減去7位立即數(shù)的4倍,也就是說其取值為在0~508范圍內(nèi)4的倍數(shù)。
(2)指令的語法格式
SUB??SP,#<immed_7>×4
①?SP
程序的堆棧指針,同時也為指令的目的寄存器,存放指令的運算結(jié)果。
②?<immed_7>
7位立即數(shù),其值的4倍將作為減數(shù)參加運算。
(3)指令操作的偽代碼
SP?=?SP?–?(immed_7?<<?2)
注意 |
在Thumb指令集中,使用滿遞減堆棧,該指令常被用于元素的入棧操作。 |
(4)對應(yīng)的ARM指令
SUB??SP,SP,#<immed_7>*4
11.4.35??位測試指令TST
(1)編碼格式
位測試指令TST的編碼格式如圖11.41所示。
圖11.41??TST指令的編碼格式
TST指令將兩個寄存器的值按位做邏輯與操作,并根據(jù)指令的執(zhí)行結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。TST指令常被用于測試寄存器中某一位是否置位。
(2)指令的語法格式
TST??<Rn>,<Rm>
①?<Rn>
操作數(shù)寄存器,用于存放指令的第一個操作數(shù)。
②?<Rm>
操作寄存器,該寄存器中的值將和<Rn>寄存器中的值做邏輯與操作。
(3)指令操作的偽代碼
alu_out?=?Rn?AND?Rm
N?Flag?=?alu_out[31]
Z?Flag?=?if?alu_out?=?=?0?then?1?else?0
C?Flag?=?unaffected
V?Flag?=?unaffected
(4)對應(yīng)的ARM指令
TST??<Rn>,<Rm>
11.4.36??Thumb指令集中數(shù)據(jù)操作指令舉例
下面的例子程序綜合使用了各種數(shù)據(jù)操作指令,通過該例可以對Thumb狀態(tài)下數(shù)據(jù)操作指令有更深入的了解。
ADD??r0,r4,r7 ;r0?=?r4?+?r7
SUB??r6,r1,r2 ;r6?=?r1?–?r2
ADD??r0,#255 ;r0?=?r0?+?255
ADD??r1,r4,#4 ;r1?=?r4?+?4
NEG??r3,r1 ;r3?=?0?–?r1
ADD??r2,r5 ;r2?=?r2?AND?r5
EOR??r1,r6 ;r1?=?r1?EOR?r6
CMP??r2,r3 ;r2?–?r3?,并更新CPSR
CMP??r7,#100 ;r7?–?100?,并更新CPSR
MOV??r0,#200 ;r0?=?200