ARM指令adr和ldr的区别

2020-03-25来源: eefocus关键字:ARM指令  adr  ldr

很多人在写简单的裸机代码或分析uboot时,常常遇到adr和ldr指令。却分不清这2者的区别,现在谈谈adr与ldr指令。先写启动代码start.S。


.text

.globl _start

_start:

    ldr r0, test

    adr r0, test

    ldr r0, =test

    nop

test:

    nop

Makefile文件内容如下:


all : start.S

arm-linux-gcc -c -o start.o start.S

arm-linux-ld -Ttext 0x00000000 -g start.o -o start_elf

arm-linux-objcopy -O binary -S start_elf start.bin

arm-linux-objdump -D -m arm start_elf > start.dis

clean:

rm -f *.dis  *.bin  start_elf  *.o

反汇编start.S得到start.dis:


file format elf32-littlearm

Disassembly of section .text:

00000000 _start:

0: e59f0008 ldr r0, [pc, #8]; 10 test

4: e28f0004 add r0, pc, #4; 0x4

8: e59f0004 ldr r0, [pc, #4]; 14.text+0x14

c: e1a00000 nop (mov r0,r0)

 

00000010 test:

10:e1a00000 nop (mov r0,r0)

14:00000010 andeq r0, r0, r0, lsl r0


1、先分析第一条指令ldr r0,test被编译成ldr r0, [pc, #8],即到当前PC+8的存储器取值,运行第一条指令时,PC其实已经是8了(流水线决定的)。那么8+8等于0x10,所以r0等于e1a00000,此指令的作用就是读取test地址处存放的值。由于此处放了一条nop,即得到nop的机器码。


2、第二条adr r0,test被编译成add r0, pc, #4 这显然是依赖程序执行到此处的PC值。ADR是小范围地址读取伪指令,会将基于PC 相对偏移的地址值读取到寄存器中,此指令在4地址,PC是4+8=0xc再加4,于是r0=0x10。从结果上来看,test自身的值(标号值),被读到了r0,这个值是以PC为参考的,也就是test对应的指令(第二个nop)当前的地址。r0=(标号test的地址与此指令的距离差)+(此指令的地址)=((0x10-0x4=12)+(4))=16=0x10。假如在0x30000000以上运行,r0=((12)+(0x30000004))= 0x30000010。


3、ldr r0,=test被编译成两个字,一个指令,一个文字池。执行到这里PC=8, 8+8+4=0x14,所以在14地址取值,编译器在14地址处放了0x00000010,0x00000010是test的值,假如在Makefile指定连接地址是0x30000000,那么编译器放在这里的就是0x30000010,可见,这个值是编译时确定的。最后一行andeq r0, r0, r0, lsl r0大概是编译器的机械动作,把一个数字翻译成了指令。

关键字:ARM指令  adr  ldr 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic492496.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:tiny4412开发板GPIO试验
下一篇:tiny4412裸机程序之位置无关码

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

常用ARM汇编指令及ATPCS规则
cpsr, r0 /* 复制r0到cpsr中 */mrs r0, cpsr /* 复制cpsr到r0中 */6.其他伪指令在本书的汇编程序中,常常见到如下语句:.extern main.text.global _start_start:".extern"定义一个外部符号(可以是变量也可以是函数),上面的代码表示本文件中引用的main是一个外部函数。".text"表示下面的语句都属于代码段。".global"将本文件中的某个程序标号定义为全局的,比如上面的代码表示_start个全局函数。7.汇编指令的执行条件大多数ARM指令都可以条件执行,即根据cpsr寄存器中的
发表于 2020-03-26
常用ARM汇编指令及ATPCS规则
ARM e7f000f0 udf 指令异常
(base, len); return; }static inline void a_crash(){ __asm__ __volatile__(#ifndef __thumb__ ".word 0xe7f000f0"#else ".short 0xdeff"#endif : : : "memory");}当musl发现内存可能会double free的情况下,会主动调用a_crash(),即插入一条arm的udf指令。 主动trap程序crash。其实想想这样也比较科学,避免一些allocator实现下因为double free导致内存链表trash的问题。往往
发表于 2020-03-14
ARM处理器的未定义指令异常处理过程分析
在前面的两篇文章中已经介绍了ARM处理器的工作模式和ARM异常中断处理流程。这篇文章我们通过代码来详细介绍ARM处理器未定义指令的异常中断处理;当发生未定义指令异常中断时,CPU进入未定义指令模式。可以通过读取CPSR寄存器的值来判定是否真的进入了未定义指令模式。开发板:tiny4412;工具链版本:gcc version 4.5.1 (ctng-1.8.1-FA)主要设置以下几个文件:start.S文件,详细内容如下:.text.global _start_start: b reset /* vector 0x46000000 reset*/ ldr pc, _undefined_instruction
发表于 2020-03-08
【ARM裸板】未定义指令异常分析及示例
1.未定义指令异常示例根据5.1可知,执行异常处理函数之前,硬件会处理的事情: 1.lr_und保存有被中断模式中的下一条即将执行的指令的地址 2.SPSR_und保存被中断模式CPSR 3.CPSR的[M4:M0]=[11011],进入到und模式 4.跳到0x04的模式执行程序,即跳到b do_und这一指令/*====================================异常向量表===========================================*/_start: b reset   //vector 0: reset(0地址对
发表于 2020-03-06
【ARM裸板】未定义指令异常分析及示例
ARM指令中的"8位图"立即数格式
最近在学习"ARM9 原理和应用设计"一书. 书中在介绍ARM指令格式的时候, 指出:"ARM 指令中, 第二个操作数 (operand2) 如果是常数表达式的话, 该常数须对应8位位图 (Pattern), 即常数是由一个8位的常数循环移位偶数位得到的. 如 0x3FC, 0, 200 等是合法常量, 0x1FE, 511 等就是非法常量."一开始我对这句话不是很明白, 书上举出的例子也没有想通. 于是打算从源头——ARM 指令格式开始研究.一条典型的 ARM 指令的基本格式是 <opcode> {<cond>} {S} <Rd> ,<
发表于 2020-02-24
arm汇编adrl(以及ldr与adr的区别)
为 16 字节,或与此点的相关性更高,则远程地址的范围可更大。查看ADRL的同时,看到篇讲述ldr与adr的区别的博文,感觉写的很好,摘录下来。http://coon.blogbus.com/logs/2738861.htmlldr r0, _start adr r0, _start ldr r0, =_start nop mov pc, lr_start: nop 编译的时候设置 RO 为 0x0c008000↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓0c008000 <_start-0x14>: c008000: e59f000c ldr r0, [pc, #12
发表于 2020-02-26
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved