`
saybody
  • 浏览: 904082 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

LDR指令和LDR伪指令

阅读更多

ARM指令集中,LDR通常都是作加载指令,但是它也可以作伪指令。
初学者一般不会注意到它们的区别,其实在嵌入式开发过程中,这两条指令时非常常用的!我们应该了解他们的区别。

LDR伪指令的形式是“LDR Rn,=expr”。作用是装在一个32bit常数和一个地址到寄存器。
下面举一个例子来说明它的用法。

COUNT EQU 0x56000054
LDR R1,=COUNT
MOV R0,#0
STR R0,[R1]

COUNT是我们定义的一个变量,地址为0x56000054。

LDR R1,=COUNT是将COUNT这个变量的地址,也就是0x56000054放到R1中。
MOV R0,#0是将立即数0放到R0中。

STRR0,[R1]是一个典型的存储指令,将R0中的值放到以R1中的值为地址的存储单元去。
实际就是将0放到地址为0x56000054的存储单元中去。
可见这三条指令是为了完成对变量COUNT赋值。

再举一个例子
LDR R1,=COUNT;将COUNT的值赋给R0
LDR R0,[R1];这条伪指令,是将COUNT的地址赋给R1

ARM是RISC结构,数据从内存到CPU之间的移动只能通过LDR/STR指令来完成。
比如想把数据从内存中某处读取到寄存器中,只能使用ldr
比如:
ldr r0, 0x12345678 ;就是把0x12345678这个地址中的值存放到r0中。

而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这个和x86这种CISC架构的芯片区别最大的地方。
x86中没有ldr这种指令,因为x86的mov指令可以将数据从内存中移动到寄存器中。
MOV是从一个寄存器或者移位的寄存器或者立即数的值传递到另外一个寄存器。
从本质上是寄存器到寄存器的传递,为什么会有立即数,其实也是有限制的立即数,不是所有立即数都可以传递的
这个立即数要符合一个8位数循环右移偶数位的取值。
原因是,MOV本身就是一条32bit指令,除了指令码本身,它不可能再带一个可以表示32bit的数字,所以用了其中的12bit来表示立即数,其中4bit表示移位的位数(循环右移,且数值x2),8bit用来表示要移位的一个基数。

另外还有一个就是ldr伪指令,虽然ldr伪指令和ARM的ldr指令很像,但是作用不太一样。ldr伪指令可以在立即数前加上=,以表示把一个地址写到某寄存器中,比如:
ldr r0, =0x12345678
这样,就把0x12345678这个地址写到r0中了。所以,ldr伪指令和mov是比较相似的。只不过mov指令限制了立即数的长度为8位,也就是不能超过512。而ldr伪指令没有这个限制。如果使用ldr伪指令时,后面跟的立即数没有超过8位,那么在实际汇编的时候该ldr伪指令是被转换为 mov指令的。

感谢网友提供的参考,欢迎大家批评指正,互相学习!

分享到:
评论

相关推荐

    LDR.rar_LDR_arm ldr_ldr arm

    本篇文章将深入探讨ARM架构中的LDR指令和LDR伪指令,这对于任何涉及ARM编程的朋友来说都是极其重要的知识。 首先,我们来了解LDR指令。LDR是Load Register的缩写,它用于从内存加载数据到寄存器。基本格式为:LDR ,...

    ARM汇编中LDR伪指令和LDR指令

    ARM汇编中LDR伪指令和LDR指令 ARM汇编语言中,LDR伪指令和LDR指令是两个非常重要的概念,它们都是用于加载数据从内存到寄存器中的,但它们的作用和用法却有所不同。 首先,LDR指令是ARM架构中的 Load 指令,它用于...

    ARM伪指令ADR与LDR的区别

    在深入探讨ARM伪指令ADR与LDR的区别之前,我们首先需要理解ARM架构的基本概念以及这两条指令在程序链接和执行中的作用。ARM架构是RISC(精简指令集计算机)的一种,广泛应用于移动设备、嵌入式系统以及服务器等领域...

    arm指令中mov和ldr有什么区别

    此外,存在一种特殊的ldr伪指令,它和标准的ldr指令在功能上有所不同。ldr伪指令可以用来将一个32位的立即数或地址写入寄存器,如果这个立即数或地址在-255到255之间时,那么实际上在编译后的机器码中会被转换成mov...

    mov和ldr/str的区别

    ldr伪指令和ldr指令不同,ldr伪指令可以将 立即数写到寄存器中,而ldr指令只能将数据从内存中加载到寄存器中。 在ARM处理器中,ldr伪指令和mov指令有所不同。ldr伪指令可以将 立即数写到寄存器中,而mov指令只能将...

    ARM伪指令的说明和使用方法

    在编写ARM汇编程序时,我们经常会遇到一种特殊的指令——伪指令。这些指令并非真正的机器码指令,但它们在汇编编译过程中起着重要作用。本文将详细介绍ARM伪指令的含义、功能以及如何在编程中使用它们。 一、什么是...

    ARM汇编ADR,LDR等伪指令

    在ARM汇编语言中,`ADR`、`LDR`伪指令和`LDR`加载指令扮演着不同的角色,它们都是程序设计者在编写代码时用于处理数据和内存访问的关键工具。ARM架构是一种精简指令集(RISC)体系,其指令集相对简单,但为了实现更...

    ARM汇编伪指令与伪操作ARM嵌入式系统结构与编程PPT教学课件.pptx

    LDR伪指令是ARM汇编语言中的一种大范围地址读取伪指令,它可以将一个32位的常数或者一个地址值读取到寄存器中。LDR伪指令的语法格式如下: LDR{cond} register , = expression 其中,cond是条件码,register是...

    ARM常用指令和伪指令祥解.doc

    ARM架构的指令集是其处理器的核心组成部分,它包括了各种指令和伪指令,用于实现对处理器的操作和控制。本文将详尽地解析ARM常用的指令和伪指令,帮助读者理解和掌握ARM汇编语言的基础。 首先,我们要理解ARM指令的...

    GNU ARM汇编伪指令

    GNU ARM汇编伪指令是针对ARM架构的一种特定汇编语法,由GNU Assembler(Gas)支持,用于简化和扩展汇编程序的编写。ARM架构广泛应用于嵌入式系统、移动设备以及服务器等领域。 1. **GNU Assembler (Gas)** GNU ...

    ARM汇编语言伪指令

    这些伪指令帮助程序员更方便地管理和控制程序的流程,尤其在处理地址计算和数据加载等方面。 1. **ADR** 伪指令: ADR用于从基于PC(程序计数器)的地址或基于其他寄存器的地址中获取小范围内的地址。它允许程序员...

    ARM常用伪指令--个人整理的很全面

    本文将详细介绍ARM汇编语言中的几种常用伪指令,包括程序装载指令(ADR、ADRL、LDR)、空操作(NOP)、符号定义、数据定义以及汇编控制等伪操作。 #### 二、程序装载指令 ##### 1. ADR(小范围程序装载指令) ADR...

    ARM汇编语言伪操作与伪指令.pdf

    3. LDR伪指令:用于加载32位的立即数或地址值到指定寄存器。在编译时,如果立即数在MOV或MVN指令的范围内,LDR会被转换成相应的指令;否则,常量会被放入文字池,然后通过LDR指令从池中读取。其格式为`LDR{cond} ...

    第6讲ARM汇编伪指令与伪操作.pptx

    2. **LDR伪指令**: `LDR`伪指令在编译时被转换为实际的`LDR`指令或其他指令,如`MOV`或`MVN`,用于加载32位数据。在某些情况下,如果加载的常数超出单个指令所能表示的范围,编译器会将常量存储在程序的“文字池”...

    ARM常用指令和伪指令祥解(更新版).doc

    本文将详述ARM处理器中的一些常用指令和伪指令,帮助理解其工作原理和应用。 1. **无条件跳转指令B**: B指令用于无条件地跳转到指定的标号。例如,`B main`等同于C语言中的`goto main;`。在ARM指令中,高8位是...

    ARM汇编伪指令与伪操作ARM嵌入式系统结构与编程PPT学习教案.pptx

    - LDR伪指令用于加载32位常量或地址到寄存器。如果常量可以直接用MOV或MVN指令表示,汇编器会直接转换;否则,它会在内存中创建一个常量池,然后用LDR指令从那里读取。 - ADRL伪指令用于加载基于PC或寄存器相对...

    arm汇编ldr用法

    5. **伪指令`ldr`**:在某些汇编器中,`ldr`也可以作为伪指令,用于加载函数地址到寄存器,以调用函数,如`ldr pc, =function_name`。 在ADS(ARM Development Suite)环境下,这个`1.2`版本的工程可能包含了使用`...

    嵌入式体系结构及接口技术:第6章 ARM汇编伪指令与伪操作2.ppt

    ARM汇编语言是嵌入式系统开发中常用的一种编程语言,尤其在ARM处理器架构下,其伪指令和伪操作在程序设计中起着至关重要的作用。这些伪指令并不直接对应处理器执行的机器指令,而是由汇编器在编译过程中转换成实际的...

Global site tag (gtag.js) - Google Analytics