《adradrlldr伪指令》由会员分享,可在线阅读,更多相关《adradrlldr伪指令(3页珍藏版)》请在金锄头文库上搜索。
1、adr adrl ldr 伪指令的使用1、 ADR 伪指令 - 小范围的地址读取ADR 伪指令将基于PC 相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD 指令或 SUB 指令来实现该ADR 伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。ADR 伪指令格式:ADRcond register, expr 地址表达式expr 的取值范围:当地址值是字节对齐时,其取指范围为: +255 255B; 当地址值是字对齐时,其取指范围为: -1020 1020B;2、 ADRL 伪指令 -
2、中等范围的地址读取ADRL 伪指令将基于PC 相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR 伪指令可以读取更大范围的地址。在汇编编译器编译源程序时,ADRL 伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。ADRL 伪指令格式:ADRLcond register, expr 地址表达式expr 的取值范围:当地址值是字节对齐时,其取指范围为: -64K 64K; 当地址值是字对齐时,其取指范围为: -256K 256K;3、LDR 伪指令 - 大范围的地址读取LDR 伪指令用于加载32 位的立即数或一个地址值到指定寄存器。在汇编编译源程序
3、时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV 或 MVN 的范围, 则使用 MOV 或 MVN 指令代替该LDR 伪指令, 否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR 指令从文字池读出常量。本文来自CSDN博客,转载请标明出处:http:/ 汇编语言伪指令 ARM 中伪指令不是真正的ARM 指令或者 Thumb 指令,这些伪指令在汇编编译时对 源程序进行汇编处理时被替换成对应的ARM 或 Thumb指令(序列)。 ARM 伪指令 包括 ADR 、ADRL 、LDR和 NOP 等。 1、ADR (小范围的地址读取伪指令) 该指令将基于 PC的地址值或基于
4、寄存器的地址值读取到寄存器中。 语法格式 ADRcond register, expr 其中, cond 为可选的指令执行的条件register为目标寄存器expr为基于 PC或者基于寄存器的地址表达式,其取值范围如下:当地址值不是字对齐时,其取值范围为-255255. 当地址值是字对齐时,其取值范围为-10201020 当地址值是 16 字节对齐时,其取值范围将更大 在汇编编译器处理源程序时, ADR 伪指令被编译器替换成一条合适的指令。通常, 编译器用一条 ADD指令或 SUB指令来实现该 ADR 伪指令的功能。 因为 ADR伪指令中的地址是基于PC或者基于寄存器的,所以ADR读取到的地址
5、 为位置无关的地址。当ADR 伪指令中的地址是基于PC时,该地址与 ADR伪指令 必须在同一个代码段中。 示例 start MOV r0,#10 ;因为 PC值为当前指令地址值加8 字节 ADR r4, start ;本 ADR伪指令将被编译器替换成SUB r4,pc,#0xc 2、 ADRL (中等范围的地址读取伪指令) 该指令将基于 PC或基于寄存器的地址值读取到寄存器中。ADRL 伪指令比 ADR 伪 指令可以读取更大范围的地址。ADRL 伪指令在汇编时被编译器替换成两条指令, 即使一条指令可以完成该伪指令的功能。 语法格式 ADRLcond register,expr 示例 start
6、 MOV r0,#10 ;因为 PC值为当前指令地址值加8 字节 ADRL r4,start+60000 ;本 ADRL 伪指令将被编译器替换成下面两条指令 ADD r4,pc,#0xe800 ADD r4,r4,#0x254 3、LDR (大范围的地址读取伪指令) LDR伪指令将一个 32位的常数或者一个地址值读取到寄存器中 语法格式 LDRcond register, =expr|label-expr 其中, expr 为 32位的常量。编译器将根据expr 的取值情况,如下处理LDR伪 指令: 当 expr 表示的地址值没有超过MOV 或 MVN 指令中地址的取值范围时,编译器用 合适的
7、 MOV 或 MVN 指令代替该 LDR伪指令 当 expr 表示的地址值超过了MOV 或者 MVN 指令中地址的取值范围时,编译器将 该常数放在数据缓冲区中,同时用一条基于PC的 LDR指令读取该常数。 label-expr为基于 PC的地址表达式或者是外部表达式。 当 label-expr为基于 P C的地址表达式时,编译器将label-expr表示的数值放在数据缓冲区(literalpool )中,然后将该 LDR伪指令处理成一条基于PC到该数据缓冲区单元的LDR 指令,从而将该地址值读取到寄存器中。这时,要求该数据缓冲区单元到PC的 距离小于 4KB 。当 label-expr为外部表
8、达式,或者非当前段的表达式时,汇编 编译器将在目标文件中插入一个地址重定位伪操作,这样连接器将在连接时生成 该地址。 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 中的条件标志位