当前位置: 首页 > news >正文

LDM和STM指令

LDM批量加载/STM批量存储指令可以实现一组寄存器和一块连续的内存单元之间传输数据。

允许一条指令传送16个寄存器的任意子集和所有寄存器,指令格式如下:
LDM{cond} mode Rn{!}, reglist{^}
STM{cond} mode Rn{!}, reglist{^}
主要用途:现场保护、数据复制、参数传送等,共有8中模式(前面4种用于数据块的传输,后面4种是堆栈操作)如下:
(1)IA:每次传送后地址加4
(2)IB:每次传送前地址加4
(3)DA:每次传送后地址减4
(4)DB:每次传送前地址减4
(5)FD:满递减堆栈
(6)ED:空递减堆栈
(7)FA:满递增堆栈
(8)EA:空递增堆栈
其中:
Rn:基址寄存器,装有传送数据的起始地址,Rn不允许为R15;
!:表示最后的地址写回到Rn中;
reglist:可包含多于一个寄存器范围,用“,”隔开,如{R1,R2,R6-R9},寄存器由小到大顺序排列;
^:不允许在用户模式和系统模式下运行

根据ATPCS规则,我们一般使用FD(Full Descending)类型的数据栈!所以经常使用的指令就有STMFD和LDMFD,
通过ARM对于栈操作和批量Load/Store指令寻址方式,可以知道指令STMFD和LDMFD的地址计算方法:
STMFD指令的寻址方式为事前递减方式(DB)
而DB寻址方式实际内存地址为:
start_address = Rn - (Number_Of_Set_Bits_In(register_list)*4)
end_address = Rn - 4
STM指令操作的伪代码:
if ConditionPassed(cond) then
address = start_address
for i = 0 to 15
if register_list[i] == 1
Memory[address] = Ri
address = address + 4
有上面两个伪代码可以得出 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;
STMFD和LDMFD指令个人理解分析 - L -
由于ARM堆栈结构是从高向低压栈的,此时SP即是栈顶。因为处理器是32位的ARM,所以每次压一次栈SP就会移动4个字节(32位)。
蓝色标注的SP为执行指令前的SP地址,红色标注的SP是执行指令后的SP地址,由此看出STMFD指令是向下压栈的。
![这里写图片描述](https://img-blog.csdn.net/20180907094251213?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pjNDkwNjk0NjQw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
LDMFD指令的寻址方式为事后递增方式(IA)
IA内存的实际地址的伪代码
start_address = Rn
end_address = Rn + (Number_of_set_bits_in(register_list)*4) - 4
LDM指令操作的伪代码(未考虑PC寄存器):
if ConditionPassed(cond) then
address = start_address
for i = 0 to 15
if register_list[i] == 1
Ri = Memory[address,4]
address = address + 4
所以LDMFD SP!,{R0-R7,PC}^ (;恢复现场,异常处理返回)伪代码是:
address = SP;
for i = 0 to 7
Ri = Memory[address ,4]
address = address + 4;
SP = address;
![这里写图片描述](https://img-blog.csdn.net/20180907094327753?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pjNDkwNjk0NjQw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
蓝色标注的SP为执行指令前的SP地址,红色标注的SP是执行指令后的SP地址。

转载于:https://www.cnblogs.com/zcloveembeddedsystem/p/10332331.html

相关文章:

  • java B2B2C Springcloud电子商城系统-搭建一个简单的Eureka程序
  • 传闻 Android Q 将支持手机应用版本回滚
  • MD5加密原理解析及OC版原理实现
  • linux环境安装golang
  • 国际乒联2月世界排名:樊振东、丁宁持续领跑
  • 李嘉诚23岁长孙女登场接班!出任地产公司董事,照片曝光气质获赞
  • Nginx实现动静分离
  • Java基础教程,第四讲,字符串使用以及常用字符串处理函数
  • 树链剖分算法解析
  • 数据库还原失败System.Data.SqlClient.SqlError: 无法执行 BACKUP LOG,因为当前没有数据库备份...
  • 前端技术周刊 2019-02-11 Serverless
  • 杂篇:一代版本一代神[-Gradle-]
  • MySQL 大表迁移简单方案
  • cenots6.5安装 git version 2.0.5
  • Codeforces Global Round1 简要题解
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 【391天】每日项目总结系列128(2018.03.03)
  • Android系统模拟器绘制实现概述
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • github从入门到放弃(1)
  • js递归,无限分级树形折叠菜单
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • vuex 笔记整理
  • 笨办法学C 练习34:动态数组
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 关于使用markdown的方法(引自CSDN教程)
  • 看域名解析域名安全对SEO的影响
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 普通函数和构造函数的区别
  • 前端
  • 前端面试之CSS3新特性
  • 区块链技术特点之去中心化特性
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • Semaphore
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • 组复制官方翻译九、Group Replication Technical Details
  • #13 yum、编译安装与sed命令的使用
  • #laravel 通过手动安装依赖PHPExcel#
  • (06)Hive——正则表达式
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (九十四)函数和二维数组
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)Linux下编译安装log4cxx
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET 分布式技术比较
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • @hook扩展分析
  • @RequestBody与@ResponseBody的使用