www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式教程
[導(dǎo)讀]多寄存器Load/Store內(nèi)存訪問指令也叫批量加載/存儲(chǔ)指令,它可以實(shí)現(xiàn)在一組寄存器和一塊連續(xù)的內(nèi)存單元之間傳送數(shù)據(jù)。LDM用于加載多個(gè)寄存器,STM用于存儲(chǔ)多個(gè)寄存器。多寄存器Load/Store內(nèi)存訪問指令允許一條指令傳送16個(gè)寄存器的任何子集或所有寄存器。

5.4 多寄存器Load/Store內(nèi)存訪問指令

多寄存器Load/Store內(nèi)存訪問指令也叫批量加載/存儲(chǔ)指令,它可以實(shí)現(xiàn)在一組寄存器和一塊連續(xù)的內(nèi)存單元之間傳送數(shù)據(jù)。LDM用于加載多個(gè)寄存器,STM用于存儲(chǔ)多個(gè)寄存器。多寄存器Load/Store內(nèi)存訪問指令允許一條指令傳送16個(gè)寄存器的任何子集或所有寄存器。

多寄存器Load/Store內(nèi)存訪問指令主要用于現(xiàn)場保護(hù)、數(shù)據(jù)復(fù)制和參數(shù)傳遞等。

注意

多寄存器Load/Store內(nèi)存訪問指令會(huì)增加中斷延時(shí),因?yàn)锳RM通常不會(huì)打斷正在執(zhí)行的指令去響應(yīng)中斷,而必須等到指令執(zhí)行完。也就是說,如果一個(gè)中斷在多寄存器Load/Store內(nèi)存訪問指令執(zhí)行期間產(chǎn)生,那么處理器在多寄存器Load/Store內(nèi)存訪問指令執(zhí)行完后才對中斷響應(yīng)。

表5.2總結(jié)了多寄存器Load/Store內(nèi)存訪問指令

表5.2 多寄存器Load/Store內(nèi)存訪問指令

指 令

作 用

操 作

LDM

裝載多個(gè)寄存器

{Rd}*N←mem32[start address+4*N]

STM

保存多個(gè)寄存器

{Rd}*N→mem32[start address+4*N]

5.4.1 多寄存器內(nèi)存字?jǐn)?shù)據(jù)傳送指令1.LDM(1)指令

(1)指令編碼格式

LDM(1)指令將數(shù)據(jù)從連續(xù)的內(nèi)存單元中讀取到指令中指定的寄存器列表中的各寄存器中。

當(dāng)PC包含在LDM指令的寄存器列表中時(shí),指令從內(nèi)存中讀取的字?jǐn)?shù)據(jù)將被作為目標(biāo)地址值,指令執(zhí)行后程序?qū)哪繕?biāo)地址處開始執(zhí)行,從而實(shí)現(xiàn)了指令的跳轉(zhuǎn)。

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

圖5.15 LDM(1)指令編碼格式

(2)指令的語法格式

LDM{<cond>}<addressing_mode> <Rn>{!}, <registers>

① <cond>

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

② <address_mode>

指令的尋址方式。確定編碼格式中的P、U和W位。

③ <Rn>

確定尋址模式所使用的基址寄存器。

如果r15作為指令的基址寄存器,指令的執(zhí)行結(jié)果不可預(yù)知。

④ !

設(shè)置指令編碼格式中的W位。它使指令執(zhí)行后將操作數(shù)的內(nèi)存地址寫入基址寄存器<Rn>中;如果!被忽略,W位為0,指令執(zhí)行完后,不修改基址寄存器的值。

注意

如果基址寄存器包含在指令列表中,當(dāng)指令執(zhí)行完后,基址寄存器的值是新加載進(jìn)的特定內(nèi)存地址的值。也就是說,即使指令沒有出現(xiàn)在指令列表中,基址寄存器的值也可能被修改。

⑤ <registers>

被加載的寄存器列表。不同的寄存器之間用“,”隔開。完整的寄存器列表包含在“{}”中。編號低的寄存器對應(yīng)于內(nèi)存中低地址單元,編號高的寄存器對應(yīng)于內(nèi)存中高地址單元。

注意

無論寄存器在寄存器列表“{}”中如何排列,都將遵循上述規(guī)則。

寄存器r0~r15分別對應(yīng)于指令編碼中bit[0]~bit[15]位。如果Ri存在于寄存器列表中,則相應(yīng)的位等于1,否則為0。

(3)指令操作的偽代碼

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

If ConditionPass{cond} then

Address=start_address

For i=0 to 14

If register_list[i]==1 then

Ri=Memory[address,4]

Address=address+4

If register_list[15]==1 then

Value = Memory[address,4]

If(architecture version 5 or above) then

Pc= value AND 0xfffffffe

T bit=value[0]

Else

Pc= value AND 0xfffffffc

Address=address+4

Assert end_address=address+4

2.STM(1)指令

(1)指令編碼格式

STM(1)指令將指令中寄存器列表中的各寄存器數(shù)值寫入到連續(xù)的內(nèi)存單元中。主要用于塊數(shù)據(jù)的寫入、數(shù)據(jù)棧操作以及進(jìn)入子程序時(shí)保存相關(guān)寄存器的操作。

指令編碼格式如圖5.16所示。

圖5.16 STM(1)指令編碼格式

(2)指令的語法格式

STM{<cond>}<addressing_mode> <Rn>{!}, <registers>

① <cond>

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

② <address_mode>

指令的尋址方式。確定編碼格式中的P、U和W位。

③ <Rn>

確定尋址模式所使用的基址寄存器。

如果r15作為指令的基址寄存器,指令的執(zhí)行結(jié)果不可預(yù)知。

④ !

設(shè)置指令編碼格式中的W位。它使指令執(zhí)行后將操作數(shù)的內(nèi)存地址寫入基址寄存器<Rn>中;如果!被忽略,W位為0,指令執(zhí)行完后,不修改基址寄存器的值。

⑤ <registers>

被加載的寄存器列表。不同的寄存器之間用“,”隔開。完整的寄存器列表包含在“{}”中。編號低的寄存器對應(yīng)于內(nèi)存中低地址單元,編號高的寄存器對應(yīng)于內(nèi)存中高地址單元。

寄存器r0~r15分別對應(yīng)于指令編碼中bit[0]~bit[15]位。如果Ri存在于寄存器列表中,則相應(yīng)的位等于1,否則為0。

(3)指令操作的偽代碼

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

If ConditionPassed{cond} then

Address=Start_address

For i=0 to 15

If register_list[i]==1

Memory[address,4]=Ri

Address=address+4

Assert end_address==address-4

5.4.2 用戶模式多寄存器內(nèi)存字?jǐn)?shù)據(jù)傳送指令1.LDM(2)指令

(1)指令編碼格式

LDM(2)指令將數(shù)據(jù)從連續(xù)的內(nèi)存單元中讀取到指令中指定的寄存器列表中的各寄存器中。

注意

與LDM(1)指令不同,PC不能包含在寄存器列表中。

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

圖5.17 LDM(2)指令編碼格式

(2)指令的語法格式

LDM{<cond>}<addressing_mode> <Rn>, <registers_without_pc>ˆˆ

① <cond>

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

② <address_mode>

指令的尋址方式。確定編碼格式中的P位和U位。此指令中W位指定為0。

③ <Rn>

確定尋址模式所使用的基址寄存器。

如果r15作為指令的基址寄存器,指令的執(zhí)行結(jié)果不可預(yù)知。

④ <registers_without_pc>ˆ

被加載的寄存器列表。不同的寄存器之間用“,”隔開。完整的寄存器列表包含在“{}”中。此寄存器列表中不能包含PC寄存器。

如果PC包含在寄存器列表中,指令的執(zhí)行結(jié)果不可預(yù)知。

其他細(xì)節(jié)可參考LDM(1)指令。

(3)指令操作的偽代碼

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

If ConditionPassed{cond} then

Address=start_address

For i=0 to 14

If register_list[i]==1

Ri_usr=Memory[address,4]

Address=address+4

Assert end_address == address-4

2.STM(2)指令

(1)指令編碼格式

STM(2)指令將指令中寄存器列表中的各寄存器數(shù)值寫入到連續(xù)的內(nèi)存單元中。主要用于塊數(shù)據(jù)的寫入、數(shù)據(jù)棧操作以及進(jìn)入子程序時(shí)保存相關(guān)寄存器等操作。

指令編碼格式如圖5.18所示。

圖5.18 STM(2)指令編碼格式

(2)指令的語法格式

STM{<cond>}<addressing_mode> <Rn>, <registers >ˆ

① <cond>

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

② <address_mode>

指令的尋址方式。確定編碼格式中的P位和U位。此指令中W位指定為0。

③ <Rn>

確定尋址模式所使用的基址寄存器。

如果r15作為指令的基址寄存器,指令的執(zhí)行結(jié)果不可預(yù)知。

④ <registers >ˆ

寄存器列表。只能使用用戶模式下的寄存器。

(3)指令操作的偽代碼

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

If ConditionPassed{cond} then

Address=start_address

For i=0 to 15

If register_list[i] == 1

Memory[address,4]=Ri_usr

Address = address +4

Assert end_address == address-4

5.4.3 帶狀態(tài)寄存器的多寄存器內(nèi)存字?jǐn)?shù)據(jù)裝載指令(LDM(3))

(1)指令編碼格式

LDM(3)指令將數(shù)據(jù)從連續(xù)的內(nèi)存單元中讀取數(shù)據(jù)到寄存器列表中的各寄存器中。它同時(shí)將當(dāng)前處理器模式對應(yīng)的SPSR寄存器的內(nèi)容復(fù)制到CPSR寄存器中。

當(dāng)PC包含在LDM指令的寄存器列表中時(shí),指令從內(nèi)存中讀取的數(shù)據(jù)將被作為目標(biāo)地址值,指令執(zhí)行后程序?qū)哪繕?biāo)地址處開始執(zhí)行,從而實(shí)現(xiàn)了指令的跳轉(zhuǎn)。

在ARM v5及以上的版本和T系列的ARM v4版本中,SPSR寄存器的T位將復(fù)制到CPSR寄存器的T位,該位決定目標(biāo)地址處的程序狀態(tài)。在以前的版本中程序繼續(xù)執(zhí)行在ARM狀態(tài)。

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

圖5.19 LDM(3)指令編碼格式

(2)指令的語法格式

LDM{<cond>}<addressing_mode> <Rn>{!}, <registers_and_pc>ˆ

① <cond>

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

② <address_mode>

指令的尋址方式。確定編碼格式中的P、U和W位。

③ <Rn>

確定尋址模式所使用的基址寄存器。

如果r15作為指令的基址寄存器,指令的執(zhí)行結(jié)果不可預(yù)知。

④ !

設(shè)置指令編碼格式中的W位。它使指令執(zhí)行后將操作數(shù)的內(nèi)存地址寫入基址寄存器<Rn>中;如果!被忽略,W位為0,指令執(zhí)行完后,不修改基址寄存器的值。

注意

如果基址寄存器包含在指令列表中,當(dāng)指令執(zhí)行完后,基址寄存器的值是新加載進(jìn)的特定內(nèi)存地址的值。也就是說,即使指令沒有出現(xiàn)在指令列表中,基址寄存器的值也可能被修改。

⑤ <registers_and_pc>ˆ

寄存器列表。

注意

在本格式的指令中寄存器列表中必須包含PC寄存器。

被加載的寄存器列表。不同的寄存器之間用“,”隔開。完整的寄存器列表包含在“{}”中。編號低的寄存器對應(yīng)于內(nèi)存中的低地址單元,編號高的寄存器對應(yīng)于內(nèi)存中的高地址單元。

寄存器r0~r15分別對應(yīng)于指令編碼中bit[0]~bit[15]位。如果Ri存在于寄存器列表中,則相應(yīng)的位等于1,否則為0。

該指令執(zhí)行時(shí)將當(dāng)前處理器模式下的SPSR值復(fù)制到CPSR中。指令的其他參數(shù)可參見LDM(1)指令格式。

(3)指令操作的偽代碼

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

If ConditionPass{<cond>} then

Address=start_address

For i=0 to 14

If register_list[i]==1 then

Ri=Memory[address,4]

Address=address+4

CPSR=SPSR

Value=memory[address,4]

If {architecture version 4T, 5 or above} and {T bit ==1} then

Else

Pc=value AND oxfffffffc

Address=address + 4

Assert end_address=address-4

5.4.4 數(shù)據(jù)傳送指令應(yīng)用

LDM/STM批量加載/存儲(chǔ)指令可以實(shí)現(xiàn)在一組寄存器和一塊連續(xù)的內(nèi)存單元之間傳輸數(shù)據(jù)。LDM為加載多個(gè)寄存器,STM為存儲(chǔ)多個(gè)寄存器。允許一條指令傳送16個(gè)寄存器的任何子集或所有寄存器。指令格式如下:

LDM{cond}<模式> Rn{!},regist{ˆ}

STM{cond}<模式> Rn{!},regist{ˆ}

LDM/STM的主要用途有現(xiàn)場保護(hù)、數(shù)據(jù)復(fù)制和參數(shù)傳遞等。其模式有8種,如下所示。

前面4種用于數(shù)據(jù)塊的傳輸,后面4種是堆棧操作。

(1)IA:每次傳送后地址加4。

(2)IB:每次傳送前地址加4。

(3)DA:每次傳送后地址減4。

(4)DB:每次傳送前地址減4。

(5)FD:滿遞減堆棧。

(6)ED:空遞增堆棧。

(7)FA:滿遞增堆棧。

(8)EA:空遞增堆棧。

其中,寄存器Rn為基址寄存器,裝有傳送數(shù)據(jù)的初始地址,Rn不允許為R15;后綴“!”表示最后的地址寫回到Rn中;寄存器列表reglist可包含多于一個(gè)寄存器或寄存器范圍,使用“,”分開,如{R1,R2,R6~R9},寄存器排列由小到大排列;“ˆ”后綴不允許在用戶模式下,只能在系統(tǒng)模式下使用。若在LDM指令用寄存器列表中包含有PC時(shí)使用,那么除了正常的多寄存器傳送外,將SPSR拷貝到CPSR中,這可用于異常處理返回;使用“ˆ”后綴進(jìn)行數(shù)據(jù)傳送且寄存器列表不包含PC時(shí),加載/存儲(chǔ)的是用戶模式寄存器,而不是當(dāng)前模式寄存器。

注意

地址對齊問題,在這些指令中,忽略地址位[1:0]。

批量加載/存儲(chǔ)指令舉例如下。

LDMIA r0!,{r3~r9} ;加載r0指向的地址上的多字?jǐn)?shù)據(jù),保存到r3~r9中,r0值更新

STMIA r1!,{r3~r9} ;將r3~r9的數(shù)據(jù)存儲(chǔ)到r1指向的地址上,r1值更新

STMFD SP!,{r0~r7,LR} ;現(xiàn)場保存,將r0~r7、LR入棧

LDMFD SP!,{r0~r7,PC}ˆ ;恢復(fù)現(xiàn)場,異常處理返回

在進(jìn)行數(shù)據(jù)復(fù)制時(shí),先設(shè)置好源數(shù)據(jù)指針,然后使用塊拷貝尋址指令LDMIA/STMIA、LDMIB/STMIB、LDMDA/STMDA、LDMDB/STMDB進(jìn)行讀取和存儲(chǔ)。而進(jìn)行堆棧操作時(shí),則要先設(shè)置堆棧指針,一般使用SP然后使用堆棧尋址指令STMFD/LDMFD、STMED/LDMED、STMEA/LDMEA實(shí)現(xiàn)堆棧操作。

多寄存器傳送指令如例5.3所示。其中r1為指令執(zhí)行前的基址寄存器,r1’則為指令執(zhí)行后的基址寄存器。

【例5.3】多寄存器傳送指令示意。

(1)STMIA r1,{r5~r7}

(2)STMIB r1!,{r5~r7}

(3)STMDA r1!,{r5~r7}

(4)STMDB r1!,{r5~r7}

數(shù)據(jù)是存儲(chǔ)在基址寄存器的地址之上還是之下,地址是存儲(chǔ)第一個(gè)值之前還是之后、增加還是減少,如表5.3所示。

表5.3 多寄存器Load/Store內(nèi)存訪問指令映射

向 上 生 長

向 下 生 長

滿

滿

增加

之前

STMIB

LDMIB

STMFA

LDMED

之后

STMIA

LDMIA

STMEA

LDMFD

增加

之前

LDMDB

STMDB

LDMEA

STMFD

之后

LDMDA

STMDA

LDMFA

STMED

【例5.4】使用LDM/STM進(jìn)行數(shù)據(jù)復(fù)制。

LDR r0,=SrcData ;設(shè)置源數(shù)據(jù)地址

LDR r1,=DstData ;設(shè)置目標(biāo)地址

LDMIA r0,{r2~r9} ;加載8字?jǐn)?shù)據(jù)到寄存器r2~r9

STMIA r1,{r2~r9} ;存儲(chǔ)寄存器r2~r9到目標(biāo)地址

【例5.5】使用LDM/STM進(jìn)行現(xiàn)場寄存器保護(hù),常在子程序或異常處理使用。

SENDBYTE

STMFD SP!,{r0~r7,LR} ;寄存器壓棧保護(hù)

…….

BL DELAY ;調(diào)用DELAY子程序

…….

LDMFD SP!,{r0~r7,PC} ;恢復(fù)寄存器,并返回

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

2025年9月11日 – 專注于引入新品的全球電子元器件和工業(yè)自動(dòng)化產(chǎn)品授權(quán)代理商貿(mào)澤電子 (Mouser Electronics) 即日起開售Microchip Technology的新型MCP16701電源管理集成電...

關(guān)鍵字: PMIC 工業(yè)物聯(lián)網(wǎng) 微處理器

現(xiàn)代社會(huì)對計(jì)算能力的需求日益增長。人工智能 (AI) 的飛速發(fā)展推動(dòng)了數(shù)據(jù)量的爆炸式增長,包括數(shù)據(jù)的創(chuàng)建、處理和存儲(chǔ)。AI已滲透到現(xiàn)代生活的方方面面,從汽車到購物方式無所不在。在工業(yè)領(lǐng)域,邊緣計(jì)算改變了制造業(yè),創(chuàng)造了一個(gè)...

關(guān)鍵字: 微處理器 電源 人工智能

ARM系統(tǒng)幾乎都采用Linux的操作系統(tǒng),而且?guī)缀跛械挠布到y(tǒng)都要單獨(dú)構(gòu)建自己的系統(tǒng),與其他系統(tǒng)不能兼容,這也導(dǎo)致其應(yīng)用軟件不能方便移植,這一點(diǎn)一直嚴(yán)重制約了ARM系統(tǒng)的發(fā)展和應(yīng)用。GOOGLE開發(fā)了開放式的Andro...

關(guān)鍵字: Linux x86 ARM

隨著計(jì)算需求的多樣化,尤其是隨著移動(dòng)設(shè)備、嵌入式系統(tǒng)和云計(jì)算的興起,ARM 和 x86 架構(gòu)之間的爭論變得更加突出。ARM(高級 RISC 機(jī)器)和 x86 代表兩種不同類型的處理器架構(gòu),每種架構(gòu)都針對不同的工作負(fù)載和用...

關(guān)鍵字: Linux x86 ARM

從畫質(zhì)優(yōu)化 (NSS) 到幀率提升 (NFRU) 和光線追蹤(NSSD),Arm 計(jì)劃覆蓋移動(dòng)端圖形處理的多個(gè)維度,推動(dòng)邊緣 AI 圖形革命。而未來通過持續(xù)的技術(shù)迭代,Arm也將保持在移動(dòng)計(jì)算領(lǐng)域的技術(shù)領(lǐng)先,滿足手游、A...

關(guān)鍵字: ARM 神經(jīng)圖形技術(shù) GPU AI ML

7月31日消息,據(jù)媒體報(bào)道,芯片架構(gòu)提供商Arm Holdings首席執(zhí)行官Rene Haas宣布,公司正加大投入開發(fā)自有芯片產(chǎn)品,此舉標(biāo)志著其從傳統(tǒng)IP授權(quán)模式向提供實(shí)體芯片的戰(zhàn)略重大轉(zhuǎn)變。

關(guān)鍵字: ARM META
關(guān)閉