有的時(shí)候,CPU可能會(huì)遇到 a++; b++; c++,這個(gè)時(shí)候?yàn)榱颂嵘?,CPU可能會(huì)一次將多個(gè)寄存器里的變量保存到內(nèi)存中。這個(gè)時(shí)候之前介紹的 LDR / STR 指令雖然也能實(shí)現(xiàn),但只能操作一個(gè)寄存器的讀寫(xiě)。
因此,考慮到這點(diǎn),下面介紹多個(gè)寄存器的讀寫(xiě)指令
- 將多個(gè)寄存器的數(shù)據(jù)寫(xiě)入到內(nèi)存? ? ? ? ? ? ? —— STM指令
- 從內(nèi)存中讀取數(shù)據(jù)保存到多個(gè)寄存器? ? ? ?—— LDM指令?
? ? ? ? ? 目錄
1、基本讀寫(xiě)指令
(1) STM 指令
(2) LDM 指令
2、多寄存器的內(nèi)存讀寫(xiě)方式
(1) 后綴 IA(默認(rèn))
(2) 后綴 IB
(3) 后綴 DA
(4) 后綴 DB
1、基本讀寫(xiě)指令
(1) STM 指令
STM指令的作用是將多個(gè)寄存器的數(shù)據(jù)依次保存到內(nèi)存中的某一個(gè)位置。
指令格式:
- STM 第一操作寄存器,? {起始寄存器 - 末尾寄存器}
- STM 第一操作寄存器,? {寄存器1,??寄存器2, ...}?
MOV R1, #0x1
MOV R2, #0x2
MOV R3, #0x3
MOV R4, #0x4
MOV R11, #0x40000000
STM R11, {R1-R4} @ 將R1-R4寄存器中的數(shù)據(jù)保存到以R11為起始位置的內(nèi)存中(R11地址不隨內(nèi)存自增)
STM R11, {R1, R2, R3, R4} @ 與上面等價(jià)(R11地址不隨內(nèi)存自增,即R11就是起始地址)
STM R11!, {R1, R2, R3, R4} @ 在R11的后面加上“ ! ”可以讓R11中的地址隨內(nèi)存的存儲(chǔ)位置自增變化
注意:花括號(hào){ }中的寄存器編號(hào)順序建議是升序,即便是亂序或者是降序,會(huì)優(yōu)先將寄存器編號(hào)較小的保存到內(nèi)存。
?
(2) LDM 指令
LDM指令的作用是將內(nèi)存中一段地址的數(shù)據(jù)保存到多個(gè)寄存器。(類(lèi)似用法及注意事項(xiàng)可以參考STM指令)?
指令格式:
- LDM??第一操作寄存器,? {起始寄存器 - 末尾寄存器}
- LDM??第一操作寄存器,? {寄存器1,??寄存器2, ...}
MOV R1, #0x1
MOV R2, #0x2
MOV R3, #0x3
MOV R4, #0x4
MOV R11, #0x40000000
STM R11, {R1-R4}
LDM R11, {R6-R9} @ 將內(nèi)存中以R11為起始地址的數(shù)據(jù)讀取到 R6-R9 寄存器
LDM R11, {R6, R7,R8,R9} @ 與上述寫(xiě)法等價(jià)
?注意:讀取的字節(jié)大小看有多少個(gè)寄存器,每個(gè)寄存器默認(rèn)保存4個(gè)字節(jié)的數(shù)據(jù)。
2、多寄存器的內(nèi)存讀寫(xiě)方式
默認(rèn)情況下,是以某一個(gè)寄存器指向的地址為起始地址,自低地址向高地址寫(xiě)入 / 讀取??梢酝ㄟ^(guò)在上述基本指令的后面加后綴來(lái)改變內(nèi)存的讀寫(xiě)方式,比如自高地址向低地址寫(xiě)入、從起始位置的下一個(gè)地址開(kāi)始寫(xiě)入。
下面以寫(xiě)內(nèi)存為例。
MOV R1, #0x1
MOV R2, #0x2
MOV R3, #0x3
MOV R4, #0x4
MOV R11, #0x40000020
STM R11, {R1-R4} @ 起始地址為 R11
(1) 后綴 IA(默認(rèn))
IA 表示 Increase After,先將數(shù)據(jù)保存到內(nèi)存,然后再讓地址自增。STM默認(rèn)采用的方式與STMIA達(dá)到的效果是一樣的。
STMIA R11!, {R1-R4} @ 保存起始地址為 R11
注意:加“ ! ”了以后,寄存器中保存的地址會(huì)跟著內(nèi)存的增長(zhǎng)方向發(fā)生變化
(2) 后綴 IB
IA 表示 Increase Before,在寫(xiě)入內(nèi)存之前先讓R11自增4個(gè)字節(jié),然后再開(kāi)始存。
STMIB R11!, {R1-R4} @ 保存起始地址為 R11 + 4
?
(3) 后綴 DA
DA 表示 Decrease After,先將數(shù)據(jù)保存到內(nèi)存,然后再讓地址自減。(自高地址到低地址存儲(chǔ))
STMDA R11!, {R1-R4} @ 保存起始地址為 R11(自低地址向高地址存儲(chǔ))
?
(4) 后綴 DB
?DB 表示 Decrease Before,在寫(xiě)入內(nèi)存之前先讓R11自減4個(gè)字節(jié),然后再開(kāi)始存。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-468956.html
STMDB R11!, {R1-R4} @ 保存起始地址為 R11 - 4(自低地址向高地址存儲(chǔ))
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-468956.html
到了這里,關(guān)于寄存器內(nèi)存讀寫(xiě)指令(二) —— 多寄存器讀寫(xiě) LDM / STM的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!