ARM中LDM,STM指令解析

发布者:九九归一74最新更新时间:2015-11-17 来源: eefocus关键字:ARM  LDM  STM  指令解析 手机看文章 扫描二维码
随时随地手机看文章
这里比较下容易混淆的四条指令,已经在这4条指令的混淆上花费了很多精力,现在做个小结,LDR,STR,LDM,STM这四条指令,关于LDM和STM的说明,见另外一个说明文件,说明了这两个文件用于栈操作时的注意事项。

(1)LDR:L表示LOAD,LOAD的含义应该理解为:Load from memory into register。下面这条语句就说明的很清楚:

LDR   R1,     [R2]

R1<——[R2]

就是把R2所指向的存储单元的内容的值(一个memory地址内的值),读取到R1中(一个register)

 

(2)STR:S表示STORE,STORE的含义应该理解为:Store from a register into memory。下面这条语句表示的很清楚:

STR    R1,     [R2]

R1——>[R2]

就是把寄存器R1中的内容“保存”到R2所指向的存储的单元中(一个memory地址)。

显然,这两条语句都有个特点,就是寄存器写在前面(左边)而内存地址写在后面(右边),数据传送的方向则是恰好相反的。

 

下面对LDM和STM介绍,使用sp来介绍,因为实际使用中,和sp一起使用更多。

 

(3)LDM:L的含义仍然是LOAD,即是Load from memory into register。

虽然貌似是LDR的升级,但是,千万要注意,这个指令运行的方向和LDR是不一样的,是从左到右运行的。该指令是将内存中堆栈内的数据,批量的赋值给寄存器,即是出栈操作;其中堆栈指针一般对应于SP,注意SP是寄存器R13,实际用到的却是R13中的内存地址,只是该指令没有写为[R13],同时,LDM指令中寄存器和内存地址的位置相对于前面两条指令改变了,下面的例子:

LDMFD     SP! ,   {R0, R1, R2}

实际上可以理解为:    LDMFD     [SP]!,    {R0, R1, R2}

意思为:把sp指向的3个连续地址段(应该是3*4=12字节(因为为r0,r1,r2都是32位))中的数据拷贝到r0,r1,r2这3个寄存器中去(如果这个地方还不懂的话,可以参看我文章开头提到的链接,里面有详细的图解)

 

(4)STM:S的含义仍然是STORE,与LDM是配对使用的,其指令格式上也相似,即区别于STR,是将堆栈指针写在左边,而把寄存器组写在右边。

   STMFD      SP!,   {R0}

同样的,该指令也可理解为:  STMFD      [SP]!,   {R0}

意思是:把R0保存到堆栈(sp指向的地址)中。

 

显然,这两个堆栈操作指令也有个特点,就是寄存器组写在后面(右边)而堆栈指针写在前面(左边),而且实际上使用的是堆栈指针中的内存地址,这一点与前面两条指令是有区别的。

(补充:sp后面的!,作用是指命令执行完后,对应的地址值赋给sp,对于例程的SDM,是说最后sp的值应该是sp+3*4=sp+12)

这四条指令中,前面两条和后面两条其实联系不多,反而是差别很大,因此,可以直接把这两组指令区分开来,认为它们之间没有联系,这样避免误解。

关键字:ARM  LDM  STM  指令解析 引用地址:ARM中LDM,STM指令解析

上一篇:关于ARM9协处理器CP15及MCR和MRC指令
下一篇:对ARM堆栈的理解

推荐阅读最新更新时间:2024-03-16 14:40

STM32F407定时器编码器模式简介
void encoder_left_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//开启TIM3时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);//开启GPIOB时钟 GPIO_PinAFConfig(GPIOD,
[单片机]
<font color='red'>STM</font>32F407定时器编码器模式简介
STM32 HAL库学习系列番外第2篇---LL库定时器配置
cube配置与hal一样 LL库的封装没有HAL库的那么好,需要深入的看下参考手册 定时器启动及中断函数 voiduser_tim17Init() { LL_TIM_EnableIT_UPDATE(TIM17); LL_TIM_EnableCounter(TIM17); } voiduser_tim17IRQ() { if(LL_TIM_IsActiveFlag_UPDATE(TIM17)) { LL_TIM_ClearFlag_UPDATE(TIM17); } } 定时器PWM捕获功能 voiduser_dht11Init() { LL_TIM_EnableIT_CC1(TIM3);
[单片机]
stm32中中断源名和中断处理函数名所在位置
两个文件分别在stm32f4xx.h(中断名) CORE—startup_stm32f40_41xxx.s(中断函数名) #if defined (STM32F40_41xxx) CAN1_TX_IRQn = 19, /*! CAN1 TX Interrupt */ CAN1_RX0_IRQn = 20, /*! CAN1 RX0 Interrupt */ CAN1_RX1_IRQn = 21, /*! CAN1 RX1 Interrupt
[单片机]
STM8——cannot open source file "xx.h"错误
在使用MDK5编译STM32时,新增的.c文件需要添加到 include Paths 处,否则编译时会报错。 使用STM8时,用的是IAR,新增的.c文件需要添加头文件路径到 options- c/c++ Compiler- Preprocessor下的Additional include directories; 否则在mian函数添加头文件,会报错:cannot open source file xx.h 错误
[单片机]
如何将CoreMark程序移植到STM32
说起CoreMarK,可能对于很多人来说并不陌生。经常看到有人在谈及一些中央处理器时往往会提到它的COREMARK是多少多少。它其实就是一项用来测试各类中央处理器性能的基准代码。代码使用C语言写成,包含列举、数学矩阵操作、状态及CRC等运算法则。 目前CoreMark已迅速成为测量与比较各类处理器性能的业界标准的测试基准。CoreMark得分越高,意味着性能更高。大家在CoreMark的官网上可以可以看到各家处理器各型号的CoreMark得分。也可以从CoreMark的官网上下载测试代码,亲自评测一下自己手中芯片的性能。CoreMark官网的链接地址如下: http://www.eembc.org/coremark/ind
[单片机]
如何将CoreMark程序移植到<font color='red'>STM</font>32
谷歌云宣布采用ARM芯片:施压英特尔和AMD
7月14日早间消息,据报道,Alphabet旗下谷歌云部门当地时间周三宣布,他们将开始采用基于ARM技术的芯片,成为又一个加入这一转型浪潮的大型科技公司,从而给英特尔和AMD带来更大的压力。    谷歌表示,该公司的新服务将基于Ampere Computing的Altra芯片。Ampere Computing还向微软和甲骨文等企业出售芯片。 ARM是一家总部位于英国剑桥的芯片设计公司,该公司在被英伟达收购失败后宣布将会IPO。ARM一直以来都为各类智能手机和平板电脑供应芯片设计和其他与芯片相关的知识产权。2018年,ARM开始为长期被英特尔和AMD主导的数据中心提供芯片技术。    此后4年,ARM的技术已经出现在世界各地的许
[半导体设计/制造]
STM32程序移植技巧总结
1. 工程更换不同的STM32芯片 eg:stm32f103rct6 ---- stm32f103c8t6: 1.1. 修改芯片 点击魔术棒,在出来的菜单栏里,Device 选项重新选择芯片 1.2. 修改启动文件 此处举例是 RCT6 修改为 C8T6,因为 flash 容量大小不一样,所以需要对应修改启动文件,如果是 flash 大小相同,此步骤不需要。此处由:startup_stm32f10x_hd.s修改为startup_stm32f10x_md.s 1.3. 修改全局宏定义 同样先点击魔术棒,在菜单栏选择 C/C++。进而修改全局宏定义。此处:STM32F10X_HD– STM32F10X_MD
[单片机]
<font color='red'>STM</font>32程序移植技巧总结
使用STM32按键控制LED亮灭
实验环境 Matlab版本 :2021b 操作系统 :Win10专业版 硬件平台 :YF-STM32-ALPHA 1R4 模型与原理图 本次实验所用到的Simulink模型如图5.1所示,实验现象: 按键按下、松开LED循环实现翻转亮灭效果,当按键按下时,产生下降沿脉冲,通过一个计数器对下降沿脉冲进行0~1循环计数,计数到最大值时产生输出信号,输出信号为0时,控制LED熄灭,输出值为1时,控制LED点亮。 按键电路采用对电源负极方式连接,按键松开状态为高电平H,即逻辑1,按键按下状态为低电平L,即逻辑0。 图5.1 按键控制LED亮灭simulink模型 图5.2 按键控制LED亮灭原理图 图5.3 按键在开发板
[单片机]
使用<font color='red'>STM</font>32按键控制LED亮灭
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved