精华内容
下载资源
问答
  • arm是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。比如想把数据从内存中某处读取到寄存器中,只能使用ldr
  • LDR指令

    千次阅读 2018-12-14 22:38:37
    LDR指令的格式为: LDR{条件} 目的寄存器,<存储器地址> LDR指令用于从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用于从存储器中读取32位的字数据到通用寄存器,然后对数据进行处理...

    LDR指令的格式为:

    LDR{条件} 目的寄存器,<存储器地址>

    LDR指令用于从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用于从存储器中读取32位的字数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。该指令在程序设计中比较常用,且寻址方式灵活多样,请读者认真掌握。

    指令示例:

    LDR R0,[R1] ;将存储器地址为R1的字数据读入寄存器R0。

    LDR R0,[R1,R2] ;将存储器地址为R1+R2的字数据读入寄存器R0。

    LDR R0,[R1,#8] ;将存储器地址为R1+8的字数据读入寄存器R0。

    LDR R0,[R1,R2]! ;将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1。

    LDR R0,[R1,#8]! ;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1。

    LDR R0,[R1],R2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2写入R1。

    LDR R0,[R1,R2,LSL#2]! ;将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。

    LDRR0,[R1],R2,LSL#2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。”

    http://www.pczpg.com/a/2010/0607/11062.html

    ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。

    比如想把数据从内存中某处读取到寄存器中,只能使用ldr

    比如:

    ldr r0, 0x12345678

    就是把0x12345678这个地址中的值存放到r0中。

    展开全文
  • ldr指令和ldr伪指令的使用区别: ldr r0, =0xFFF0 @伪指令 ldr r0, 0xFFFF @指令 直观的区别就是ldr伪指令使用时,后面的数据前会有"=",实际使用时,大部分都使用伪指令,这样就不用考虑合法和非法立即数的问题。...

    ARM32位指令的构成

    ARM是RISC结构,数据从内存到CPU之间的移动只能通过LDR/STR指令来完成。 32bit = 指令码 + 数据。所以32bit的一条指令不可能表示再带一个32bit的数据,实际只有其中的12bit来表示立即数,其中4bit表示移位的位数(循环右移,且数值x2),8bit用来表示要移位的一个基数。这就产生了非法立即数和合法立即数的问题,经过移位操作,不为零的部分不能用8bit表示的数就是非法立即数。ldr伪指令就是用来解决非法立即数问题的。

    ldr指令和ldr伪指令的使用区别:

    ldr r0, =0xFFF0 @伪指令
    ldr r0, 0xFFFF @指令
    直观的区别就是ldr伪指令使用时,后面的数据前会有"=",实际使用时,大部分都使用伪指令,这样就不用考虑合法和非法立即数的问题。在编译的时候,编译器会将ldr伪指令进行替换,用文字池的方式来解决非法立即数的问题。文字池就是划分出一段地址空间用来存放常量或者地址,需要时用基址+变址的方式去取数据,这样就不用受到合法立即数的限制,可以表示32bit的数据。例如:
    汇编源代码:
    _start:
    ldr r0, =0x11111111
    经过反汇编:
    00000000 <_start>:
    0: e59f009c ldr r0, [pc, #156] ; a4 <delay_loop+0x10>
    ·
    ·
    ·
    98: e1520003 cmp r2, r3
    9c: 1afffffc bne 94 <delay_loop>
    a0: e1a0f00e mov pc, lr
    a4: 11111111 tstne r1, r1, lsl r1
    分析:
    通过反汇编可以看到,ldr伪指令被一条寄存器基址变址指令给替代了。其中以pc为基址,偏移156个字节(16进制是0x9c)。这条指令的作用是将内存地址"pc + 156"开头的4个字节读取到r0中,此时pc的值等于当前执行指令的地址+8(因为流水线的原因),因此pc + 156 = 0xa4,而0xa4地址处存的值刚好是0x11111111。这样就完成了将0x11111111加载到r0。

    补充:

    RAM处理器存在流水线,目前已经有十几级流水线,但是ARM为了兼容,无论Soc有多少级流水线,PC的值都是等于当前指令地址 + 8。PC = 当前指令地址 + 8, 记住就行。

    展开全文
  • 原文链接:http://www.eeworld.com.cn/mcu/article_2016051126271.html adr和ldr区别: http://m.blog.chinaunix.net/uid-22072065-id-5110954.html

    原文链接:http://www.eeworld.com.cn/mcu/article_2016051126271.html

    adr和ldr区别:
    http://m.blog.chinaunix.net/uid-22072065-id-5110954.html

    展开全文
  • 2.LDR指令 就是将地址中的值存放到寄存器中 比如想把数据从内存中某处读取到寄存器中,只能使用ldr,比如: ldr r0, 0x12345678 就是把0x12345678这个地址中的值存放到r0中。 而mov不能干这个活,mov只能在寄存器...

    1.前言

    ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。

    2.LDR指令

    就是将地址中的值存放到寄存器中

    比如想把数据从内存中某处读取到寄存器中,只能使用ldr,比如:
    ldr r0, 0x12345678

    注意:
    此处举例不妥,真正的ldr指令为32位,不可能放下0x12345678的地址,更加准确的写法应该是类似 ldr r0, [r0, #140] 这样的写法

    就是把0x12345678这个地址中的值存放到r0中。 而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这个和x86这种CISC架构的芯片区别最大的地方。x86中没有ldr这种指令,因为x86的mov指令可以将数据从内存中移动到寄存器中。

    3. LDR伪指令

    ldr伪指令可以在立即数前加上=,以表示把一个地址写到某寄存器中

    虽然ldr伪指令和ARM的ldr指令很像,但是作用不太一样,比如:

    ldr r0, =0x12345678

    这样,就把0x12345678这个地址写到r0中了。所以,ldr伪指令和mov是比较相似的。

    4. LDR伪指令与MOV指令的区别

    mov指令:

    1.mov指令限制了立即数的长度为8位,也就是不能超过512
    2.或者这个立即数必须由一个8位的二进制数经过偶数次右移后得到

    ldr伪指令:

    没有这个限制。如果使用ldr伪指令时,后面跟的立即数没有超过8位,那么在实际汇编的时候该ldr伪指令是被转换为mov指令的。

    例子1

    LDR R0,=0x56000010        @R0 is set to be register GPBCON and   
                              @is used to select pin function for Port B
                              @in,out special function and others
    MOV R1,#0x00004000
    STR R1,[R0]               @pin GPB7 is set to be output port
    

    以上三条汇编语句的功能是将数值0x00004000存储到以0x56000010为地址的存储单元中。

    其反汇编代码如下

    0:   e59f0044        ldr     r0, [pc, #68]   ; 0x4c
    4:   e3a01901        mov     r1, #16384      ; 0x4000
    8:   e5801000        str     r1, [r0]
    ......
     
    4c:   56000010        undefined
     
    

    可见LDR R0,=0x56000010 被转换成ldr指令来执行

    例子2

    LDR R0,=0x56000000
     
    MOV R1,#0x00004000
    STR R1,[R0]
    

    其反汇编代码如下

    0:   e3a00456        mov     r0, #1442840576 ; 0x56000000
    4:   e3a01901        mov     r1, #16384      ; 0x4000
    8:   e5801000        str     r1, [r0]
    

    这里LDR R0,=0x56000000 被转换成mov r0, #1442840576

    也就是说LDR伪指令是根据后面的数据值来决定转换为ldr指令或MOV指令执行。

    那么同样是给R0赋值,LDR R0,=0x56000010 能否用mov r0, #0x56000010来代替呢,

    mov指令后面的立即数是有限制的,这个立即数必须由一个8位的二进制数经过偶数次右移后得到才合法数据

    LDR R0,=0x56000000 被转换成mov r0, #0x56000000,其中立即数0x56000000是可以由0x56经过循环右移得到的,而0x56000010无法通过一个8位的二进制数经过偶数次右移后得到,所以无法转换成mov指令来实现。

    例子3

    mov R0,#0x101
     
    mov R0,#0xFF1
    

    以上两条指令都不正确,因为立即数不合法。

    这样的话用MOV指令是比较麻烦的,因为有些简单的数据比较容易看出来,有些数据即不容易看出来是否是合法数据。

    为了解决这个问题,我们可以用LDR伪指令来实现,根据后面的立即数来决定转换为ldr指令或MOV指令执行,符合MOV指令的立即数合法性要求就转换为MOV指令,不符合的话就转换为LDR加载指令来实现。

    5.总结

    1. ldr rx, 0xxxxxxxxx 将内存地址0xxxxxxxxx处的值存放到寄存器rx
    2. ldr rx, =0xxxxxxxxx 伪指令,将内存地址0xxxxxxxxx存放到寄存器rx
      (1)如果0xxxxxxxxx不超过8位,或可以通过0xxx右移得到,则会转换为mov指令 mov rx, 0xxxxxxxxx
      (2)如果0xxxxxxxxx超过8位,或无法通过0xxx右移得到,则会转换为ldr指令
      ldr rx, [pc, #xx] ; 0xyy

      yy: xxxxxxxxx undefined

    参考文档

    http://www.techbulo.com/972.html
    https://www.cnblogs.com/mfrbuaa/p/3829056.html

    展开全文
  • LDR 加载指令是 CPU 指令,完成实质性的数据传送。用于从内存中加载数据到寄存器中。 LDR 指令是字加载指令,用于从存储器中将一个 32 位的字数据传送到目的寄存器中。该指令通常用于从存储器中读取 32 位的字数据...
  • 首先说明一下 ARM是RISC(“reduced instruction set computer”,即“精简指令集计算机”)结构 x86是CISC(“Complex Instruction Set Computer”,即“复杂指令系统计算机”)结构 想表达个什么意思呢?也就是它...
  • 汇编LDR指令

    万次阅读 多人点赞 2019-05-29 20:22:02
    一个是LDR伪指令,一个是LDR指令,名字相同却不是一个东西。 区分的方法就是看第二个参数,如果有等号,就是伪指令。 LDR指令: 例1: ldr r0, 0x12345678 // 就是把0x12345678这个地址中的值存放到r0中。而mov不能...
  • 1、MOV指令 MOV指令可以把立即数或者寄存器内容(注意:这里绝对不可以是内存!!)传递给一个寄存器。 立即数相当于高级语言中的常量(常数), 立即数就是数字嘛,表示数值的数字, 存储器用的是地址,一般立即数...
  • arm指令--ldr指令

    2020-01-19 17:45:25
    ldr指令 ldr作为指令、伪指令在arm汇编中。 ldr指令格式: LDR{条件} 目的寄存器,<存储器地址> LDR R0,[R1] ;将存储器地址为R1的字数据读入寄存器R0。 LDR R0,[R1,R2] ;将存储器地址为R1+R2的字数据...
  • MOV指令可以把立即数或者寄存器内容(注意:这里绝对不可以是内存!!)传递给一个寄存器。  立即数相当于高级语言中的常量(常数), 立即数就是数字嘛,表示数值的数字, 存储器用的是地址,一般立即数前...
  • ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。 比如想把数据从内存中某处读取到寄存器中,只能使用ldr 比如: ldr r0, 0x12345678 就是把0x12345678这个地址中的值存放到r0...
  • 对比理解adr,ldr指令

    千次阅读 2018-11-30 11:35:20
    很多人在写简单的裸机代码或分析uboot时,常常遇到adr ldr指令。却分不清这2者的区别,今天就来谈谈adr与ldr指令。 参照韦老师的代码和Makefile写了test_adr.S: .text .globl _start _start:  ldr r0, test ...
  • B与LDR指令区别

    2020-07-25 15:06:12
    转载: ... B跳转指令是代码位置无关的,经过汇编后会替换为当前PC值加(减...LDR PC,=xxx指令将向PC直接装载一个标号xxx的值,但标号经过编译后将被替换为一个与RO相对应的值,这样无论指令在何处执行都能跳转到一个指
  • STRH指令 STRH指令的格式为: STR{条件}H源寄存器,<存储器地址> STRH指令用于从源寄存器中将一个16位的半字数据传送到存储器中。该半字数据为源寄存器中的低16位。 指令示例: STRHR0,[R1];将寄存器R0...
  • ldr指令详解

    千次阅读 2018-07-01 09:59:26
    LDR:通常都是作加载指令的,但是它也可以作伪指令,通常有两种不同的表示: 1)LDR pc, =MyHandleIRQ 表示将MyHandleIRQ地址放入pc寄存器中,相当于PC=MyHandleIRQ 。 例如: 1. LDR r0,=label //用于加载立即数或一...
  • LDR指令和LDR伪指令的区别

    千次阅读 2015-11-28 22:24:08
    ARM指令集中,LDR通常都是作加载指令,但是它也可以作伪指令。 初学者一般不会注意到它们的区别,其实在嵌入式开发过程中,这两条指令时非常常用的!我们应该了解他们的区别。 LDR指令的形式是“LDR Rn,=expr...
  • origin: ...  版权声明:本文为博主原创文章,未经博主允许不得转载。... Memeory accesses(内存访问的方式) 通常有以下三种方式,允许用作内存访问指令: 《1》...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,113
精华内容 7,245
关键字:

ldr指令