【ARM汇编】stmfd sp!, {r0-r3, lr}
stmfd sp!, {r0-r3, lr} 【属于8中寻址方式中的“堆栈寻址”】
上面这句ARM汇编指令的伪代码如下//SP指针地址变化过程
SP = SP - 4×4; //4个寄存器,每个4个字节,该语句得到运算后的SP地址
address = SP; //将运算后的地址赋给临时地址变量address//寄存器赋值给内存地址的赋值过程
for i = 0 to 2
Memory[address] = ri; //将r0、r1、r2赋给内存有小到大的地址
address = address + 4; //地址添加4后,将lr赋给最高的地址
Memory[address] = lr;
SP栈指针指向的变化
图 1
图1中,左图是执行指令stmfd sp!, {r0-r3, lr}前,右图是执行stmfd sp!, {r0-r3, lr}指令之后,观察SP地址变化情况。
【注意】1、ARM规定,sp始终是指向栈顶位置的,stm指令把寄存器列表中索引最小的寄存器存在最低地址,所以R0在最低地址,向上依次是r1,r2,r3,lr。完成后SP指向保存r0的地址。
【详解】对于大多数的设计来说都是把栈底设置在高地址,栈顶设置在低地址,如图2所示。
即是说上面所说的首先要sp=sp-4×4,这里理解了之后就好理解了,那么执行这条指令后,栈中的数据顺序从栈底到栈顶为lr ,r3,r2,r1,r0,此时sp-->r0,即栈顶,这和堆栈的定义没有冲突,如果sp指向的是lr的话栈就没有用了哦。
【stmfd指令的两种处理方法】
第一种:先计算总共压入的数据个数,直接一次更改指针sp=sp-4*(number)并从低地址向高地址存入数据。
第二种:每压入一次就把sp=sp-1*4,同时一个一个的把数据从高地址向低地址压入
图 2
参考网址来源:https://blog.csdn.net/yxnyxnyxnyxnyxn/article/details/18302887
【ARM汇编】stmfd sp!, {r0-r3, lr}相关推荐
- ARM汇编基础详解(PS学习汇编的原因)
目录 前言 1.GNU 汇编语法 2.Cortex-A7 常用汇编指令 2.1 处理器内部数据传输指令(内部寄存器数据非内存数据) 2.2 存储器访问指令(RAM) 2.3 压栈和出栈指令(了解) 2 ...
- arm汇编总结---让汇编不再神秘
一.指令格式 <opcode>{<cond>}{S} {Rd}, {Rn}, {shifer_operand} <opcode>: 指令操作 ...
- ARM汇编指令以及伪指令
文章目录 ARM寄存器 ARM指令的一般编码格式 ARM指令的条件域 ARM寻址方式 数据处理指令的操作数寻址方式 立即数寻址方式 寄存器寻址方式 寄存器移位寻址方式 字或无符号字节的Load/Sto ...
- linux 汇编 preserve8,ARM汇编伪指令
分类: LINUX 2009-10-21 16:39:09 ARM 汇编程序的由机器指令,伪指令和宏指令组成.伪指令不像机器指令那样在处理器运行期间由机器执行,而是汇编程序对源程序汇编期间由汇编程序处 ...
- linux汇编伪指令大全,ARM汇编伪指令
分类: LINUX 2009-10-21 16:39:09 ARM 汇编程序的由机器指令,伪指令和宏指令组成.伪指令不像机器指令那样在处理器运行期间由机器执行,而是汇编程序对源程序汇编期间由汇编程序处 ...
- 常用的ARM汇编指令总结
第一次写博客,请各路大神多多关照. 本人从事软件开发相关的工作,平时主要用c语言撸代码,前段时间因工作需要,接触到了ARM架构下的汇编指令,之前学过51单片机的汇编指令,早已经还给老师了,且ARM汇编 ...
- ARM汇编:加载和存储指令集(六大类)---LDR(ADR)、LDRB、LDRH、STR、STRB、STRH
ARM的六大类指令集---LDR.LDRB.LDRH.STR.STRB.STRH ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则 ...
- ARM汇编与GCC汇编
ARM汇编与GCC汇编 /** 您忘记正确设置程序集.要解决此问题,请在文件开头发出这些指令: */ .syntax unified .cpu cortex-m3 .fpu softvfp .thum ...
- arm汇编学习(二)
一.STMFD SP!,{R4-R7,R11,LR} 表示依次把R4-R7,R11,LR放入SP中,LR在高位 参考: http://blog.chinaunix.net/uid-26435987-i ...
- arm汇编中ldr、str、stm、ldm的用法
https://blog.csdn.net/q75197694/article/details/48287781 这里比较下容易混淆的四条指令,已经在这4条指令的混淆上花费了很多精力,现在做个小结,L ...
最新文章
- nginx 同一个IP上配置多个HTTPS主机
- Windows 10 关闭Hyper-V
- CodeSmith NetTier模板生成的代码框架用法 (转)
- CMS 系统之 iframe 结构
- HDU.2111 Saving HDU(贪心)
- Redhat5.2yum源更新为centos源
- 聊一聊HTTP缓存机制
- action评测 osmo_Osmo Action与GoPro 7的七大对决,评测谁是运动相机王者?
- 企业如何选择SSL证书?
- editormd支持上传视频
- zabbix邮箱告警配置
- 77GHz毫米波雷达快速chirp信号技术(五):CAPON Beamforming
- 基于ROS的机器人设计
- jQuery UI插件之datepicker的自定义设置
- 小程序如期而至,赶快看看有哪些好玩的小程序吧
- Navicat使用技巧(附快捷键)(多年总结,待完善)
- 自动添加Opera搜索串
- 区块链 : 历史、现在与未来
- 凸优化笔记11(黄金分割法)
- 购物商场积分卡小程序开发制作
热门文章
- 百度地图api实现的定位,导航,附近搜索
- C#腾讯地图Web端定位地址搜索及手机导航
- css实现人走路效果,纯css实现机器人走路动画
- AngularJS中的$resource使用与Restful资源交互
- ros入门保姆级教程之召唤小乌龟
- 【STL】rb_tree (multi)set (multi)map
- return function和return function()的区别
- 把一个内含7个元素的数组中的第3~第5个元素拷贝到内含3个元素的数组中
- 期货现货升跌水(期货下跌现货一定下跌吗)
- 同wifi,手机控制电脑以及智能家具实现代码