ARM指令adr adrl ldr mov

ADR是一条小范围的地址读取伪指令,它将基于PC的相对偏移的地址值读到目标寄存器中。格式:ADR register,exper。

编译源程序时,汇编器首先计算当前PC值(当前指令位置)到exper的距离,然后用一条ADD或者SUB指令替换这条伪指令,

例如:ADD register,PC,#offset_to_exper。

注意,标号exper与指令必须在同一代码段。

比如:adr r0, _start ://将指定地址赋到r0中

.........

_start:
    b _start

r0的值为标号_start与此指令的距离差 + PC值。

ADRL:

这是一条中等范围的地址读取伪指令,它将基于PC的相对偏移的地址值读到目标寄存器中。格式:ADRL register,exper。编译源程序时,汇编器会用两条合适的指令替换这条伪指令。

比如:

ADD register,PC,offset1

ADD register,register,offset2

与ADR相比,它能读取更大范围的地址。

注意,标号exper与指令必须在同一代码段。

接下来是LDR,首先要说两个家伙,他们都叫LDR。

 

一个是LDR伪指令,一个是LDR指令,名字相同却不是一个东西。

区分的方法就是看第二个参数,如果有等号,就是伪指令

LDR指令:

例: ldr r0, 0x12345678

是把0x12345678这个地址中的值存放到r0中。而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中。

LDR伪指令:

例1(立即数): ldr r0, =0x12345678

这样,就把0x12345678这个地址写到r0中了。所以,ldr伪指令和mov是比较相似的。只不过mov指令限制了立即数的长度为8位,也就是不能超过512。而ldr伪指令没有这个限制。如果使用ldr伪指令,后面跟的立即数没有超过8位,那么在实际汇编的时候该ldr伪指令会被转换为mov指令。

例2(标号): ldr r0, =_start //将指定标号的值赋给r0

这里取得的是标号_start的绝对地址,这个绝对地址(运行地址)是在链接的时候确定的。它要占用 2 个32bit的空间,一条是指令,另一条是文字池中存放_start 的绝对地址。

对比adr r0, _start和 ldr r0, =_start

它们的目的一样,都是把标签的赋给r0,区别---左边是相对地址,右边绝对地址。目的一样,但结果不一定相同。结果是否相同,要看PC值是否和链接地址相同。

转自百问网

原文地址:https://www.cnblogs.com/CZM-/p/9611239.html

时间: 2024-11-02 12:56:54

ARM指令adr adrl ldr mov的相关文章

arm指令中mov和ldr的区别

ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令. 比如想把数据从内存中某处读取到寄存器中,只能使用ldr 比如: ldr r0, 0x12345678 就是把0x12345678这个地址中的值存放到r0中. 而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这个和x86这种CISC架构的芯片区别最大的地方. x86中没有ldr这种指令,因为x86的mov指令可以将数据从内存中移动到寄存器中. 另外还有一个就是l

头文件定义和ARM指令

2015.2.2星期一,阴天 内存管理:内存的分配和释放等静态和动态内存:主要是在释放方式上的区别 静态变量:编译时就已经确定,定义在函数外面自动变量:在程序运行时才能在栈中确定只读数据节:存放常量的地方,包括字符常量,不修改的数据 查看数据存放在那个节点:(用命令)readelf -S (查看节点号和节点名)readelf -x .data a.out 生命周期:(分成静态,动态) 两个宏的定义和包含: 定义一个a.h#ifndef _A_H_#define _A_H_............

ARM指令教程

ARM指令教程 ARM汇编程序特点: l         所有运算处理都是发生通用寄存器(一般是R0~R14)的之中.所有存储器空间(如C语言变量的本质就是一个存储器空间上的几个BYTE).的值的处理,都是要传送到通用寄存器来完成.因此代码中大量看到LDR,STR指令来传送值. l         ARM汇编语句中.当前语句很多时候要隐含的使用上一句的执行结果.而且上一句的执行结果,是放在CPSR寄存器里,(比如说进位,为0,为负…) CMP R0,R1 BNE NoMatch 比如上一句,BN

arm指令bne.w改成b,即无条件跳转

近期逆向一个程序,需要把bne.w改成b,无条件跳转.由于ios逆向不像pc上,可以在od里直接改汇编指令,这篇文章给了我很大的帮助.通过memory write 修改后,验证可行后,再用ultraedit修改二进制文件,保存可执行程序.再拷贝到ios设备,即可. 文章出处:http://blog.chinaunix.net/uid-22915173-id-225005.html ARM中的常用指令含义ADD 加指令SUB 减指令STR    把寄存器内容存到栈上去LDR    把栈上内容载入一

常用的ARM指令

数据处理指令 (1)数据传输指令 mov mvn (2)算术指令 add sub rsb adc sbc rsc (3)逻辑指令 and orr eor bic       //与或非 (4)比较指令 cmp cmn tst teq (5)乘法指令 mvl mla umull umlal smull smlal (6)前导零计数 clz        (用的不多) 详细分析: mov r1, r0     @两个寄存器之间数据传递,r0赋值给r1 mov r1, #0x0 @将立即数赋值给寄存器

ARM汇编中的LDR/STR

在ARM架构下,  数据从内存到CPU之间的移动只能通过LDR/STR指令来完成.而MOV只能在寄存器之间移动数据,或者把立即数移动到寄存器中,并且数据的长度不能超过8位 LDR,STR 的第一操作数是目标寄存器,第二操作数是内存地址, LDR 内存 --> 寄存器; STR 寄存器 --> 内存 内存的表示方式有:立即数,寄存器,或寄存器加偏移,立即数:内存的物理位置,前面加个#,如0x56000050 寄存器,加个[],如[r1],偏移的话[r1,r2],或者[r1,#4],[r1,LSL

iOS逆向工程之Hopper中的ARM指令

一.Hopper中的ARM指令 ARM处理器就不多说了,ARM处理器因为低功耗等原因,所以大部分移动设备上用的基本上都是ARM架构的处理器.当然作为移动设备的Android手机,iPhone也是用的ARM架构的处理器.如果你想对iOS系统以及你的应用进一步的了解,那么对ARM指令集的了解是必不可少的,ARM指令集应该也算得上是iOS逆向工程的基础了. 当你使用Hopper进行反编译时,里边全是ARM的指令,那是看的一个爽呢.下面就是使用Hopper打开MobileNote.app的一个Hoppe

实验二:ARM指令

实验器材 硬件 树莓派板子一块: 5V/1A电源一个: microUSB线一根: USB-TTL串口线一根(FT232RL芯片或PL2303芯片). PC(Windows/MacOS/Linux)一台: 以太网线一根: 路由器一台 软件 PC上的USB-TTL串口线配套的驱动程序: PC上的串口终端软件putty 实验步骤 给出各项测试所用的C代码和产生的汇编代码情况,并解释汇编代码 (1)生成了Thumb 指令还是 ARM 指令:如何通过编译参数改变,相同的程序,ARM和Thumb编译的结果有

(3) arm 指令

跳转指令1.1 B 跳转指令 B{cond} label 说明:如果条件cond满足,arm处理器将立即跳转到label指定的地址处继续执行. 1.2 BL 带链接的跳转指令 BL{cond} label 说明:如果条件cond满足,会首先将当前指令的下一条指令的地址拷贝到R14(LR), 然后跳转到label指定的地址处继续执行. 1.3 BX 带状态切换的跳转指令 BX{cond} Rm 如果条件cond满足,则处理器会判断rm的位[0]是否为1,如果为1则跳转时自动将 CPSR寄存器的标志