加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 11.4  Thumb數(shù)據(jù)處理指令
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

Thumb指令集之:Thumb數(shù)據(jù)處理指令

2013/09/30
1
閱讀需 56 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

?

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

Arm

Arm

ARM公司是一家知識產(chǎn)權(quán)(IP)供應(yīng)商,主要為國際上其他的電子公司提供高性能RISC處理器、外設(shè)和系統(tǒng)芯片技術(shù)授權(quán)。目前,ARM公司的處理器內(nèi)核已經(jīng)成為便攜通訊、手持計算設(shè)備、多媒體數(shù)字消費品等方案的RISC標(biāo)準(zhǔn)。公司1990年11月由Acorn、Apple和VLSI合并而成。

ARM公司是一家知識產(chǎn)權(quán)(IP)供應(yīng)商,主要為國際上其他的電子公司提供高性能RISC處理器、外設(shè)和系統(tǒng)芯片技術(shù)授權(quán)。目前,ARM公司的處理器內(nèi)核已經(jīng)成為便攜通訊、手持計算設(shè)備、多媒體數(shù)字消費品等方案的RISC標(biāo)準(zhǔn)。公司1990年11月由Acorn、Apple和VLSI合并而成。收起

查看更多

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

華清遠見(www.farsight.com.cn)是國內(nèi)領(lǐng)先嵌入師培訓(xùn)機構(gòu),2004年注冊于中國北京海淀高科技園區(qū),除北京總部外,上海、深圳、成都、南京、武漢、西安、廣州均有直營分公司。華清遠見除提供嵌入式相關(guān)的長期就業(yè)培訓(xùn)、短期高端培訓(xùn)、師資培訓(xùn)及企業(yè)員工內(nèi)訓(xùn)等業(yè)務(wù)外,其下屬研發(fā)中心還負責(zé)嵌入式、Android及物聯(lián)網(wǎng)方向的教學(xué)實驗平臺的研發(fā)及培訓(xùn)教材的出版,截止目前為止已公開出版70余本嵌入式/移動開發(fā)/物聯(lián)網(wǎng)相關(guān)圖書。企業(yè)理念:專業(yè)始于專注 卓識源于遠見。企業(yè)價值觀:做良心教育、做專業(yè)教育,更要做受人尊敬的職業(yè)教育。