ARM LOAR-STORE指令

变址模式 数据 基址寄存器 示例
回写前变址 mem[base+offset] 基址寄存器加上偏移 LDR r0,[r1,#4]!
前变址 mem[base+offset] 不变 LDR r0,[r1,#4]
后变址 mem[base] 基址寄存器加上偏移 LDR r0,[r1],#4

PRE

r0=0x00000000
r1=0x00009000
mem32[0x00009000]=0x01010101
mem32[0x00009004]=0x02020202

回写前变址:

LDR r0,[r1,#4]!

POST(1)

r0=0x02020202
r1=0x00009004

前变址:

    LDR r0,[r1,#4]

POST(2)

r0=0x02020202
r1=0x00009000

后变址:

    LDR r0,[r1],#4

POST(3)

    r0=0x01010101
    r1=0x00009004
寻址模式 指令 r0= r1+=
回写前变址
LDR r0,[r1,#4]!

LDR r0,[r1,r2]!

LDR r0,[r1,r2,LSR#4]!


mem32[r1+0x4]

mem32[r1+r2]

mem32[r1+(r2 LSR 0x4)]


0x4

r2

(r2 LSR 0x4)

前变址
LDR r0,[r1,#4]

LDR r0,[r1,r2]

LDR r0,[r1,-r2,LSR#4]


mem32[r1+0x4]

mem32[r1+r2]

mem32[r1-(r2 LSR 0x4)]


0

0

0

后变址
LDR r0,[r1],#4

LDR r0,[r1],r2

LDR r0,[r1],r2,LSR#4


mem32[r1]

mem32[r1]

mem32[r1]


0x4

r2

(r2 LSR 0x4)

多寄存器:

<LDM|STM>{<cond>}<寻址模式>Rn{!},<Registers>{r^}
寻址模式 描述 起始地址 结束地址 Rn!
IA 执行后增加 Rn Rn+4*N-4 Rn+4*N
IB 执行前增加 Rn+4 Rn+4*N Rn+4*N
DA 执行后减少 Rn-4*N+4 Rn Rn-4*N
DB 执行前减少 Rn-4*N Rn-4 Rn-4*N
r0=0x00080010

    LDMIA=r0!,{r1-r3}
         0x00080020       0x00000000b
    ---->0x0008001C       0x00000000a
         0x00080008       0x000000009---->r3
         0x00080004       0x000000008---->r2
r0  ---->0x00080010       0x000000007---->r1
         0x0008000C       0x000000006

    LDMIB=r0!,{r1-r3}
         0x00080020       0x00000000b
    ---->0x0008001C       0x00000000a---->r3
         0x00080008       0x000000009---->r2
         0x00080004       0x000000008---->r1
r0  ---->0x00080010       0x000000007
         0x0008000C       0x000000006

    LDMDA=r0!,{r1-r3}
         0x00080020       0x000000005
    ---->0x0008001C       0x000000004---->r3
         0x00080008       0x000000003---->r2
         0x00080004       0x000000002---->r1
r0  ---->0x00080010       0x000000001
         0x0008000C       0x000000000
时间: 2024-10-07 11:21:59

ARM LOAR-STORE指令的相关文章

ARM指令集----杂项指令

ARM指令集可以分为6类,即是跳转指令,数据处理指令,程序状态传输指令,Load.Store指令,协处理器指令和异常中断指令 跳转指令: 在ARM中有两种方式可以实现程序的跳转,一种是跳转指令,另一种是直接向PC寄存器写入目标地址的值 通过直接向PC寄存器写入目标寄存器的数字可以实现在4GB 地址空间的任意跳转,这种跳转又称为长跳转,如果在残肢令前面使用MOV LR,PC等指令,可以保存返回来的地址值,这样就实现了在4GB空间中的子程序调用 ARM的跳转指令可以从当前指令向前或者是向后的32位的

ARM重要汇编指令记录

IMPORT ,定义表示这是一个外部变量的标号,不是在本程序定义的EXPORT ,表示本程序里面用到的变量提供给其他模块调用的.以上两个在汇编和C语言混合编程的时候用到 ENDP    表示PROC所定义的过程结束. (end procedure)ENDS    表示SEGMENT定义的段结束.   (end segment)END     程序结束. B.BL.BX.BLX 和 BXJ跳转.带链接跳转.跳转并切换指令集.带链接跳转并切换指令集.跳转并转换到 Jazelle 状态. 状态寄存器传

ARM 内核 汇编指令 的 8种 寻址方式

str: store register ->指令将寄存器内容存到内存空间中, ldr:  load register 将内存内容加载到通用寄存器, ldr/str 组合来实现ARM CPU 和内存数据的 交换! 1.mov r1,r2;  //寄存器r2的内容复制到r1中,寄存器寻址方式,(r1,r2 ARM中的通用寄存器) 2.mov r0,#0xFF00; //数0xFF00复制到r0中,立即寻址方式,(#代表后面跟一个数) 3.mov r0,r1,lsl #3; //将r1中的内容左移三位

Android 图解逆向工程中ARM常用汇编指令(一)

我们走得太快,灵魂都跟不上了. 微小的幸福就在身边,容易满足就是天堂. 在逆向和爆破中我们经常会在IDA中接触到汇编,一般做安卓的不会太了解VB回编等,不太了解的同学可以先查看上篇文章<Android ARM常用的汇编指令合集> 再来继续我们的学习,我们先来看张图. 这个view里面有 PUSH/LDR/SUB/MOVS/BLX/SUBS/BEQ/CMP ,这些差不多都是常见的,不过也不需要看得懂,理解这个指令即可,接下来我们就来分析下这些指令分别有什么作用吧. 先引入 概念性 东西,免得大家

arm跳转指令对应的机器码

ARM: 常见跳转指令机器码: B:0xEA BL:0xEB 偏移地址计算过程: (目标地址 - 指令地址 - 8)/ 4 = 偏移 // 减8,指令流水造成. // 除4,因为指令定长,存储指令个数差,而不是地址差. 完整指令: 假设上一步得到的偏移为0x00000C 跳转指令为:B 则完整指令为:0C 00 00 EA THUMB: Thumb指令都是2字节.BL看起来像4字节指令,其实是一个误解,因为长跳转是由两条跳转指令组成的. 0~11位表示11位地址,具体含义如下: 第11位为0,偏

[国嵌笔记][027][ARM协处理器访问指令]

协处理器作用 协处理器用于执行特定的处理任务,如数学协处理器可以执行控制数字处理,以减轻处理器的负担.ARM处理器最多可以支持16个协处理器,其中CP15是最重要的一个协处理器 CP15的作用 CP15是系统控制协处理器,通过额外的寄存器可以控制cache,MMU,系统时钟等功能 访问协处理器 1.CP15有16组寄存器,通过mcr和mrc指令来访问协处理器里的寄存器,从而达到访问协处理器的目的 2.通过datasheet中的CP15 register map summary可以查找到相关的寄存

ARM指令集—SWP指令

SWP和SWPB是ARM指令集中对存储单元的原子操作,即对存储单元的一次读和一次不可被分割.SWP和SWPB分别完成存储器和寄存器之间 一个字(32bit)和一个字节(8bit)的数据交换. SWP指令主要是完成ARM体系架构处理器的同步操作,在Linux操作系统中实现信号量的操作.但是此指令在ARMv6架构后就没有采用了,而是通过扩展的LDREX和STREX实现.本片文章主要介绍SWP的功能,对于LDREX和STREX以后再介绍. SWP的指令格式如下: SWP {}{B}  Rd,  Rm,

ARM常用汇编指令介绍

b     跳转指令(跳转范围为32Mb) bl    带返回地址的跳转,指令自动将下一条指令的地址复制到R14寄存器,然后跳转到指定地址去执行,执行完后返回到下一条指令处执行 pc    寄存器R15,程序计数器指向当前执行的程序地址 lr    寄存器R14,链接寄存器保存程序跳转时的返回地址 ldr   从内存中读取数据加载到寄存器中 str   将寄存器中的数据保存到内存 mov   寄存器与寄存器之间的数据传送指令,也可以将立即数传给目标寄存器 add   加法指令 sub   减法指

ARM 常用汇编指令

ARM 汇编程序的框架结构 .section .data <初始化的数据> .section.bss <未初始化的数据> .section .text .global _start _start: <汇编代码> 注意: 一般是将上面结构进行简化 .text .global  _start _start: <汇编代码> 寄存器操作指令: 算术和逻辑指令: MOV :用于将一个寄存器或被移位寄存器或一个立即数移动到目的寄存器 MOV  r1 ,#8 (注意:#+

ARM汇编-str指令

STR指令的格式为:STR{条件}  源寄存器,<存储器地址>STR指令用亍从源寄存器中将一个32位的字数据传送到存储器中.该指令在程序设计中比较常用,丏寻址方式灵活多样,使用方式可参考指令LDR. 指令示例:STR R0,[R1],#8             :将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1.STR R0,[R1,#8]             :将R0中的字数据写入以R1+8为地址的存储器中.” STR     r1, [r0]