日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 嵌入式 > 嵌入式教程
[導讀]交換指令是load/store指令的一種特例,它把一個寄存器單元的內(nèi)容與寄存器內(nèi)容交換。交換指令是一個原子操作(atomic operation),也就是說,在連續(xù)的總線操作中讀/寫一個存儲單元,在操作期間阻止其他任何指令對該存儲單元的讀/寫。

5.5 單數(shù)據(jù)交換指令

交換指令是load/store指令的一種特例,它把一個寄存器單元的內(nèi)容與寄存器內(nèi)容交換。交換指令是一個原子操作(atomic operation),也就是說,在連續(xù)的總線操作中讀/寫一個存儲單元,在操作期間阻止其他任何指令對該存儲單元的讀/寫。

交換指令如表5.4所示。

表5.4 交換指令SWP

指 令

作 用

操 作

SWP

字交換

Tmp=men32[Rn]

Mem32[Rn]=Rm

Rd=tmp

續(xù)表

指 令

作 用

操 作

SWPB

字節(jié)交換

Tmp=men8[Rn]

Mem8[Rn]=Rm

Rd=tmp

注意

交換指令在執(zhí)行期間不能被其他任何指令或其他任何總線訪問打斷,在此期間系統(tǒng)占用總線(holds the bus),直至交換完成。

5.5.1 字交換指令SWP

(1)指令編碼格式

SWP指令用于將內(nèi)存中的一個字單元和一個指定寄存器的值相交換。操作過程如下,假設內(nèi)存單元地址存放在寄存器<Rn>中,指令將<Rn>中的數(shù)據(jù)讀取到目的寄存器Rd中,同時將另一個寄存器<Rm>的內(nèi)容寫入到該內(nèi)存單元中。當<Rd>和<Rm>為同一個寄存器時,指令交換該寄存器和內(nèi)存單元的內(nèi)容。

指令的編碼格式如圖5.20所示。

圖5.20 SWP指令編碼格式

(2)指令的語法格式

SWP{<cond>} <Rd>,<Rm>,[<Rn>]

① <cond>

為指令編碼中的條件域。它指示SWP指令在什么條件下執(zhí)行。當<cond>忽略時,指令為無條件執(zhí)行(cond=AL(Alway))。

② <Rd>

目標寄存器。

③ <Rm>

寄存器包含將要存儲到內(nèi)存中的數(shù)據(jù)。

④ <Rn>

寄存器中包含將要訪問的內(nèi)存地址。

(3)指令操作的偽代碼

指令操作偽代碼如下面程序段所示。

If ConditionPassed{cond} then

If Rn[1:0]==0b00 then

Temp=memory[Rn,4]

Else if Rn[1:0]==0b01 then

Temp=memory[Rn,4] Rotate_right 8

Else if Rn[1:0]==0b10 then

Temp=memory[Rn,4] Rotate_right 16

Else /* Rn[1:0]==0b11 */

Temp=memory[Rn,4] Rotate_right 24

Memory[Rn,4]=Rm

Rd=temp

5.5.2 字節(jié)交換指令SWPB

(1)指令編碼格式

SWPB指令用于將內(nèi)存中的一個字節(jié)單元和一個指定寄存器的低8位值相交換,操作過程如下。假設內(nèi)存單元地址存放在寄存器<Rn>中,指令將<Rn>中的數(shù)據(jù)讀取到目的寄存器Rd中,寄存器Rd的高24位設為0,同時將另一個寄存器<Rm>的低8位內(nèi)容寫入到該內(nèi)存字節(jié)單元中。當<Rd>和<Rm>為同一個寄存器時,指令交換該寄存器低8位內(nèi)容和內(nèi)存字節(jié)單元的內(nèi)容。

指令的編碼格式如圖5.21所示。

圖5.21 SWPB指令編碼格式

(2)指令的語法格式

SWP{<cond>}B <Rd>,<Rm>,[<Rn>]

① <cond>

為指令編碼中的條件域。它指示SWPB指令在什么條件下執(zhí)行。當<cond>忽略時,指令為無條件執(zhí)行(cond=AL(Alway))。

② <Rd>

目標寄存器。

③ <Rm>

寄存器包含將要存儲到內(nèi)存中的數(shù)據(jù)。

④ <Rn>

寄存器中包含將要訪問的內(nèi)存地址。

(3)指令操作的偽代碼

指令操作偽代碼如下面程序段所示。

If ConditionPassed{cond} then

Temp=Memory[Rn,1]

Memory[Rn,1]=Rm[7:0]

Rd=temp

5.5.3 交換指令SWP應用

寄存器和存儲器交換指令SWP指令用于將一個內(nèi)存單元(該單元地址放在寄存器Rn中)的內(nèi)容讀取到一個寄存器Rd中,同時將另一個寄存器Rm的內(nèi)容寫到該內(nèi)存單元中,使用SWP可實現(xiàn)信號量操作。

格式如下。

SWP{cond}B Rd,Rm,[Rn]

其中,B為可選后綴,若有B,則交換字節(jié),否則交換32位字。Rd為目的寄存器,存儲從存儲器中加載的數(shù)據(jù),同時,Rm中的數(shù)據(jù)將會被存儲到存儲器中。若Rm與Rn相同,則為寄存器與存儲器內(nèi)容進行交換。Rn為要進行數(shù)據(jù)交換的存儲器地址,Rn不能與Rd和Rm相同。

【例5.6】SWP指令舉例。

SWP r1,r1,[r0] ;將r1的內(nèi)容與r0指向的存儲單元內(nèi)容進行交換

SWPB r1,r2,[r0] ;將r0指向的存儲單元內(nèi)容讀取一字節(jié)數(shù)據(jù)到r1中(高24位清零),

并將r2的內(nèi)容寫入到該內(nèi)存單元中(最低字節(jié)有效)

使用SWP指令可以方便地進行信號量操作。

12C_SEM EQU 0x40003000

……

12C_SEM_WAIT

MOV r0,#0

LDR r0,=12C_SEM

SWP r1,r1,[r0] ;取出信號量,并將其設為0

CMP r1,#0 ;判斷是否有信號

BEQ 12C_SEM_WAIT ;若沒有信號則等待

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉