根据调用规则ATPCS,程序一般都使用FD(FullDescending)类型的数据栈(满栈),那么对立的就由空栈类型的数据栈。空栈是指SP操作完后指向的地址空间是未使用的,反之满栈就是SP指向的地址已经使用了。所以对应到压栈出站时的操作就有一点点不一样。如果是满栈模型则会先执行栈指针的操作后在向栈指针指向的位置写入,反之就是先写入在移动栈指针。这里先要明确数据传输语法的基本语法格式。

数据传输指令语法格式:

CMD{cond}  Rn{!}, reglist{^}

CMD  为命令有LDM*/STM*
cond 为条件码(可选)
Rn 为基址寄存器
{!} 可选后缀,选用后缀后表示请求回写,即当数据传输完成后将最后的地址写入到基址寄存器Rn中,不选用则基址寄存器内容不改变
{^} 该后缀表示后面的寄存器都是用户模式下的寄存器;其次当CMD为LDM且寄存器列表中包含R5(PC)时,除正常传输数据还需要将SPSR复制到CPSR

LDM和STM还分为两种情况,一种是普通数据传送,还有一个是用于堆栈的操作时。

普通数据传输过程中使用IA IB DA DB区别基址的移动方向,其中A和B分别表示befor和after,I和D分别表示Increment和Decrement。

xxxIA     传送后地址增加4
xxxIB 传送前地址增加4
xxxDA 传送后地址减少4
xxxDB 传送前地址减少4

用于堆栈时用FD,ED,FA,EA来区别栈操作的方式其实就是区别一下方式是相同的。F表示Full (满栈)而E表示Empty(空栈)。A表示Ascenging(递增),D表示Descending(递减)。组合起来就是:

xxxFD  满栈递减栈(ARM核通常时这种)
xxxFA 满栈递增栈
xxxED 满栈递减栈
xxxEA 空栈递增栈

总结一下就是如下:

LD : load 加载,出栈操作
ST : store 存储,入栈操作
M : multi 多次
F: full 满栈,SP指向最后一个数据
E: empty 空栈,SP指向与最后一个数据相邻的下一个可写入存储单元
D: descending 递减,代表栈的增长方向
A: ascending 递增,代表栈的增长方向

STMFD/LDMFD指令详解

STMFD  SP,{R0-R3}

;执行伪指令大致是:
;SP-4 = R3
;SP-8 = R2
;SP-12 = R1
;SP-16 = R0
;SP 的值未修改。 LDMFD SP,{R0-R3}
;执行伪指令大致是:
;R3 = SP-4
;R2 = SP-8
;R1 = SP-12
;R0 = SP-16
;SP 的值未修改。 STMFD SP!,{R0-R3}
;执行伪指令大致是:
;SP-=4
;SP = R3
;SP-=4
;SP= R2
;SP-=4
;SP= R1
;SP-=4
;SP = R0
;SP-=4
;SP 的值已修改。 STMED SP!,{R0-R3}
;执行伪指令大致是:
;SP = R3
;SP-=4
;SP= R2
;SP-=4
;SP= R1
;SP-=4
;SP = R0
;SP-=4
;SP 的值已修改。

参考:

http://blog.chinaunix.net/uid-28458801-id-3791987.html

https://blog.csdn.net/stephenbruce/article/details/51151147

https://www.jianshu.com/p/aa4695b6bc26

https://blog.csdn.net/weiwei_xiaoyu/article/details/20563479

ARM汇编指令-STMFD/LDMFD的更多相关文章

  1. 常用ARM汇编指令

    常用ARM汇编指令 [日期:2012-07-14] 来源:Linux社区  作者:xuyuanfan77 [字体:大 中 小]     在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初 ...

  2. ARM汇编指令调试方法

    学习ARM汇编时,少不了对ARM汇编指令的调试.作为支持多语言的调试器,gdb自然是较好的选择.调试器工作时,一般通过修改代码段的内容构造trap软中断指令,实现程序的暂停和程序执行状态的监控.为了在 ...

  3. ARM汇编指令(未完待续)

    ARM指令自己在看的时候,看完之后就忘了,根本记不住,而且有些ARM汇编指令在平常的时候可能根本就用不到,所以也没必要把所有的ARM指令都去记忆,所以自己就想着不去一遍一遍的复习ARM指令,而是在平常 ...

  4. ARM汇编指令的一些总结-转

    ARM汇编指令的一些总结ARM汇编指令很多,但是真正常用的不是很多,而且需要认真琢磨的又更少了.比较有用的是MOV B BL LDR STR还是通过具体汇编代码来学习吧.@ disable watch ...

  5. ARM 汇编指令

    ARM汇编程序特点: l         所有运算处理都是发生通用寄存器(一般是R0~R14)的之中.所有存储器空间(如C语言变量的本质就是一个存储器空间上的几个BYTE).的值的处理,都是要传送到通 ...

  6. 经常使用ARM汇编指令

    一面学习,一面总结,一面记录. 以下是整理在网上找到的一些资料,简单整理记录一下,方便以后查阅. ARM处理器的指令集能够分为跳转指令.数据处理指令.程序状态寄存器(PSR)处理指令.载入/存储指令. ...

  7. ARM汇编指令特点

    根据朱有鹏老师课程笔记整理而来: (汇编)指令是CPU机器指令的助记符,经过编译后会得到一串1 0组成的机器码,由CPU读取执行. (汇编)伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器 ...

  8. 【嵌入式开发】 ARM 汇编 (指令分类 | 伪指令 | 协处理器访问指令)

    作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42408137 转载请著名出处 本博客相关文档下载 :  -- AR ...

  9. GNU ARM 汇编指令

    第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针.设置页表.操作 ARM的协处理器等.初始化完成后就可以跳转到C ...

随机推荐

  1. 【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据

    任务描述 本次集中介绍使用Windows和Linux()搭建本地Redis服务器的步骤,从备份的RDB文件中加载数据,以及如何生成AOF文件和通过AOF文件想已经运行的Redis追加数据. 操作步骤 ...

  2. flask文件下载

    后端的代码 # coding:utf-8 from flask import Flask app = Flask(__name__) @app.route("/upload", m ...

  3. Py其他内置函数,文件修改

    其他内置函数 1.abs函数,取绝对值 print(abs(-1)) 2.all函数,判断可迭代对象是否全为真,有假直接假 假:0,'',None print(all([1,2,'1'])) prin ...

  4. wordpress迁移报错

    背景: 因为一些原因迁移wordpress的博客.备份好数据库和网站源码到另一台生产环境上线的时候报错: Warning: require(/www/wwwroot/pazzn/wp-includes ...

  5. hive报错:Failed with exception java.io.IOException: rename for src path:

    在hive中,会有这样一种情形: 1.创建一个分区外部表A(比如A表有5个字段),并且向A表里指定的分区(比如20160928这个分区)里插入数据 2.发现A表缺少一些字段,因为存在元数据不实时更新的 ...

  6. HaspMap源码分析(JDK 1.8)

    底层结构分析 上面这两张图分别画出了JDK 1.7.1.8底层数据结构,在JDK 1.7.1.8中都使用 了散列算法,但是在JDK 1.8中引入了红黑树,在链表的长度大于等于8并且hash桶的长度大于 ...

  7. markdown编辑器typora本地图片上传到自己的服务器

    typora是windows平台下最受欢迎的markdown书写工具和查看工具,本篇文章将会介绍如何在typora平台使用java脚本程序自动上传本地图片到自己的服务器,从而让markdown文章中的 ...

  8. Flink-v1.12官方网站翻译-P016-Flink DataStream API Programming Guide

    Flink DataStream API编程指南 Flink中的DataStream程序是对数据流实现转换的常规程序(如过滤.更新状态.定义窗口.聚合).数据流最初是由各种来源(如消息队列.套接字流. ...

  9. linux(3) 处理目录的常用命令

    目录命令总览 ls(英文全拼:list files): 列出目录及文件名 cd(英文全拼:change directory):切换目录 pwd(英文全拼:print work directory):显 ...

  10. 模块化之CommonJS

    一.CommonJS特点 ​ 经过前面讨论,已经知道无模块化时项目中存在的问题.CommonJS的特点就是解决这些问题即: ​ 1.每个文件都是一个单独的模块,有自己的作用域,声明的变量不是全局变量( ...