參考一
堆棧是一種數據結構,按先進後出(First In LastOut,FILO)的方式工作,使用一個稱作堆棧指針的專用寄存器指示當前的操作位置,堆棧指針總是指向棧頂。
當堆棧指針指向最後壓入堆棧的數據時,稱爲滿堆棧(FullStack),而當堆棧指針指向下一個將要放入數據的空位置時,稱爲空堆棧(Empty Stack)。
同時,根據堆棧的生成方式,又可以分爲遞增堆棧(AscendingStack)和遞減堆棧(DecendingStack),當堆棧由低地址向高地址生成時,稱爲遞增堆棧,當堆棧由高地址向低地址生成時,稱爲遞減堆棧。這樣就有四種類型的堆棧工作方式,ARM微處理器支持這四種類型的堆棧工作方式,即:
◎ Full descending 滿遞減堆棧
堆棧首部是高地址,堆棧向低地址增長。棧指針總是指向堆棧最後一個元素(最後一個元素是最後壓入的數據)。
ARM-Thumb過程調用標準和ARM、Thumb C/C++ 編譯器總是使用Full descending 類型堆棧。
◎ Full ascending 滿遞增堆棧
堆棧首部是低地址,堆棧向高地址增長。棧指針總是指向堆棧最後一個元素(最後一個元素是最後壓入的數據)。
◎ Empty descending 空遞減堆棧
堆棧首部是低地址,堆棧向高地址增長。棧指針總是指向下一個將要放入數據的空位置。
◎ Empty ascending 空遞增堆棧
堆棧首部是高地址,堆棧向低地址增長。棧指針總是指向下一個將要放入數據的空位置。
堆棧類型 入棧指令 出棧指令
Full descending STMFD (STMDB) LDMFD (LDMIA)
Full ascending STMFA (STMIB) LDMFA (LDMDA)
Empty descending STMED (STMDA) LDMED (LDMIB)
Empty ascending STMEA (STMIA) LDMEA (LDMDB)
例子:
STMFD r13!, {r0-r5} ; Push onto a Full Descending Stack
LDMFD r13!, {r0-r5} ; Pop from a Full Descending Stack.
參考二