zoukankan      html  css  js  c++  java
  • (转)为什么adrl r2,mem_cfg_val这里不用ldr r2,=mem_cfg_val

    网址:http://blog.csdn.net/glorin/article/details/6327083
    memsetup:
    mov r1, #MEM_CTL_BASE
    adrl r2,mem_cfg_val
    add r3,  r1,#52
    1:
    ldr r4,  [r2],#4
    str r4,  [r1],#4
    cmp r1,r3
    bne 1b
    mov pc,lr
    mem_cfg_val:
      .long 0x22011110
      .long 0x00000700
      .long 0x00000700
      ······
    书中的SDRAM裸机例子,为什么adrl r2,mem_cfg_val这里不用ldr r2,=mem_cfg_val,虽然说adrl是相对寻址,ldr是绝对寻址,但是我感觉效果一样,请教大家,谢谢

    回复:请教书中sdram裸机代码

    如果是用ldr r2,=mem_cfg_val,那么r2的值应该是0x3xxxxxxx,它位于SDRAM中;
    但是刚启动系统时,SDRAM尚未被初始化,里面的数据是随机的;
    你贴的这段代码,是用来初始化SDRAM的
    另:ARM指令 LDR 和 ADR的一些区别

    LDR 是ARM中的指令,也是伪指令。

    当用 LDR r, =imd  // r 为寄存器, imd为立即数

    LDR 是一条伪指令。编译器会根据 立即数的大小,决定用 ldr 指令或者是mov或mvn指令。

    当imd能用mov或者mvn操作时,就将它翻译成一条mov或mvn指令。当imd大于mov或mvn能够操作的数时,编译器会将imd存在一个内存单元中,然后再用一条ldr指令加载这个内存单元的的值到寄存器中。

    LDR r, label  和 LDR r, =label的区别:

    LDR r, =label 会把label表示的值加载到寄存器中,而LDR r, label会把label当做地址,把label指向的地址中的值加载到寄存器中。

    譬如 label的值是 0x8000, LDR r, =label会将 0x8000加载到寄存器中,而LDR r, label则会将内存0x8000处的值加载到寄存器中。

    ADR 和 ADRL 伪指令:

    ADR 和 ADRL 伪指令用于将一个地址加载到寄存器中。

    ADR为小范围的地址读取伪指令。ADR指令将基于PC相对偏移的地址值读取到寄存器中。在汇编编译源程序时,ADR伪指令被编译器替换在一条合适的指令,通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能使用一条指令实现,则产生错误。其能加载的地址范围,当为字节对齐时,是-1020~1020,当为非字对齐时在-255~255之间。

    ADRL是中等范围的地址读取指令。会被编译器翻译成两条指令。如果不能用两条指令表示,则产生错误。

    ADRL能加载的地址范围当为非字节对齐时是-64K~64K之间;当为字节对齐时是-256K~256K之间。

  • 相关阅读:
    php jquery+ajax写批量删除
    thinkphp 验证码
    thinkphp 框架中的一部分方法解析
    ThinkPHP框架的增删改
    ThinkPHP 框架模型
    ThinkPHP框架之空控制器
    江苏省盐城市响水县运河镇开源路商业街商铺及套间招商招租出售
    苏州鼎耀文化传媒有限公司
    怎么给罗技K480 增加Home、End键
    C#实现APK自动打包
  • 原文地址:https://www.cnblogs.com/qiuheng/p/5741250.html
Copyright © 2011-2022 走看看