ldr作用是寄存器从内存中读取数据.把右边中括号[]中的地址里存的值,读取到左边面的寄存器中.
有下面几种格式:
LDR R0, [R1] ; R0←[R1]
LDR R0,[R1,#4] ;R0←[R1+4]
LDR R0,[R1,#4]! ;R0←[R1+4]、R1←R1+4
LDR R0,[R1] ,#4 ;R0←[R1]、R1←R1+4
LDR R0,[R1,R2] ;R0←[R1+R2]
#ifndef arm_h
#define arm_h
int fn1(int * a);
#endif /* arm_h */
#arm .s文件中函数的汇编代码
.text
.global _fn1,_fn2
_fn1:
ldr x1,[x0] //x0是参数1.因为传入的是变量地址,[x0]是把x0保存地址的值读取到x1
add x0,x1,1 //把x1的值+1存给x0,x0是函数返回值
ret
整个fn1()的作用是把,传入地址的值+1,再返回
#import "arm.h"
int a = 1;
int result = fn1(&a);
打印结果是result= 2
跟ldr一样,只不过,ldur通常后面的立即数是负数
ldur x1,[x0,#-1] ;//通常ldur 用来负数运算 代表x0的地址,-1的内存里的值,赋值给x1
ldr 计算地址是用正数运算,ldur通常用作负数运算
例如
ldur x1,[x0,#-1] //负数立即数
ldr x1,[x0,#1] //正数立即数
ldp x1,x2,[x0,#0x10]
把x0+0x10的地址开始的值,存入到x1和x2中
下面是lldb调试的过程,执行到ldp x1,x2,[x0,#0x10] 这条指令的时候查看x0的地址,之后把0x16d8d8e9c 的地址开始的前8个字节给x1,后8个字节给x2,如下
(lldb) re read x0
x0 = 0x000000016d8d8e8c
(lldb) x 0x000000016d8d8e8c+0x10
0x16d8d8e9c: 02 00 00 00 64 20 c4 cc 01 00 00 00 a0 b8 b0 02 ....d ..........
0x16d8d8eac: 01 00 00 00 40 8f 8d 6d 01 00 00 00 58 9a 6d 84 [email protected].
(lldb) si
(lldb) re read x0
x0 = 0x000000016d8d8e8c
(lldb) re read x1
x1 = 0xccc4206400000002
(lldb) re read x2
x2 = 0x02b0b8a000000001