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

    万次阅读 2016-01-02 12:03:20
    一、ldr的两种用法:  1、 ldr pc, =label . 即把label后的数据或者指令的运行地址赋值为pc。运行地址 = 链接地址 + 这些数据或指令相对于程序起始...二、以u-boot中lowlevel_init函数的一段代码说明ldr指令的用法。

    一、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
    /**********************************************************************************************************/


    展开全文
  • 2、MOV指令 MOV指令可以把立即数或者寄存器内容(注意:这里绝对不可以是内存!!)传递给一个寄存器。   MOV对于立即数是有要求的,就是上边的“8位图”数据。 只能由一个8bit连续有效位通过偶数次移位得到的...

    1.“八位图”数据

     

    2、MOV指令

    MOV指令可以把立即数或者寄存器内容(注意:这里绝对不可以是内存!!)传递给一个寄存器。
     
    MOV对于立即数是有要求的,就是上边的“8位图”数据。
    只能由一个8bit连续有效位通过偶数次移位得到的数。
     
    它为什么会有这样的限制呢?
    原因是,MOV本身就是一个32bit指令,除了指令码本身,他不可能再带一个可以表示32bit的数字,所以用了其中的12bit来表示

    立即数,其中4bit表示移位的尾数(循环右移,且数值*2),8bit用来表示要移位的一个基数。如果立即数超过这个范围,就没有办法用一条MOV指令给寄存器赋值

            要想判断一个数是否是合法的立即数,可以把这个数左移或右移偶数位,看能否变成一个8为的数。如果能,则是合法的立即数,可以用MOV指令操作。否则,不是合法立即数,不能用MOV指令来操作。

    (这里就要用到LDR伪指令了,查看反汇编指令,你会看到LDR伪指令此变成了两条指令~~)。
    3、LDR指令
    ldr指令既可以是大范围的地址读取伪指令,也可以内存访问指令。
    当它的第二个参数前面有“=”时,表示伪指令,否则表示内存访问指令。
    LDR指令:就是个单寄存器存储的ARM存储器访问指令。
    (LDR补充了MOV指令不能访问内存的缺陷。)
     
     ARM是RISC结构的,数据从内存到CPU之间的移动只能通过ldr/str指令(我说的是但个寄存器~~)。
    想要把数据从内存中某处读取到寄存器中,只能用ldr。
     
    4、LDR伪指令
    1)LDR伪指令没有立即数范围的限制,既,可以直接赋值。因为这是一条伪指令。
        如果立即数在MOV的要求内,系统会自动用一条汇编MOV指令来实现。
        如果不在MOV的范围内,就用其它的方式来实现,比如变成了两条指令,或者从PC偏移地址读取一个32位的数据给寄存器。
    2)关于LDR伪指令,可以装载一个32bit立即数的说法并不正确,
         因为在实际中并不是这一条语句装载了32bit立即数(跟上面的貌似一样,呵呵~~),比如:
        ldr r1,=0x70000000
        其实真正的汇编代码是将某个地址的值传递给r1,就是说需要一个地址存放0x70000000这个立即数,在反汇编中,
        如果仔细看会返现,如果这个立即数可以用mov指令的表达形式来表达,编译器就直接用mov了~~
     


    ARM汇编中ldr伪指令和ldr指令
         ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。
        比如想把数据从内存中某处读取到寄存器中,只能使用ldr比如:
              ldr r0, 0x12345678
        就是把0x12345678这个地址中的值存放到r0中。
        而mov不能实现这个功能,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中。


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


            综述所述:ldr伪指令用于加载32位的立即数或一个地址值到指定寄存器。
    在汇编编译源程序时,ldr伪指令被编译器替换成一条合适的指令。
    若加载的常数未超出mov或mvn的范围,则使用mov或mvn指令代替该ldr伪指令,
    否则汇编器将常量放入文字池,并使用一条程序相对偏移的ldr指令从文字池读出常量。       
     
    总之: ldr伪指令和ldr指令不是一个同东西。

     
    展开全文
  • arm是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。比如想把数据从内存中某处读取到寄存器中,只能使用ldr
  • ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。比如想把数据从内存中某处读取到寄存器中,只能使用ldr比如: ldr r0, 0x12345678  就是把0x12345678这个地址中的值存放...

           ARMRISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。比如想把数据从内存中某处读取到寄存器中,只能使用ldr比如:


    ldr r0, 0x12345678  


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

     

          另外还有一个就是ldr伪指令,虽然ldr伪指令和ARMldr指令很像,但是作用不太一样。ldr伪指令可以在立即数前加上=,以表示把一个值(一般是一个地址)写到某寄存器中,比如:

     

    ldr r0, =0x12345678  

     

      这样,就把0x12345678这个值写到r0中了。所以,ldr伪指令和mov是比较相似的。只不过mov指令限制了立即数的长度为8位,也就是不能超过512。而ldr伪指令没有这个限制。如果使用ldr伪指令时,后面跟的 立即数没有超过8位,那么在实际汇编的时候该ldr伪指令是被转换为mov指令的。     

             

        其实ldr指令可以装载一个32bit立即数的说法并不确切,因为实际上并不是这一条语句装载了一个32bit立即数,真正的汇编代码是将某个地址的值传 递给r1,就是说需要一个地址存放0x12345678这个立即数。而且如果这个立即数可以用mov指令的形式来表达,会被编译器实际用mov来代替比 如:

    ldr r1,=0x10 会变成

     

    mov r1,#0x10

     

         综述所述:ldr伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,ldr伪指令被编译器替换成一条合适的指令。若加载的常数 未超出movmvn的范围,则使用movmvn指令代替该ldr伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的ldr指令从文字池读 出常量。

     

            ldr伪指令和ldr指令不是一个同东西。

    展开全文
  • ARM汇编LDR指令LDR指令  (2012-08-02 16:49:25) 转载▼ 标签:  ldr   arm汇编   it 分类: NSN_BspDriver ARM是RISC结构,数据从内存到CPU之间的移动只能...

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

      (2012-08-02 16:49:25)
    标签: 

    ldr

     

    arm汇编

     

    it

    分类: NSN_BspDriver
    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指令可以装载一个32bit立即数的说法并不确切,因为实际上并不是这一条语句装载了一个32bit立即数,真正的汇编代码是将某个地址的值传递给r1,就是说需要一个地址存放0x12345678这个立即数。而且如果这个立即数可以用mov指令的形式来表达,会被编译器实际用mov来代替比 如:
    ldr r1,=0x10
    会变成
    mov r1,#0x10

            综述所述:ldr伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,ldr伪指令被编译器替换成一条合适的指令。若加载的常数未超出mov或mvn的范围,则使用mov或mvn指令代替该ldr伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的ldr指令从文字池读出常量。
     
           ldr伪指令和ldr指令不是一个同东西。
    http://www.linuxso.com/linuxrumen/16306.html
    展开全文
  • arm汇编指令LDR 和 ADR的一些区别

    千次阅读 2016-11-04 18:58:10
    arm汇编指令LDR 和 ADR的一些区别
  • ARM汇编-LDR指令学习

    2015-04-26 15:08:39
    arm汇编ldr加载指令ldr指令  1,ldr加载指令 LDR指令的格式为: LDR{条件} 目的寄存器, LDR指令用亍从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用亍从存储器中读取32位的字...
  • 1,ldr加载指令 LDR指令的格式为: LDR{条件} 目的寄存器, LDR指令用亍从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用亍从存储器 中读取32位的字数据到通用寄存器,然后对数据迕行处理。当程序...
  • 说说ARM汇编的LDR伪指令 本文来自CSDN博客:http://blog.csdn.net/axx1611/archive/2008/04/27/2335410.aspx转载请标明出处。 我们知道ARM CPU中有一条被广泛使用的指令LDR,它主要是用来从存储器(确切地
  • LDR指令的形式是“LDR Rn,=expr”,例: COUNT EQU 0x40003100 …… LDR R1,=COUNT MOV R0,#0 STR R0,[R1] COUNT是我们定义的一个变量,地址为0x40003100。这种定义方法在汇编语言中是很常见的。 LDR R1...
  • ldr加载指令 LDR指令的格式为: LDR{条件} 目的寄存器, LDR指令用亍从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用亍从存储器 中读取32位的字数据到通用寄存器,然后对数据迕行处理。当程序...
  • LDR指令的格式: LDR register, =expression 相当于把expression的值(其实标号可以理解为地址值)放到寄存器中; LDR装载指令的格式: LDR register,expression 相当于把expression地址中的内容放到寄存器中去...
  • 1,ldr加载指令 LDR指令的格式为:LDR{条件} 目的寄存器,<存储器地址>LDR指令用亍从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用亍从存储器中读取32位的字数据到通用寄存器,然后对数据迕行...
  • 在分析uboot源码时,遇到adr、ldr指令,却分不清这2者的区别,网上很多解释含糊不清,现对adr与ldr指令做解释。 首先给出一段汇编代码: ldr r0, _start adr r0, _start ldr r0, =_start nop mov pc, lr _...
  • arm汇编ldr指令中出现的等号作用

    千次阅读 多人点赞 2016-06-07 15:37:29
    ldr指令的格式: LDR R0, [R1] LDR R0, =NAME LDR R0, =0X123 对于第一种没有等号的情况,R1寄存器对应地址的数据被取出放入R0 对于第二种有等号的情况,R0寄存器的值将为NAME标号对应的地址。 对于第三种有等号的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,082
精华内容 4,432
关键字:

arm汇编指令ldr