arm堆疊操作

2021-05-26 19:33:04 字數 1344 閱讀 6798

arm堆疊的組織結構是 滿棧降的形式,滿棧即sp是要停留在最後乙個進棧元素,降:就是堆疊的增長方向是從高位址向低位址發展。

arm對於堆疊的操作一般採用 ldmfd(pop)和stmfd (push) 兩個命令。

指令stmfd和ldmfd分析

:根據atpcs規則,我們一般使用fd(full descending)型別的資料棧!所以經常使用的指令就有stmfd和ldmfd,

通過arm對於棧操作和批量load/store指令定址方式,可以知道指令stmfd和ldmfd的位址計算方法:

stmfd指令的定址方式為事前遞減方式(db)

start_address = rn - (number_of_set_bits_in(register_list)*4)

end_address = rn - 4

stm指令操作的偽**:

if conditionpassed(cond) then

address = start_address

for i = 0 to 15

if register_list[i] == 1

memory[address] = ri

address = address + 4

有上面兩個偽**可以得出 stmfd sp!, 的偽**如下:

sp = sp - 9×4;

address = sp; 

for i = 0 to 7

memory[address] = ri;

address  = address + 4;

memory[address] = lr;

ldmfd指令的定址方式為事後遞增方式(ia)

ia記憶體的實際位址的偽**

start_address = rn

end_address = rn + (number_of_set_bits_in(register_list)*4) - 4

ldm指令操作的偽**(未考慮pc暫存器):

if conditionpassed(cond) then

address = start_address

for i = 0 to 15

if register_list[i] == 1

ri = memory[address,4]

address = address + 4

所以ldmfd sp!,^ (;恢復現場,異常處理返回)偽**是:

address = sp;

for i = 0 to 7

ri = memory[address ,4]

address = address + 4;

sp = address;

源文件 <>

ARM堆疊方式

當堆疊指標指向最後壓入堆疊的資料時,稱為滿堆疊 full stack 而當堆疊指標指向下乙個將要放入資料的空位置時,稱為空堆疊 empty stack 同時,根據堆疊的生成方式,又可以分為遞增堆疊 ascending stack 和遞減堆疊 decendingstack 當堆疊由低位址向高位址生成時...

ARM堆疊方式

當堆疊指標指向最後壓入堆疊的資料時,稱為滿堆疊 full stack 當堆疊指標指向下乙個將要放入資料的空位置時,稱為空堆疊 empty stack 同時,根據堆疊的生成方式,又可以分為遞增堆疊 ascending stack 和遞減堆疊 decendingstack 當堆疊由低位址向高位址生成時,...

ARM堆疊定址

堆疊的分類 生長方向 1.向上生長 壓棧的時候sp指標指向記憶體的高位址 2.向下生長 壓棧的時候sp指標指向記憶體的低位址 atpcs arm 滿和空 1.滿堆疊 壓棧先修改堆疊指標sp,然後在存資料 2.空堆疊 壓棧先存資料,然後修改堆疊指標sp 四種堆疊型別 1.fa 遞增滿 2.fd 遞減滿...