(转)为什么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之间。

时间: 2024-11-03 15:27:54

(转)为什么adrl r2,mem_cfg_val这里不用ldr r2,=mem_cfg_val的相关文章

Oracle 10g R2升级到Oracle 11g R2

Oracle 10g R2升级到Oracle 11g R2 系统环境: 操作系统:RedHat EL55 Oracle 软件: Oracle 10g R2.Oracle 11g R2 Oracle 升级线路 本案例是从Oracle 10.2.0.4.0升级到Oracle 11.2.0.1.0 参考文档: Oracle patch CPU Update: http://tiany.blog.51cto.com/513694/846066 Oracle 10g 升级(10.2.0.1.0升级到10.

部署FIM 2010 R2—4安装FIM 2010 R2 Synchronization Service

部署FIM 2010 R2-4安装FIM 2010 R2 Synchronization Service 1.打开FIM2010 R2安装控制台,选择"Install Synchronization Service" 2.选择"下一步", 同意许可,选择"下一步", 保持默认, 3.为FIM同步服务指定数据库和实例, 4.为FIM同步服务指定服务账户,如下图,(注:Domain必须写为contoso,而不是contoso.com) 5.使用默认组

部署FIM 2010 R2—3安装FIM 2010 R2 Service and Portal

部署FIM 2010 R2-3安装FIM 2010 R2 Service and Portal 1.打开FIMSplash文件,如下图, 选择"Install Service and Portal", 2.选择"下一步", 选择"下一步", 选择"下一步", 3.选择要安装的角色,这里我们全部安装, 4.为FIM服务器指定SQL 2008数据库服务器名称以及FIM数据库名称,这里使用本地数据库服务,数据库名称使用默认名称, 5

【玩转开源】BananaPi R2——移植RPi.GPIO 到 R2

1. 首先给大家介绍一下什么是RPi.GPIO. 简单去讲,RPi.GPIO就是一个运行在树莓派开发板上可以通过Python去控制GPIO的一个中间件. 现在我这边做了一个基础功能的移植,接下来大家可以跟着我去学习一下RPi.GPIO是如何通过Python去实现控制开发板上的GPIO的. 2. 看一下效果图: 2.1 硬件实物运行效果 2.2 执行Python脚本打印的log 3. 那么RPi.GPIO在R2上是如何使用的呢? 3.1 首先在R2上面运行一个Ubuntu镜像,然后下载代码:git

记录在Windows Server 2008 R2 中安装Oracle 11g r2

下载过程略,下载后将两个压缩包解压,合并: 右键管理员执行安装程序: 此步骤可跳过 选择仅安装数据库软件 选择 单实例数据库安装: 选择语言,略 选择版本:企业版 配置目录: 先决条件检查.通过(如果出现错误.警告,请先解决后再重试以上操作) 开始执行安装: 进度条跑完后,关闭软件安装程序,开始安装oracle实例和监听程序: 选择监听程序配置: 添加: 监听程序名 默认即可 监听协议 默认TCP 监听端口 默认1521 是否配置另一个监听程序?否 完成,监听程序配置完成. 确定监听服务是否开启

uboot在s3c2440上的移植(3)

一.移植环境 主  机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2.tgz u-boot:u-boot-2009.08.tar.bz2 二.移植步骤 5)准备进入u-boot的第二阶段(在u-boot中添加对我们开发板上Nand Flash的支持).目前u-boot中还没有对2440上Nand Flash的支持,也就是说要想u-boot从Nand Flash上启动得自己去实现了.

u-boot-2014.10移植第29天----nand flash的SPL启动(一)

硬件平台:tq2440 开发环境:Ubuntu-3.11 u-boot版本:2014.10 本文允许转载,请注明出处:http://blog.csdn.net/fulinus 前面在移植nand flash启动时做了很多探索性的工作,但是后来发现在relocate.S文件中调用的函数中有调用大部分的库函数,牵扯到的文件较多,很难将它们一一包含到前面4K空间中去.正在想其他方法时,突然意识到SPL功能.我初步了解了一下SPL的功能,简而言之是一个将u-boot从nand flash拷贝到SDRAM

U-BOOT 移植到友善之臂mini2440

U-BOOT 移植到友善之臂mini2440 开发环境:ubuntu 10.10 编译器:友善之臂mini2440光盘自带arm-linux-gcc 4.4.3 一. 在denx官网下载源码,我所用版本号为u-boot-2010.03. 二. 主机编译环境为友善之臂提供的arm-linux-gcc.所參考板子为smdk2410. 三. 启动第一阶段移植过程 1.首先測试编译环境,由于arm-linux-gcc,已经添?了PATH环境变量,在lib_arm文件夹下的config.mk 定义了CRP

转:AM335x启动流程(BootRom->MLO->Uboot)

http://blog.chinaunix.net/uid-28458801-id-3486399.html 参考文件: 1,AM335x ARM Cortex-A8 Microprocessors (MPUs) Technical Reference Manual.pdf: 2,am3359.pdf: 1,am335x的cpu上电后,会跳到哪个地址去执行? 答: 芯片到uboot启动流程 :ROM → MLO(SPL)→ uboot.img AM335x 中bootloader被分成了 3 个