汇编指令的学习4——ldm/stm指令、栈的处理
1、為什么需要多寄存器訪問指令?
ldr/str每周期只能訪問4字節內存,如果需要批量讀取、寫入內存時太慢,解決方案是stm/ldm
ldm ?(load register mutiple)
stm(store register mutiple)
2、舉例:stmia sp, {r0 - r12}(注意這里的-號不是減,而是范圍)
(1)將r0存入sp指向的內存處(假設為0x30001000);然后地址+4(即指向0x30001004),將r1存入該地址;然后地址再+4(指向0x30001008),將r2存入該地址······直到r12內容放入(0x3001030),指令完成。即將r0~r12的內容存入以sp為起始地址的內容空間里。
(2)一個訪存周期同時完成13個寄存器的讀寫。
3、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(·······)空遞增堆棧
4、四種棧
(1)空棧:棧指針指向空位,每次存入時可以直接存入然后棧指針移動一格;而取出時需要先移動一格才能取出。(因為空所以可以直接存入再移動)
(2)滿棧:棧指針指向棧中最后一格數據,每次存入時需要先移動棧指針一格再存入;取出時可以直接取出,然后再移動棧指針。(因為滿所以應該移動后再存入)
(3)增棧:棧指針移動時向地址增加的方向移動的棧。(相對于入棧來說?)
(4)減棧:棧指針移動時向地址減小的方向移動的棧。(相對于入棧來說?)
5、!的作用
ldmia r0, {r2 - r3}
ldmia r0!, {r2 - r3}
感嘆號的作用就是r0的值在ldm過程中發生的增加或者減少最后寫回到r0去,也就是說ldm時會改變r0的值。
6、^的作用
ldmfd sp!, {r0 - r6, pc}
ldmfd sp!, {r0 - r6, pc}^
^的作用:在目標寄存器中有pc時,會同時將spsr寫入到cpsr,一般用于從異常模式返回。
總結
以上是生活随笔為你收集整理的汇编指令的学习4——ldm/stm指令、栈的处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 方舟生存进化掉落物代码
- 下一篇: Python爬虫采集网易云音乐热评实战