多寄存器加载/存储指令的8种方法如下表所示,右边四种为仓库操作、左面四种为数据传送操作。
方法 阐明方法 阐明
IA 每次传送后地址加4 FD 满递减仓库
IB 每次传送前地址加4 ED 空递减仓库
DA 每次传送后地址减4 FA 满递加仓库
DB 每次传送前地址减4 EA 空递加仓库
数据块传送操作 仓库操作
进行数据仿制时,先设置好源数据指针和方针指针,然后运用块复制寻址指令LDMIA/STMIA、LDMIB/STMIB、LDMDA/STMDA、LDMDB/STMDB进行读取和存储。
进行仓库操作操作时,要先设置仓库指针(SP),然后运用仓库寻址指令STMFD/LDMFD 、STMED/LDMED、STMFA/LDMFA和STMEA/LDMEA完成仓库操作。
当仓库指针指向最终压入仓库的数据时,称为满仓库(Full Stack);
当仓库指针指向下一个即将放入数据的空方位时,称为空仓库(Empty Stack)。
一起,依据仓库的生成方法,又能够分为递加仓库(Ascending Stack)和递减仓库(DecendingStack)。
当仓库由低地址向高地址生成时,称为递加仓库,当仓库由高地址向低地址生成时,称为递减仓库。
这样就有四种类型的仓库工作方法,ARM 微处理器支撑这四种类型的仓库工作方法,
即:
◎ Full descending 满递减仓库——FD 仓库首部是高地址,仓库向低地址增加。栈指针总是指向仓库最终一个元素(最终一个元素是最终压入的数据)。 ARM-Thumb进程调用规范和ARM、Thumb C/C++ 编译器总是运用Full descending 类型仓库。
◎ Full ascending 满递加仓库——FA 仓库首部是低地址,仓库向高地址增加。栈指针总是指向仓库最终一个元素(最终一个元素是最终压入的数据)。
◎ Empty descending 空递减仓库——ED 仓库首部是高地址,仓库向低地址增加。栈指针总是指向下一个即将放入数据的空方位。
◎ Empty ascending 空递加仓库——EA 仓库首部是低地址,仓库向高地址增加。栈指针总是指向下一个即将放入数据的空方位。
在ARM中,一般是满仓库,仓库成长方向是从上向下递减的(51相反为递加),在操作系统的一向进程中,与CPU相关部分的一向肯定会涉及到仓库成长方向的界说。
在ARM中咱们界说如下:
#define OS_STK_GROWTH 1 //从上向下递减 UCOS51中相同的界说如下:
#define OS_STK_GROWTH 0 //从下向上递加
arm仓库的安排结构是 满栈降 的方法,满栈即sp是要停留在最终一个进栈元素,降:便是仓库的增加方向是从高地址向低地址开展。 arm关于仓库的操作一般选用 LDMFD(pop)和STMFD (push) 两个指令。 曾经困惑的便是STMFD 指令 关于操作数是依照什么次序压栈的
比方:STMFD sp!{R0-R5,LR} 进栈次序是:
高地址(1方法) LR R5 R4 “““` R0 <-sp 低地址
高地址(2方法) R0 R1 “` R5 LR <-sp 低地址
现在经过下表,能够轻松的处理这个问题:
寻址方法 |
阐明 |
pop |
=LDM |
push |
=STM |
FA |
递加满 |
LDMFA |
LDMDA |
STMFA |
STMIB |
FD |
递减满 |
LDMFD |
LDMIA |
STMFD |
STMDB |
EA |
递加空 |
LDMEA |
LDMDB |
STMEA |
STMIA |
ED |
递减空 |
LDMED |
LDMIB |
STMED |
STMDA |
能够轻松的处理这个问题: 寻址方法阐明 pop =LDM push =STM FA 递加满 LDMFA LDMDA STMFA STMIB FD 递减满 LDMFD LDMIA STMFD STMDB EA 递加空 LDMEA LDMDB STMEA STMIA ED 递减空 LDMED LDMIB STMED STMDA 依照图表,可知 STMFD对应的是STMDB,依据arm指令手册,可知STMDB入栈次序是(1方法)而LDMFD对应的是LDMIA,这样这两个操作就能够成功配对:
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/baogao/261566.html