[置顶] 第6章 andriod ARM 实战番外篇 3

ARM 实战汇编内存操作

 

1、 使用工具ARM ADS

 

内存操作就是跟寄存器之间的转换,有寄存器和内存的转换,也有内存和寄存器之间的转换。

 

内存和寄存器之间分为:单寄存器的操作、多寄存器的操作

 

单寄存器的操作分为:

LDR  Rn,Addn  按照字长读取

例子:    MOV R1,0x12

                  LDRR0,[R1]

                  结果是将R1的内存地址给R0,这个就是之前提到的小端模式

                  什么是小端模式就是低位放低地址,高位放高地址

                  内存的值是以字长度而来的

 

STRRn,Addn

例子:    MOV R1,#0x12

                  STR R1,[R0,#0x0C]

                  结果是把#0x12的值写到0x0C内存地址内

[置顶] 第6章 andriod ARM 实战番外篇 3_第1张图片


LDRB        Rn,Addn         按照字节长读取

例子:    MOV R1,0x12

                  LDRBR0,[R1]

                  结果是将FF内存地址给R0寄存器

 

STRB        Rn,Addn         按照字节长读取

例子:    MOV R1,0x12

                  STRBR0,[R1]

                  结果是将R0寄存器地址00给R1内存中的FF位

 

LDRH        Rn,Addn按照半字节长读取

例子:    MOV R1,0x12

                  LDRBR0,[R1]

                  结果是将FFEF0000内存地址给R0寄存器

 

 

 

 

STRH   Rn,Addn 按照半字节长读取

例子:    MOV R1,0x12

                  LDRBR0,[R1]

                  结果是将R0寄存器地址0000给R1内存中的FFEF位

 

多寄存器的操作分为:

地址模式分为:

1)       数据块的模式为IA(传输地址之后加4)

2)       数据块的模式为IB(传送地址之前加4)

3)       数据块的模式为DA(传送后地址减4)

4)       数据块的模式为DB(传送前地址减4)

堆栈模式分为:

1)       EA(空递减堆栈)

2)       EB(满递减堆栈)

3)       ED(空递增堆栈)

4)       FA(满递增堆栈)

 

LDM                  LDMIAR0,{R3-R9}按照多寄存器读取

例子:    MOV R1,0xf

                  LDMIAR1,{R2-R4}

                  结果是将R1的寄存器中的内存地址给R2,R2的内存地址减4给R3,R3的内存地址减4给R4

STM          STMIA R0,{R3-R9}按照多寄存器写入

例子         MOV R1,0x4

                  STMIAR1,{R2-R4}

                  结果是将R1的寄存器的地址开始重新写入R2-R4新的内存值

 

 

数据交换操作分为:

 

SWP        Rn,R1,[Rn2]  内存和寄存器之间交换

例子         MOV R1,#0x0f

                  MOV R2,#0x12

                  SWP R0,R1,[R2]

                  结果将R2的0x12给R0,接着将R1的0x0f写入到R2的内存中去

 

跳转指令分为:

 

BL 带返回链接跳转指令

AREA hello,CODE,READONLY

         ENTRY

START

 

         Bstrom

         MOVR1,#0x0f

         MOVR2,#0x12

         SWPR0,R1,[R2]

        

         MOVR1,#0x4

         STMIAR1,{R2-R4} 

seond

         LDRBR0,[R1]

         MOVPC,LR

strom

         BLseond

         STRR1,[R0,#0x0C]

         END

 

MRS        把程序状态寄存器值传送到通用寄存器里

 

 

你可能感兴趣的:([置顶] 第6章 andriod ARM 实战番外篇 3)