ARM指令集中,LDR通常都是作加载指令的,但是它也可以作伪指令。

LDR伪指令的形式是“LDR Rn,=expr”。下面举一个例子来说明它的用法。

COUNT EQU       0x40003100

……

LDR       R1,=COUNT

MOV      R0,#0

STR       R0,[R1]

COUNT是我们定义的一个变量,地址为0x40003100。这中定义方法在汇编语言中是很常见的,如果使用过单片机的话,应该都熟悉这种用法。

LDR       R1,=COUNT是将COUNT这个变量的地址,也就是0x40003100放到R1中。

MOV      R0,#0是将立即数0放到R0中。最后一句STR      R0,[R1]是一个典型的存储指令,将R0中的值放到以R1中的值为地址的存储单元去。实际就是将0放到地址为0x40003100的存储单元中去。可 见这三条指令是为了完成对变量COUNT赋值。用三条指令来完成对一个变量的赋值,看起来有点不太舒服。这可能跟ARM的采用RISC有关。

下面还有一个例子

;将COUNT的值赋给R0

LDR       R1,=COUNT

LDR       R0,[R1]

LDR       R1,=COUNT这条伪指令,是怎样完成将COUNT的地址赋给R1,有兴趣的可以看它编译后的结果。这条指令实际上会编译成一条LDR指令和一条DCD伪指令。

LDR 的两种用法
1)LDR pc, =MyHandleIRQ 表示将MyHandleIRQ符号放入pc寄存器中
2)LDR PC,MyHandleIRQ 表示将读取存储器中MyHandleIRQ符号所表示的地址中的值,及需要多读一次存储器。
 
在代码中:
start:
        ldr pc,=MyHandleReset   @jump to HandleReset
        ldr pc,=MyHandleUndef   @jump to HandleUndef
        ldr pc,=MyHandleSWI     @jump to HandleSWI
        ldr pc,=MyHandleIabort  @jump to HandleIabort
        ldr pc,=MyHandleDabort  @jump to HandleDabort
        nop
        ldr pc,=MyHandleIRQ     @jump to HandleIRQ             <=之前出错的一行
        ldr pc,=MyHandleFIQ     @jump to HandleFIQ
 
@MyHandleIRQ:   .word OS_CPU_IRQ_ISR
MyHandleIRQ:
        sub lr, lr, #4          @ to calculate the return address       
        stmdb sp!, {r0-r12,lr}
        ldr lr, =int_return     @ restore the return address
        ldr pc, =int_handle     @ call for the interrupt handler
在“之前出错的一行”处,如果改成“ldr pc,MyHandleIRQ”当中断来临时,无法进行中断处理。
 
另一种情况是正确的,注意体会:
start:
        ldr pc,=MyHandleReset   @jump to HandleReset
        ldr pc,=MyHandleUndef   @jump to HandleUndef
        ldr pc,=MyHandleSWI     @jump to HandleSWI
        ldr pc,=MyHandleIabort  @jump to HandleIabort
        ldr pc,=MyHandleDabort  @jump to HandleDabort
        nop
        ldr pc,MyHandleIRQ     @jump to HandleIRQ             <=之前出错的一行
        ldr pc,=MyHandleFIQ     @jump to HandleFIQ
 
MyHandleIRQ:   .word OS_CPU_IRQ_ISR
@MyHandleIRQ:
@        sub lr, lr, #4          @ to calculate the return address       
@        stmdb sp!, {r0-r12,lr}
@        ldr lr, =int_return     @ restore the return address
@        ldr pc, =int_handle     @ call for the interrupt handler
因为当中断来临时,还需要去MyHandleIRQ处把OS_CPU_IRQ_ISR取出,即多取一次存储器。

ARM中LDR伪指令与LDR加载指令相关推荐

  1. ldr加载指令,ldr伪指令

    转载于http://www.cnblogs.com/hnrainll/archive/2011/06/14/2080241.html 一.ldr作为加载指令 (1)格式为:LDR{条件}  目的寄存器 ...

  2. ARM汇编中ldr伪指令和ldr指令(转载)

    转自:http://blog.csdn.net/ce123_zhouwei/article/details/7182756 ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成, ...

  3. LDR伪指令和LDR指令及MOV指令的区别

    1.前言 ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令. 2.LDR指令 就是将地址中的值存放到寄存器中 比如想把数据从内存中某处读取到寄存器中 ...

  4. 借由ARM CORTEX-M芯片分析C程序加载和存储模型

    https://zhuanlan.zhihu.com/p/22048373 写文章 借由ARM CORTEX-M芯片分析C程序加载和存储模型 王小军 1 年前 阿军最近在忙着血氧手环嵌入式系统的技术预 ...

  5. 深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 3

    备注: 因为文章太长,所以将它分为三部分,本文是第三部分. 第一部分:深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 1 第二部分:深入浅出经典面试题:从浏览器中输入URL ...

  6. 在 Swift 中使用闭包实现懒加载

    本文讲的是在 Swift 中使用闭包实现懒加载, 原文地址:Swift Lazy Initialization with Closures 原文作者:Bob Lee 译文出自:掘金翻译计划 译者:ls ...

  7. Vue 单文件组件||Vue 单文件组件的基本用法||webpack 中配置 vue 组件的加载器|| 在 webpack 项目中使用 vue

    Vue 单文件组件 传统组件的问题和解决方案 1. 问题 1. 全局定义的组件必须保证组件的名称不重复 2. 字符串模板缺乏语法高亮,在 HTML 有多行的时候,需要用到丑陋的 \ 3. 不支持 CS ...

  8. 如何在React Native中创建精美的动画加载器

    by Vikrant Negi 通过Vikrant Negi 如何在React Native中创建精美的动画加载器 (How to create a beautifully animated load ...

  9. fetchtype 动态控制_hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法

    对这种懒加载问题,最后的做法是利用Spring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开Hibernate的Session,一直保持这个Session,使得Hi ...

最新文章

  1. 我发现一个新的软件,用自然语言编程!非常酷!
  2. JavaScript实现完整的matrix矩阵类(附完整源码)
  3. NOI[2001]食物链
  4. 物联网开发者被疯抢,华为做了什么?
  5. Anaconda简介:它是什么,以及如何安装
  6. 00038oracle,ORACLE错误一览表
  7. 视频教程-R语言数据分析挖掘实战-大数据
  8. Visual studio C++:LQR轨迹跟踪仿真
  9. win安装android系统服务,拯救你的旧电脑:整个win+Android的双系统
  10. 亮宁机器人套件_十大可编程机器人教育套件
  11. Warning: [antdv: LocaleProvider] `LocaleProvider` is deprecated. Please use `local
  12. python爬取豆瓣影评生成词云的课程设计报告_Python爬取豆瓣影评,生成词云图,只要简单一步即可实现。...
  13. zabbix报错排错大全
  14. 骨传导蓝牙耳机哪款好、好用的骨传导耳机推荐
  15. 弹性伸缩、安全高效!华为云服务器助力企业数字化转型
  16. showexport 属性不管用_隐藏的文件为什么找不到了?属性设置为什么不好使?
  17. 查询课程编号为“01”的课程比“02”的课程成绩高的所有学生的学号
  18. thinkphp5 验证码跨域/验证失败 问题解决方案
  19. 1005打印任务取消不了 hp_怎么办?HP1005打印机显示正在打印却打 – 手机爱问
  20. 湖南计算机专业好的二本学校排名2015,2015湖南二本大学排名

热门文章

  1. AngularJS:SQL
  2. spring 之 init-method InitializingBean
  3. mysql中的innodb_flush_log_at_trx_commit参数的意义
  4. 特权同学笔记-榨干FPGA片上存储资源
  5. C# 基础知识 (一).概念与思想篇
  6. 【数据结构与算法】之深入解析“单词接龙”的求解思路与算法示例
  7. Flask 项目布局
  8. 【机器视觉】 serialize_measure算子
  9. 【STM32】外部中断
  10. 【Qt】Qt中QJsonArray类