精华内容
下载资源
问答
  • arm汇编ldr用法

    2016-09-03 10:49:15
    ADS的工程1.2,经过本人调试可用,
  • arm汇编指令ldr用法总结

    万次阅读 2016-01-02 12:03:20
    一、ldr的两种用法:  1、 ldr pc, =label . 即把label后的数据或者指令的运行地址赋值为pc。运行地址 = 链接地址 + 这些数据或指令相对于程序起始地址的偏移。  2、 ldr pc, label, 即把label后的数据或者指令...

    一、ldr的两种用法:

         1、 ldr pc, =label .   即把label后的数据或者指令的运行地址赋值为pc。运行地址 = 链接地址 + 这些数据或指令相对于程序起始地址的偏移。

         2、 ldr pc,  label,     即把label后的数据或者指令内容赋值给pc。


    二、以u-boot中lowlevel_init函数的一段代码说明ldr指令的用法。

    代码功能:初始化sdram,将SDRDATA的数据写入以BWSCON寄存器为起始地址的连续13个寄存器。

    实现过程:

    1、u-boot的链接地址为_TEXT_BASE,即0x33f80000。所以必须知道两个信息:第一,这是属于sdram的地址;第二,这是u-boot在sdram中的起始地址。

    2、u-boot烧写完成后,实际的初始化数据是在sram当中,因为烧写是烧写到NandFlash的0地址,然后前面4k被到拷贝到sram中,后续需要把所有内容拷贝到sdram中。要获得这些初始化数据在sram中的地址,只要求取这些数据相对于链接地址的偏移后即可。

           3、 ldr  r0, =SMRDATA 这条指令获取SMRDATA 后数据的地址,即 初始化数据在sdram中的地址(是绝对地址)。因为链接地址的设置,使得ldr这条指令指向了代码应该允许的地址。  

           4、 ldr   r1,  _TEXT_BASE 获取标号_TEXT_BASE 后的数据内容,即0x33f80000。

           5、r0 减去 r1就得到了 初始化数据相对于链接地址的偏移了。


    /*****************************************源代码*****************************************************************/
    _TEXT_BASE:
    <span style="white-space:pre">	</span>.word<span style="white-space:pre">	</span>TEXT_BASE  //<span style="font-family: Arial, Helvetica, sans-serif;">TEXT_BASE   </span><span style="font-family: Arial, Helvetica, sans-serif;">0x33f8000</span>
    
    .globl lowlevel_init
    lowlevel_init:
    	/* memory control configuration */
    	/* make r0 relative the current location so that it */
    	/* reads SMRDATA out of FLASH rather than memory ! */
    	ldr     r0, =SMRDATA
    	ldr	r1, _TEXT_BASE
    	sub	r0, r0, r1
    	ldr	r1, =BWSCON	/* Bus Width Status Controller */
    	add     r2, r0, #13*4
    0:
    	ldr     r3, [r0], #4
    	str     r3, [r1], #4
    	cmp     r2, r0
    	bne     0b
    
    	/* everything is fine now */
    	mov	pc, lr
    	.ltorg
    /* the literal pools origin */
    
    SMRDATA:
        .word (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
        .word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))
        .word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))
        .word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))
        .word ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))
        .word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))
        .word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))
        .word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))
        .word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))
        .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)
        .word 0xb2
        .word 0x30
        .word 0x30
    /**********************************************************************************************************/


    展开全文
  • ldr用法

    万次阅读 2018-10-14 17:28:16
    比如想把数据从内存中某处读取到寄存器中,只能使用ldr 比如: ldr r0, 0x12345678 就是把0x12345678这个地址中的值存放到r0中。 而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这...

     

    ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。
    比如想把数据从内存中某处读取到寄存器中,只能使用ldr
    比如:
    ldr r0, 0x12345678
    就是把0x12345678这个地址中的值存放到r0中。
    而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这个和x86这种CISC架构的芯片区别最大的地方。
    x86中没有ldr这种指令,因为x86的mov指令可以将数据从内存中移动到寄存器中。
    
    另外还有一个就是ldr伪指令,虽然ldr伪指令和ARM的ldr指令很像,但是作用不太一样。ldr伪指令可以在立即数前加上=,以表示把一个地址写到某寄存器中,比如:
    ldr r0, =0x12345678
    这样,就把0x12345678这个地址写到r0中了。所以,ldr伪指令和mov是比较相似的。只不过mov指令限制了立即数的长度为8位,也就是不能超过512。而ldr伪指令没有这个限制。如果使用ldr伪指令时,后面跟的立即数没有超过8位,那么在实际汇编的时候该ldr伪指令是被转换为mov指令的。
    
    ldr伪指令和ldr指令不是一个同东西
    ----------------------------------------------------------------------------------------------------------

    LDR指令的格式: 

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

    作用:将 存储器地址 所指地址处连续的4个字节(1个字)的数据传送到目的寄存器中。

    LDR指令的寻址方式比较灵活,实例如下:

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

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

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

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

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

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

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

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

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

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

    LDR R0,Label                                                ;Label为程序标号,Label必须是当前指令的-4~4KB范围内。

    要注意的是

    LDR Rd,[Rn],#0x04                                                              ;这里Rd不允许是R15。

    另外LDRB 的指令格式与LDR相似,只不过它是将存储器地址中的8位(1个字节)读到目的寄存器中。

    LDRH的指令格式也与LDR相似,它是将内存中的16位(半字)读到目的寄存器中。

    LDR R0,=0xff

    这里的LDR不是arm指令,而是伪指令。这个时候与MOVE很相似,只不过MOV指令后的立即数是有限制的。这个立即数必须是0X00-OXFF范围内的数经过偶数次右移得到的数,所以MOV用起来比较麻烦,因为有些数不那么容易看出来是否合法。

    展开全文
  • ARM LDR伪指令用法

    千次阅读 2018-03-22 12:25:18
    LDR伪指令 10.45 LDR pseudo-instruction &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 功能:把一个32位立即数或一个32位的内存地址加载到一个寄存器中。 ...

    LDR伪指令

    10.45 LDR pseudo-instruction


              功能:把一个32位立即数或一个32位的内存地址加载到一个寄存器中。

              注意:这里描述的是LDR伪指令,而不是LDR指令


               语法:                 

                  LDR{cond}{.W} Rt, =expr
                  LDR{cond}{.W} Rt, =label_expr

                                    *   cond是一个可选的条件码

                                    *  .W是可选的指令宽度说明符

                                    *   Rt是要加载的寄存器

                                    *   expr是一个数字表达式

                                    *   label_expr是一个以标号加上或减去一个数字值形式出现的PC相对或外部地址表达式

               举例:

               

                用法:

                         当使用LDR伪指令时:

                          *  如果表达式expr的值能用一个MOV或MVN指令进行加载,那么汇编器就使用MOV或MVN指令。

                          *  如果不能使用MOV或MVN指令,或者使用了label_expr,汇编器就把这个常量放在文字池里,

                             然后使用一条PC相对形式的LDR指令从文字池里读取这个常量。

                             注意:

                              — 以这种方式加载的内存地址,其值是在链接时确定的,所以这里的代码不是位置独立的。

                              — 不管链接器把包含LDR指令的节放在哪里,指向常量的地址仍然是有效的。

                          

                         汇编器把label_expr的值放到一个文字池里,然后使用一条PC相对形式的LDR指令把这个值

                         从文 字池里读取到寄存器里。


                          如果label_expr是一个外部表达式,或不在当前节中,汇编器就在目标文件中放置一个重定位

                          指示符。链接器在链接时会产生具体的地址。


                           如果label_expr是一个局部的命名的(named)或数字标号,那么汇编器在目标文件中放置

                           一个 重定位指示符,同时为这个局部标号产生一个符号名。具体的地址也是在链接时产生的。如果

                           这个局部标号引用的是Thumb代码,则内存地址的Thumb位(bit 0)就会被设置。


                           从PC到内存池中常量值之间偏移量在ARM及32位Thumb编码中必须在 ±4K字节内,在16位Thumb

                           编码中必须在0到+1K字节范围 内。你必须自己确保在上述有效范围内有一个内存池。


                            如果被引用的标号是在Thumb代码中,那么LDR伪指令设置label_expr所代表的内存地址的

                            Thumb位(bit 0)。

                            注意:

                在RealView Compilation Tools(RVCT) v2.2中,内存地址的Thumb位不会被设置。如果你有

                                 依赖于这种行为的代码,请使用命令行选项–untyped_local_labels,强制汇编器不要设置被

                                 引用的位于Thumb代码中的标号。


    Thumb代码中的LDR伪指令

    LDR in Thumb code

              你可以使用指令宽度说明符 .W 强制汇编器在ARMv6T2及以上的处理器上把Thumb代码中LDR

                      伪指令编码为32位长。即使立即数的值能使用一个16位的MOV指令加载,或存在一个在16位PC相

                      对LDR指令范围内的内存池,LDR.W总是产生一条32位的指令。


          未完待续。。。















    转自ASMARM的博客:http://blog.csdn.net/asmarm/article/details/29546583

    展开全文
  • ARM中的LDR使用方法

    千次阅读 2013-11-18 16:18:12
    ARM指令集中,LDR通常都是作加载指令...下面举一个例子来说明它的用法。 COUNT EQU  0x40003100 …… LDR  R1,=COUNT MOV  R0,#0 STR  R0,[R1] COUNT是我们定义的一个变量,地址为0x40003100。这中定义方法在汇

    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取出,即多取一次存储器。

    展开全文
  • LDR用法(ARM指令及伪指令)

    万次阅读 2017-05-09 15:12:45
    在ARM汇编中,LDR用的比较多,现总结一下它的用法:1. 内存访问指令LDR指令可以从内存中读取数据到寄存器中。ldr r1, [r2, #4] /*将地址为r2+4的内存单元数据读取到r1中*/ ldr r1, [r2], #4 /*将地址为r2的内存单元...
  • ldr加载指令 LDR指令的格式为: LDR{条件} 目的寄存器, LDR指令用亍从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用亍从存储器 中读取32位的字数据到通用寄存器,然后对数据迕行处理。当程序...
  • ARM汇编之LDR操作符

    2021-05-09 18:44:15
    区分方法:带”=”的是伪指令,用”[]”的是指令。 LDR内存访问指令: 语法: 有很多种方式,如:immediate offset/register offset等等,访问的是 [寄存器中地址值 + 偏移值] 对应的内存单元。 LDR伪指令:用于...
  • 这里比较下容易混淆的四条指令,已经在这4条指令的混淆上花费了很多精力,现在做个小结,LDR,STR,LDM,STM这四条指令,关于LDM和STM的说明,见另外一个说明文件,说明了这两个文件用于栈操作时的注意事项。...
  • LDR指令

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

    千次阅读 2015-05-14 20:04:31
    LDR伪指令的形式是“LDR Rn,=expr”。作用是装在一个32bit常数和一个... 下面举一个例子来说明它的用法。  COUNT EQU 0x56000054  LDR R1,=COUNT  MOV R0,#0  STR R0,[R1]   COUNT是我们定义的一个变量,
  • stm32_汇编(STR和LDR)

    千次阅读 2019-10-31 12:00:34
    LDR -(Load Register)存储指令 ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。 STR -(Store Register)存储指令 格式: str{条件} 源寄存器,<存储器地址> 将源...
  • LDR&STR指令的学习

    2018-04-23 12:10:42
    在ARM架构下,数据从内存到CPU之间的移动只能通过LDR/STR指令来完成,而MOV指令只能在寄存器之间移动数据,或者把立即数移动到寄存器中,并且数据的长度不能超过8位。1:LDR r0,=label 用于加载立即数或一个地址值到...
  • <学习笔记> adr 与 ldr使用及两者的区别(基于ARM架构)使用环境: 环境系统: Ubuntu 14.04.4 适用于 mini2440的工具集合: arm-linux-cpp : arm-none-linux-gnueabi-cpp (ctng-1.6.1) 4.4.3 arm-linux-...
  • 在本篇文章中,我将向您展示如何使用LDR光敏电阻来点亮或熄灭LED灯。 如果房间变暗,灯泡会自动打开并消除黑暗,那不是很酷吗?在这个非常简单的项目中,我专注于消除黑暗。您甚至可以将其用作应急照明系统。 LDR...
  • ARM指令集 LDR指令

    千次阅读 2013-10-05 20:19:09
    ARM指令集中,LDR通常都是作加载指令的,但是它也可以作伪指令。 (1)LDR r0,=name,像这种带等号的是伪指令,而不是ARM指令,LDR 伪指令用于加载立即数或一个地址值到指定寄存器. *如果name是立即数的话:LDR R0,=0X...
  • 汇编LDR指令

    万次阅读 多人点赞 2019-05-29 20:22:02
    区分的方法就是看第二个参数,如果有等号,就是伪指令。 LDR指令: 例1: ldr r0, 0x12345678 // 就是把0x12345678这个地址中的值存放到r0中。而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到...
  • ldr命令

    千次阅读 2019-05-19 00:41:25
    一直以来,关于ldr的命令的理解,总是很模糊,网上有很多讲解的文章,讲的不全面,有时互相矛盾。得到一个结论就是:看资料还是尽量看最权威、最源头的资料。 1.ldr汇编指令 参考资料: ARM体系结构与编程...
  • LDR光敏电阻一个 LED灯一个 若干杜邦线 步骤:数字针脚8号作为LED灯的输出 模拟针脚A0作为LDR光敏电阻的输入 220欧姆电阻作为LED灯的限流电阻 10千欧姆电阻作为LDR光敏电阻的分压电阻 将arduino3.3V电压连接到10千欧...
  • LDR用法(纠错)

    2021-03-26 16:53:33
    GPIO_AFG EQU 0xFFF83000 定义GPIO_...LDR r0, =GPIO_AFG 把GPIO_AFG的地址即0xFFF83000存入R0中 LDR r1, =0x00000010 把立即数0x00000010 存入R1中,如果是MOV指令, 则用“#“表立即数。 STR r1, [r0] 把R1中存的数.
  • ARM LDR伪指令用法详解

    千次阅读 2014-06-09 09:31:42
    LDR伪指令 10.45 LDR pseudo-instruction  功能:把一个32位立即数或一个32位的内存地址加载到一个寄存器中。  注意:这里描述的是LDR伪指令,而不是LDR指令  语法:   LDR{cond}{.W} Rt, =e
  • 这里比较下容易混淆的四条指令,已经在这4条指令的混淆上花费了很多精力,现在做个小结,LDR,STR,LDM,STM这四条指令,关于LDM和STM的说明,见另外一个说明文件,说明了这两个文件用于栈操作时的注意事项。...
  • LDR , STR的用法

    千次阅读 2016-07-28 20:05:15
    GPIO_AFG EQU 0xFFF83000 定义GPIO_AFG的地址为: 0xFFF83000  LDR r0, =GPIO_AFG 把GPIO_AFG的地址即0xFFF83000存入R0中 LDR r1, =0x00000010 把立即数0x00000010 存入R1中,如果是MOV指令,
  • 一、ldr作为加载指令 (1)格式为:LDR{条件} 目的寄存器,<存储器地址> (2)LDR指令用于从存储器中将一个32位的字数据传送到目的寄存器中。 (3)指令示例: LDR R0,[R1] ;将存储器地址为R1的字数...
  • arm汇编—ldr加载指令,ldr伪指令

    万次阅读 2018-08-07 10:56:43
    1,ldr加载指令 LDR指令的格式为: LDR{条件} 目的寄存器,&lt;存储器地址&gt; LDR指令用亍从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用亍从存储器 中读取32位的字数据到通用寄存器,然后...
  • ARM 是 RISC 结构,因此只能使用精简指令。 1. mov的用法 在ARM体系中,mov只能用于数据在寄存器之间的移动或者往寄存器中写入立即数。格式如下:mov{条件}{s} 目的寄存器,源操作数 MOV R1,R2 ;R1=R2 1 MOV R1,...
  • arm中LDR伪指令与LDR加载指令LDR伪指令的形式是“LDR Rn,=expr”。下面举一个例子来说明它的用法。 COUNT EQU 0x40003100 …… ...这中定义方法在汇编语言中是很常见的,如果使用过单片机的话,应该都熟悉这种用法
  • 这里比较下容易混淆的四条指令,已经在这4条指令的混淆上花费了很多精力,现在做个小结,LDR,STR,LDM,STM这四条指令,关于LDM和STM的说明,见另外一个说明文件,说明了这两个文件用于栈操作时的注意事项。...
  • LDR指令和LDR伪指令区别

    千次阅读 2017-11-06 15:40:52
    ARM指令集中,LDR通常都是作加载指令,但是它也可以作伪指令。 初学者一般不会注意到它们的区别,其实在嵌入式开发过程中,这两条指令时非常常用...下面举一个例子来说明它的用法。 COUNT EQU 0x56000054 LDR R1

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,005
精华内容 4,802
关键字:

ldr用法