ldm stm與棧的處理 來自於朱有鵬嵌入式

2021-07-25 06:03:20 字數 1122 閱讀 7478

為什麼需要多暫存器訪問指令

ldr/str每週期只能訪問4位元組記憶體,如果需要批量讀取、寫入記憶體時太慢,解決方案是stm/ldm

ldm(load register mutiple)

stm(store register mutiple)

舉例(uboot start.s 537行)

stmia

sp,

將r0存入sp指向的記憶體處(假設為0x30001000);然後位址+4(即指向0x30001004),將r1存入該位址;然後位址再+4(指向0x30001008),將r2存入該位址······直到r12內容放入(0x3001030),指令完成。

乙個訪存週期同時完成13個暫存器的讀寫

8種字尾

ia(increase after)先傳輸,再位址+4

ib(increase before)先位址+4,再傳輸

da(decrease after)先傳輸,再位址-4

db(decrease before)先位址-4,再傳輸

fd(full decrease)滿遞減堆疊

ed(empty decrease)空遞減堆疊

fa(·······) 滿遞增堆疊

ea(·······)空遞增堆疊

四種棧空棧:棧指標指向空位,每次存入時可以直接存入然後棧指標移動一格;而取出時需要先移動一格才能取出

滿棧:棧指標指向棧中最後一格資料,每次存入時需要先移動棧指標一格再存入;取出時可以直接取出,然後再移動棧指標

增棧:棧指標移動時向位址增加的方向移動的棧

減棧:棧指標移動時向位址減小的方向移動的棧

!的作用

ldmiar0,

ldmiar0!,

感嘆號的作用就是r0的值在ldm過程中發生的增加或者減少最後寫回到r0去,也就是說ldm時會改變r0的值。

^的作用

ldmfdsp!,

ldmfdsp!, ^

^的作用:在目標暫存器中有pc時,會同時將spsr寫入到cpsr,一般用於從異常模式返回。

批量讀取或寫入記憶體時要用ldm/stm指令

各種字尾以理解為主,不需記憶,最常見的是stmia和stmfd

謹記:操作棧時使用相同的字尾就不會出錯,不管是滿棧還是空棧、增棧還是減棧

來自於2016 2 24的flag

今天又做了一套xj模擬題 打比賽這種事情變得越來越無聊了 既影響自己的計畫 雖然看起來很難完成的樣子 又擾亂心情.而且題目大都是學習演算法之類的,與計畫不接軌就非常沒有興趣.然而今天題目中有一道撞鴨dp.這種型別以往都是都是看一眼題目大概有方程就不想寫了 怕麻煩.但是今天的撞鴨就讓我調得想撞牆.這類...

來自於2016 2 23的flag

正是中午,百廢待興,寫點什麼調節一會兒心情吧。正巧有許多的想法。機房來了許多小朋友,多麼像一年之前的我啊,想寫題,心又紛亂,但不同的是他們比我強太多了。停課是什麼感覺?停課在機房與寒暑假 雙休日在機房不同,沒有置身於他人的遊戲聲中的令人能感受到實體的現實 就像厭煩城市的喧囂,但發現它已是生存基礎構成...

幸福來自於內心的簡約

昨天看了解放 的一篇文章稱 據來自醫療部門的統計資料顯示,半數城市人有亞健康症狀。馬不停蹄為掙一套房子搏命,為一部車子加班,緣於 我們總是把擁有物質的多少 外表形象的好壞看得過於重要,用金錢 精力和時間換取一種有目共睹的優越生活 無懈可擊的外表 結果是 房子變大,存摺變多,汽車變新,衣服變靚 人卻越...