adr adrl ldr伪指令的使用

1ADR伪指令--- 小范围的地址读取 ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。

 

ADR伪指令格式:ADR{cond} register, expr 地址表达式expr的取值范围:当地址值是字节对齐时,其取指范围为: +255 255B;当地址值是字对齐时,其取指范围为: -1020 1020B

 

2ADRL伪指令----中等范围的地址读取 ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。

 

ADRL伪指令格式:ADRL{cond} register, expr 地址表达式expr的取值范围:当地址值是字节对齐时,其取指范围为: -64K64K;当地址值是字对齐时,其取指范围为: -256K256K

 

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

 

 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fjiale/archive/2009/12/28/5089090.aspx

 

 

 

ARM汇编语言伪指令
ARM中伪指令不是真正的ARM指令或者Thumb指令,这些伪指令在汇编编译时对源程序进行汇编处理时被替换成对应的ARM或Thumb指令(序列)。ARM伪指令包括ADR、ADRL、LDR和NOP等。
1、ADR(小范围的地址读取伪指令)
该指令将基于PC的地址值或基于寄存器的地址值读取到寄存器中。
语法格式
ADR{cond} register, expr
其中,cond为可选的指令执行的条件
      register为目标寄存器
      expr为基于PC或者基于寄存器的地址表达式,其取值范围如下:
当地址值不是字对齐时,其取值范围为
-255~255.
当地址值是字对齐时,其取值范围为
-1020~1020
当地址值是16字节对齐时,其取值范围将更大

在汇编编译器处理源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能。
因为ADR伪指令中的地址是基于PC或者基于寄存器的,所以ADR读取到的地址为位置无关的地址。当ADR伪指令中的地址是基于PC时,该地址与ADR伪指令必须在同一个代码段中。
示例
start MOV r0,#10 ;因为PC值为当前指令地址值加8字节
ADR r4, start ;本ADR伪指令将被编译器替换成
SUB r4,pc,#0xc
2、 ADRL(中等范围的地址读取伪指令)

该指令将基于PC或基于寄存器的地址值读取到寄存器中。ADRL伪指令比ADR伪指令可以读取更大范围的地址。ADRL伪指令在汇编时被编译器替换成两条指令,即使一条指令可以完成该伪指令的功能。
语法格式
ADRL{cond} register,expr
示例
start MOV r0,#10 ;因为PC值为当前指令地址值加8字节
ADRL r4,start+60000 ;本ADRL伪指令将被编译器替换成下面两条指令
ADD r4,pc,#0xe800
ADD r4,r4,#0x254
3
、LDR(大范围的地址读取伪指令)
LDR伪指令将一个32位的常数或者一个地址值读取到寄存器中
语法格式
LDR{cond} register, =[expr|label-expr]
其中,expr为32位的常量。编译器将根据expr的取值情况,如下处理LDR伪指令:
当expr表示的地址值没有超过MOV或MVN指令中地址的取值范围时,编译器用合适的MOV或MVN指令代替该LDR伪指令
当expr表示的地址值超过了MOV或者MVN指令中地址的取值范围时,编译器将该常数放在数据缓冲区中,同时用一条基于PC的LDR指令读取该常数。
label-expr为基于PC的地址表达式或者是外部表达式。当label-expr为基于PC的地址表达式时,编译器将label-expr表示的数值放在数据缓冲区(literal pool)中,然后将该LDR伪指令处理成一条基于PC到该数据缓冲区单元的LDR指令,从而将该地址值读取到寄存器中。这时,要求该数据缓冲区单元到PC的距离小于4KB。当label-expr为外部表达式,或者非当前段的表达式时,汇编编译器将在目标文件中插入一个地址重定位伪操作,这样连接器将在连接时生成该地址。
LDR伪指令主要有以下两种用途:
当需要读取到寄存器中的数据超过了MOV及MVN指令可以操作的范围时,可以使用LDR伪指令将该数据读取到寄存器中。
将一个基于PC的地址值或者外部的地址值读取到寄存器中。由于这种地址值是在连接时确定的,所以这种代码不是位置无关的。同时LDR伪指令的PC值到数据缓冲区中的目标数据所在的地址的偏移量要小于4KB。
示例
将0xff0读取到R1中
LDR R1
=0xFF0
汇编后将得到:

MOV R1
0xFF0
将0xfff读取到R1中

LDR R1
=0xFFF
汇编后将得到:

LDR R1
[PC,OFFSET_TO_LPOOL]

LPOOL DCD 0xFFF
将外部地址ADDR1读取到R1中

LDR R1
=ADDR1
汇编后将得到:

LDR R1
[PC,OFFSET_TO_LPOOL]

LPOOL   DCD ADDR1
4、NOP空操作伪指令

在汇编时将被替换成ARM中的空操作,如MOV R0,
R0
NOP伪指令不影响CPSR中的条件标志位

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值