嵌入式STMFD SP!,{R0-R7,LR}分析

STMFD SP!,{R0-R7,LR} 的伪代码如下
SP = SP - 9×4;
address = SP; 
for i = 0 to 7
Memory[address] = Ri;
address  = address + 4;
Memory[address] = LR;
注意:ARM规定,sp始终是指向栈顶位置的,STM指令把寄存器列表中索引最小的寄存器存在最低地址,所以R0在最低地址,向上依次是R1,R2,...R7,LR。完成后SP指向保存R0的地址。
详解:对于大多数的设计来说都是把栈底设置在高地址栈顶设置在低地址,即是说上面所说的首先要sp=sp-9×4,这里理解了之后就好理解了,那么执行这条指令后,栈中的数据顺序从栈底到栈顶为lr ,r7,r6,r5,r4,r3,r2,r1,r0,此时sp-->r0,即栈顶,这和堆栈的定义没有冲突,如果sp指向的是lr的话栈就没有用了哦,其实这里stmfd有两种方法处理的,第一种先计算总共压入的数据个数,直接一次更改指针sp=sp-4*(number)并从低地址向高地址存入数据,第二种就是每压入一次就把sp=sp-1*4,同时一个一个的把数据从高地址向低地址压入。

STMFD (Store and Transfer Multiple Word Frame Description) 是一种指令集操作,常用于ARM体系结构中,特别是STM系列的处理器,如STM32微控制器。该指令用于将当前寄存器组(R0-R7)的内容存储到堆栈,并保存程序计数器(PC, LR)。 指令 "STMFD SP!, {R0-R7, LR}" 的详细解析如下: - **"SP!"**:在这里,`SP` 表示堆栈指针,它是一个特殊的寄存器,用于跟踪堆栈顶的位置。`!` 符号表示从堆栈顶部开始存取数据,意味着新的栈帧将开始于当前堆栈指针所指向的位置。 - **"{R0-R7, LR}"**:这部分描述了要存储的寄存器列表。`{}` 包含了 R0 到 R7 这七个通用寄存器以及链接寄存器 LR。这意味着指令会依次将 R0、R1、R2...直到 R7 的内容堆栈,最后把 LR 的值也,因为 LR 负责下一条指令地址的传递。 - **作用**: 使用这个指令,当前函数的局部变量(R0-R7)和返回地址(LR)会被保存,以便在函数调用结束后恢复现场,使得函数调用可以按预期返回到正确的上下文。 画图详解时,可以想象一个过程: 1. 指令执行前,堆栈状态(假设SP = 0x1000): ``` ...[R7 content] [R6 content] [R5 content] [R4 content] [R3 content] [R2 content] [R1 content] ``` SP指向下一段空闲内存区域。 2. 执行 STMFD 后,堆栈变成: ``` ...[R7 content] [R6 content] [R5 content] [R4 content] [R3 content] [R2 content] [R1 content] [LR value] [R0 content] SP = 0x1000+8 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值