嵌入式STMFD SP!,{R0-R7,LR}分析

STMFD SP!,{R0-R7,LR} 的僞代碼如下
SP = SP - 9×4;
address = SP; 
for i = 0 to 7
Memory[address] = Ri;
address  = address + 4;
Memory[address] = LR;
注意:ARM規定,sp始終是指向棧頂位置的,STM指令把寄存器列表中索引最小的寄存器存在最低地址,所以R0在最低地址,向上依次是R1,R2,...R7,LR。完成後SP指向保存R0的地址。
詳解:對於大多數的設計來說都是把棧底設置在高地址棧頂設置在低地址,即是說上面所說的首先要sp=sp-9×4,這裏理解了之後就好理解了,那麼執行這條指令後,棧中的數據順序從棧底到棧頂爲lr ,r7,r6,r5,r4,r3,r2,r1,r0,此時sp-->r0,即棧頂,這和堆棧的定義沒有衝突,如果sp指向的是lr的話棧就沒有用了哦,其實這裏stmfd有兩種方法處理的,第一種先計算總共壓入的數據個數,直接一次更改指針sp=sp-4*(number)並從低地址向高地址存入數據,第二種就是每壓入一次就把sp=sp-1*4,同時一個一個的把數據從高地址向低地址壓入。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章