芯路恒电子技术论坛

 找回密码
 立即注册
热搜: 合集
查看: 6196|回复: 0

stmdb和ldmia汇编指令

[复制链接]
  • TA的每日心情
    开心
    2020-1-6 12:29
  • 19

    主题

    37

    帖子

    543

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    543
    发表于 2017-3-10 18:51:24 | 显示全部楼层 |阅读模式
    本帖最后由 纵情随心 于 2017-3-10 18:54 编辑

    首先一句话说一下stmdb和ldmia指令的作用:

    stmdb和ldmia指令一般配对使用,stmdb用于将寄存器压栈,ldmia用于将寄存器弹出栈,作用是保存使用到的寄存器。


    ARM指令的多数据传输(STM、LDM)中,提到:多寄存器的Load和Store指令分为2组:一组用于数据的存储与读取,对应于IA、IB、DA、DB,一组用于堆栈操作,对应于FD、ED、FA、EA,两组中对应的指令含义相同。

    即:
    STMIB(地址先增而后完成操作)、STMFA(满递增堆栈);
    STMIA(完成操作而后地址递增)、STMEA(空递增堆栈);
    STMDB(地址先减而后完成操作)、STMFD(满递减堆栈);
    STMDA(完成操作而后地址递减)、STMED(空递减堆栈)。
    上述各组2个指令含义相同只是适用场合不同,同理有:
    LDMIB、LDMED;
    LDMIA、LDMFD;
    LDMDB、LDMEA;
    LDMDA、LDMFA。



    IA模式表示:每次传送后地址+4;(After Increase)
    DB模式表示:每次传送前地址-4;(Before Decrease)
    多寄存器加载/存储指令共有8种模式(4个用与数据块的传输,4个用于栈操作)



    举例一:

    [C] 纯文本查看 复制代码
    指令:stmdb sp!,{r0-r12,lr}  


    含义:sp = sp - 4,先压lr,sp = lr(即将lr中的内容放入sp所指的内存地址)。sp = sp - 4,再压r12,sp = r12。sp = sp - 4,再压r11,sp = r11......sp = sp - 4,最后压r0,sp = r0。


    如果想要将r0-r12和lr弹出,可以用ldmia指令:

    [C] 纯文本查看 复制代码
    指令:ldmia sp!,{r0-r12,lr}  


    举例二:



    STMIA, 比如当前r0指向的内存地址是 0x1000,STMIA R0!,{R1-R7} 就是 首先把r1存入 0x1000,然后r2存入0x1004,然后r3存入0x1008,如果是32位的处理器就是每次加4个字节,以此类推把 r1-r7按照递增的地址存入,这个r0!就是从r0的地址开始存的意思。STMDB则是地址从r0开始减少,依次存储。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|小黑屋|Archiver|芯路恒电子技术论坛 |鄂ICP备2021003648号

    GMT+8, 2024-4-25 07:31 , Processed in 0.105672 second(s), 31 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

    快速回复 返回顶部 返回列表