模式 說(shuō)明模式 說(shuō)明
IA 每次傳送后地址加4 FD 滿(mǎn)遞減堆棧
IB 每次傳送前地址加4 ED 空遞減堆棧
DA 每次傳送后地址減4 FA 滿(mǎn)遞增堆棧
DB 每次傳送前地址減4 EA 空遞增堆棧
數(shù)據(jù)塊傳送操作 堆棧操作
進(jìn)行數(shù)據(jù)復(fù)制時(shí),先設(shè)置好源數(shù)據(jù)指針和目標(biāo)指針,然后使用塊拷貝尋址指令LDMIA/STMIA、LDMIB/STMIB、LDMDA/STMDA、LDMDB/STMDB進(jìn)行讀取和存儲(chǔ)。
進(jìn)行堆棧操作操作時(shí),要先設(shè)置堆棧指針(SP),然后使用堆棧尋址指令STMFD/LDMFD 、STMED/LDMED、STMFA/LDMFA和STMEA/LDMEA實(shí)現(xiàn)堆棧操作。
當(dāng)堆棧指針指向最后壓入堆棧的數(shù)據(jù)時(shí),稱(chēng)為滿(mǎn)堆棧(Full Stack);
本文引用地址:
http://www.2s4d.com/article/201611/320503.htm當(dāng)堆棧指針指向下一個(gè)將要放入數(shù)據(jù)的空位置時(shí),稱(chēng)為空堆棧(Empty Stack)。
同時(shí),根據(jù)堆棧的生成方式,又可以分為遞增堆棧(Ascending Stack)和遞減堆棧(DecendingStack)。
當(dāng)堆棧由低地址向高地址生成時(shí),稱(chēng)為遞增堆棧,當(dāng)堆棧由高地址向低地址生成時(shí),稱(chēng)為遞減堆棧。
這樣就有四種類(lèi)型的堆棧工作方式,ARM 微處理器支持這四種類(lèi)型的堆棧工作方式,
即:
◎ Full descending 滿(mǎn)遞減堆棧——FD 堆棧首部是高地址,堆棧向低地址增長(zhǎng)。棧指針總是指向堆棧最后一個(gè)元素(最后一個(gè)元素是最后壓入的數(shù)據(jù))。 ARM-Thumb過(guò)程調(diào)用標(biāo)準(zhǔn)和ARM、Thumb C/C++ 編譯器總是使用Full descending 類(lèi)型堆棧。
◎ Full ascending 滿(mǎn)遞增堆棧——FA 堆棧首部是低地址,堆棧向高地址增長(zhǎng)。棧指針總是指向堆棧最后一個(gè)元素(最后一個(gè)元素是最后壓入的數(shù)據(jù))。
◎ Empty descending 空遞減堆棧——ED 堆棧首部是高地址,堆棧向低地址增長(zhǎng)。棧指針總是指向下一個(gè)將要放入數(shù)據(jù)的空位置。
◎ Empty ascending 空遞增堆棧——EA 堆棧首部是低地址,堆棧向高地址增長(zhǎng)。棧指針總是指向下一個(gè)將要放入數(shù)據(jù)的空位置。
在ARM中,一般是滿(mǎn)堆棧,堆棧生長(zhǎng)方向是從上向下遞減的(51相反為遞增),在操作系統(tǒng)的一直過(guò)程中,與CPU相關(guān)部分的一直肯定會(huì)涉及到堆棧生長(zhǎng)方向的定義。
在ARM中我們定義如下:
#define OS_STK_GROWTH 1 //從上向下遞減 UCOS51中相同的定義如下:
#define OS_STK_GROWTH 0 //從下向上遞增
arm堆棧的組織結(jié)構(gòu)是 滿(mǎn)棧降 的形式,滿(mǎn)棧即sp是要停留在最后一個(gè)進(jìn)棧元素,降:就是堆棧的增長(zhǎng)方向是從高地址向低地址發(fā)展。 arm對(duì)于堆棧的操作一般采用 LDMFD(pop)和STMFD (push) 兩個(gè)命令。 以前困惑的就是STMFD 命令 對(duì)于操作數(shù)是按照什么順序壓棧的
比如:STMFD sp!{R0-R5,LR} 進(jìn)棧順序是:
高地址(1方式) LR R5 R4 ``````` R0 <-sp 低地址
高地址(2方式) R0 R1 ``` R5 LR <-sp 低地址
現(xiàn)在通過(guò)下表,可以輕松的解決這個(gè)問(wèn)題:
尋址方式 | 說(shuō)明 | pop | =LDM | push | =STM |
FA | 遞增滿(mǎn) | LDMFA | LDMDA | STMFA | STMIB |
FD | 遞減滿(mǎn) | LDMFD | LDMIA | STMFD | STMDB |
EA | 遞增空 | LDMEA | LDMDB | STMEA | STMIA |
ED | 遞減空 | LDMED | LDMIB | STMED | STMDA |
可以輕松的解決這個(gè)問(wèn)題: 尋址方式說(shuō)明 pop =LDM push =STM FA 遞增滿(mǎn) LDMFA LDMDA STMFA STMIB FD 遞減滿(mǎn) LDMFD LDMIA STMFD STMDB EA 遞增空 LDMEA LDMDB STMEA STMIA ED 遞減空 LDMED LDMIB STMED STMDA 按照?qǐng)D表,可知 STMFD對(duì)應(yīng)的是STMDB,根據(jù)arm指令手冊(cè),可知STMDB入棧順序是(1方式)而LDMFD對(duì)應(yīng)的是LDMIA,這樣這兩個(gè)操作就可以成功配對(duì):
評(píng)論