ARM 汇编指令 ADR 与 LDR 使用
简介
这两个都是伪指令:ADR 是小范围的地址读取伪指令,LDR 是大范围的读取地址伪指令。可实际使用的区别是: ADR 是将基于 PC 相对偏移的地址值或基于寄存器相对地址值读取的伪指令,而 LDR 用于加载 32 位立即数或一个地址到指定的寄存器中。
以下面的汇编代码为例:
.global _start
_start:
ldr r0, loop
adr r0, loop
ldr r0, =loop
loop:
nop
用以下命令完成汇编、链接操作,并输出反汇编文件
[root@localhost asm]# arm-linux-gcc asm.S -o asm.o -c
[root@localhost asm]# arm-linux-ld -Ttext 0x1004 asm.o -o link.elf
[root@localhost asm]# arm-linux-objdump -D link.elf > link.dis
反汇编代码如下:
link.elf: file format elf32-littlearm
Disassembly of section .text:
00001004 <_start>:
1004: e59f0004 ldr r0, [pc, #4] ; 1010 <loop>
1008: e28f0000 add r0, pc, #0
100c: e59f0000 ldr r0, [pc, #0] ; 1014 <loop+0x4>
00001010 <loop>:
1010: e320f000 nop {0}
1014: 00001010 andeq r1, r0, r0, lsl r0
反汇编文件分析
ARM9 特性:PC 指向当前指令地址 +8 的位置。
1.ldr r0, loop
这是一条指令,从内存地址 loop 的位置把值读入。在这里 loop 是一个标号(是一个相对程序的表达式),汇编程序计算相对于 PC 的偏移量,并生成相对于 PC 的索引指令:ldr r0, [pc, #4]。执行指令后,r0 = e320f000。
2.adr r0, loop
这是一条伪指令,总是会被汇编程序汇编为一个指令。汇编程序尝试产生单个 ADD 或 SUB 指令来装载该地址。如果不能在一个指令中构造该地址,则生成一个错误,并且汇编失败。在这里是取得标号 loop 的地址到 r0,该代码可以在和标号相对位置不变的情况下移动:假如这段代码在 0x30000000 运行,那么 adr r0, loop 得到 r0 = 0x3000000c;如果在地址 0 运行,就是 0x0000000c 了。
3.ldr r0, =loop
这是一条伪指令,是一个相对程序的或外部的表达式。汇编程序将相对程序的标号表达式 label-expr 的值放在一个文字池中,并生成一个相对程序的 LDR 指令来从文字池中装载该值。如果 label-expr 是一个外部表达式,或者未包含于当前段内,则汇编程序在目标文件中放置一个链接程序重定位命令,程序取链接时生成的地址,因此取得的是标号 loop 的绝对地址,这个绝对地址是在链接的时候确定的。它要占用 2 个 32bits 的空间,一条是指令,另一条是文字池中存放 loop 的绝对地址。因此可以看出,不管这段代码将来在什么地方运行,它的结果都是 r0 = 0x00001010。
参考自:blog.sina.com.cn/s/articlelist_1263669380_0_1.html
ARM 汇编指令 ADR 与 LDR 使用的更多相关文章
- 汇编指令-adr与ldr伪汇编区别(8)
adr :相对寻址,与当前位置有关 ldr :绝对寻址,与当前位置无关 在初始化SDRAM时就会用到adr,代码如下: /* 初始化SDRAM */ ldr r0,=BWSCON //r0=SDRA ...
- 常用ARM汇编指令
常用ARM汇编指令 [日期:2012-07-14] 来源:Linux社区 作者:xuyuanfan77 [字体:大 中 小] 在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初 ...
- ARM汇编指令的一些总结-转
ARM汇编指令的一些总结ARM汇编指令很多,但是真正常用的不是很多,而且需要认真琢磨的又更少了.比较有用的是MOV B BL LDR STR还是通过具体汇编代码来学习吧.@ disable watch ...
- ARM汇编指令特点
根据朱有鹏老师课程笔记整理而来: (汇编)指令是CPU机器指令的助记符,经过编译后会得到一串1 0组成的机器码,由CPU读取执行. (汇编)伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器 ...
- ARM汇编指令调试方法
学习ARM汇编时,少不了对ARM汇编指令的调试.作为支持多语言的调试器,gdb自然是较好的选择.调试器工作时,一般通过修改代码段的内容构造trap软中断指令,实现程序的暂停和程序执行状态的监控.为了在 ...
- ARM汇编指令(未完待续)
ARM指令自己在看的时候,看完之后就忘了,根本记不住,而且有些ARM汇编指令在平常的时候可能根本就用不到,所以也没必要把所有的ARM指令都去记忆,所以自己就想着不去一遍一遍的复习ARM指令,而是在平常 ...
- ARM指令adr adrl ldr mov
ADR是一条小范围的地址读取伪指令,它将基于PC的相对偏移的地址值读到目标寄存器中.格式:ADR register,exper. 编译源程序时,汇编器首先计算当前PC值(当前指令位置)到exper的距 ...
- ARM 汇编指令
ARM汇编程序特点: l 所有运算处理都是发生通用寄存器(一般是R0~R14)的之中.所有存储器空间(如C语言变量的本质就是一个存储器空间上的几个BYTE).的值的处理,都是要传送到通 ...
- 经常使用ARM汇编指令
一面学习,一面总结,一面记录. 以下是整理在网上找到的一些资料,简单整理记录一下,方便以后查阅. ARM处理器的指令集能够分为跳转指令.数据处理指令.程序状态寄存器(PSR)处理指令.载入/存储指令. ...
随机推荐
- Sql Server常用数据库函数小结
查询验证存储过程是否存在 SELECT name FROM sysobjects WHERE xtype = 'P' and name = '{0}' ----------------------- ...
- VC6 LINK : fatal error LNK1168: cannot open Debug/Test.exe for writing
在使用VC++运行程序时,第一次没有任何问题,但是当再次运行时就会出现:LINK : fatal error LNK1168: cannot open Debug/Test.exe for writi ...
- ubuntu installs matlab2017a
cd mkdir matlab sudo mount -o loop *1.iso matlab sudo ./matlab/install ... sudo mount -o loop *2.iso ...
- 初识大数据(三. Hadoop与MPP数据仓库)
MPP代表大规模并行处理,这是网格计算中所有单独节点参与协调计算的方法. 是将任务并行的分散到多个服务器和节点上,在每个节点上计算完成后,将各自部分的结果汇总在一起得到最终的结果. MPP DBMS是 ...
- c++实现对windwos 下socket 的封装(实现封包及拆包处理)
SuperSocket.h #pragma once #include<string> #include<iostream> #include <WINSOCK2.H&g ...
- EF学习笔记(七):读取关联数据
总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 本篇参考原文链接:Reading Related Data 本章主要讲述加载显示关联数据: 数据加载分为以下三种 Lazy l ...
- ubuntu+apache2设置访问、重定向到https
环境:ubunt14裸机,apache2,php5 条件:证书(部分商家买域名送一年),域名,为了方便均在root用户下进行的 web目录:/var/www/test 证书目录(自建):/etc/ap ...
- C++与java中的赋值操作符
#include <iostream> using namespace std; class BankAccount{ private: double balance; public: B ...
- 学习Axure RP原型设计
1 概述 原型设计是应用开发设计的第一要素.好的原型设计不仅可以起到沟通的作用,而且对客户而言应用程序拥有更直观的体现.原型设计通过内容和结构展示以及界面布局编排,实现在开发前期用户与产品进行交互.提 ...
- QQ的成功,远没有你想象的那么顺利和轻松
本文来自公众号“傅老师”(ID:fustory)的原创分享,感谢作者. 1.引言 如果QQ是一个人,看似风光,其实从出生到成长,过程饱经错荡,堪算坎坷.它的人生历程确实也够励志的了. 学习交流: ...