根据调用规则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. HATEOAS的简单认识

    HATEOAS: 超媒体作为应用程序状态引擎(HATEOAS)是REST应用程序体系结构的一个组件,它将其与其他网络应用程序体系结构区分开来. 使用HATEOAS,客户端与网络应用程序交互,其应用程序 ...

  2. winform 扫码识别二维码

    因为公司业务需求,需要在Windows系统下调用摄像头识别二维码需求,就有了这个功能. 我根据网上网友提供的一些资料,自己整合应用到项目中,效果还不错(就是感觉像素不是太好) 现在将调用摄像头+识别二 ...

  3. (05)-Python3之--运算符操作

    1.算数运算 num_a = 100 num_b = 5000 # 加法 + print(num_a + num_b) # 减法 - print(num_a - num_b) # 乘法 * print ...

  4. Server:www121 Server:www120 Server:NWS_SP 内容被散列,并在响应中放入Etag When to Use Entity-Tags and Last-Modified Dates

    1 Request URL:http://www.biyao.com/minisite/bzzx 2 Request Method:GET 3 Status Code:200 OK 4 Remote ...

  5. P6584 重拳出击

    写在前面 来给 zrm 大佬的题写一篇题解. 这题代码实现难度不高,但是比较锻炼思维,而且应该有不少种解法.着实是一道质量很高的题目. 算法思路 首先呢,显然当小 Z 向当前节点的一棵子树走去时,这棵 ...

  6. SpringMVC听课笔记(十一:国际化)

    1. 关于国际化 -- 在页面上根据浏览器的语言设置情况对文本(不是内容),时间,数值进行本地化处理 使用JSTL的fmt标签 -- 可以在bean中获取国际化资源文件 Locale对应的消息 在be ...

  7. JavaWeb——EL及JSTL学习总结

    什么是EL表达式 为什么需要EL EL的主要作用 EL的语法 EL的开发步骤 EL实例练习 EL中的运算符 EL表达式显示内容的特点 EL的特点 EL隐式对象 EL隐式对象介绍 隐式对象实例练习 什么 ...

  8. docker镜像加速,docker更换为国内镜像

    docker镜像加速,docker更换为国内镜像 一.使用官方镜像 二.Docker守护进程配置加速器 相关博文原文地址: CSDN:让我思考一下 :docker更换为国内镜像 一.使用官方镜像 Do ...

  9. SparkSQL访问Hive源,MySQL源

    SparkSQL访问Hive源,MySQL源 一.SparkSQL访问Hive源 软件环境 SparkSQL命令行模式可以直接连接Hive的 Java程序SparkSQL连接Hive 二.SparkS ...

  10. 当前日期减去TIMESTAMP(6)日期

    select trunc(sysdate- to_date(to_char(j.create_date,'yyyy-mm-dd'),'yyyy-mm-dd')) 相差天数 from sys_user ...