ARM指令STMFD和LDMFD

STMFD

ST - store

M - Multiple

F - FULL

D - Descending


LDMFD

LD - Load

M - Multiple

F - FULL

D - Descending


栈指针通常可以指向不同的位置。栈指针指向栈顶元素(即最后一个入栈的数据元素)时称为FULL栈;栈指针指向与栈顶元素相邻的一个可用书局单元时称为EMPTY栈。

数据栈的增长方向也可以不同。当数据栈向内存地址减小的方向增长时,称为Descending栈;当数据栈向内存地址增加的方向增长时,称为 Ascending栈

综合上面两点,可以存在以下四种数据栈:

FD - Full Descending

ED - Empty Descending

FA - Full Ascending

EA - Empty Ascending


因此实际上存在下面这些批量load/save指令:

LDMFA, LDMFD, LDMEA, LDMED

STMED, STMEA, STMFD, STMFA


给定数据栈对应着的特定批量load/save指令,也决定了地址变化方式:

比如FD栈,对应的批量传送指令是LDMFD/STMFD,对应的地址变化方式是IA(事后递增方式), DB(事先递减方式)


STMFD SP!, {R0~R7, LR}

start_address = sp - 9 * 4

end_address = sp - 4

把寄存器r0~r7和LR共9个寄存器,存储到start_address开始, 到end_address结束的栈中,并且修改SP的值(SP变小),相当于压栈。


LDMFD SP!, {R0~R7, LR}

start_address = SP

end_address = SP + 9 * 4

把堆栈从start_address开始,到end_address内的值恢复到寄存器R0, R1... R7和LR中,并修改SP的值(SP变大),相当于出栈。






  • 8
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值