多寄存器加载/存储指令的8种模式

本文详细介绍了ARM处理器中堆栈的四种操作模式及其指令使用方法,包括满递减堆栈(FD)、满递增堆栈(FA)、空递减堆栈(ED)和空递增堆栈(EA)。并通过具体的例子展示了如何使用LDMFD和STMFD等指令进行堆栈操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 多寄存器加载/存储指令的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,这样这两个操作就可以成功配对:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值