网络知识 娱乐 arm64汇编ldr和ldur和ldp指令在xcode中传入地址调用方法

arm64汇编ldr和ldur和ldp指令在xcode中传入地址调用方法

文章目录

  • ldr指令的作用
  • arm.h文件中的声明
  • oc文件中的调用
  • ldur指令
  • ldr 和 ldur的区别
  • ldp指令 load address pair 读取一对地址

ldr指令的作用

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]

arm.h文件中的声明

#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,再返回

oc文件中的调用

#import "arm.h"
int a = 1;
int result = fn1(&a);

打印结果是result= 2

下面是xcode的运行结果截图:
在这里插入图片描述

ldur指令

跟ldr一样,只不过,ldur通常后面的立即数是负数

ldur x1,[x0,#-1] ;//通常ldur 用来负数运算 代表x0的地址,-1的内存里的值,赋值给x1

ldr 和 ldur的区别

ldr 计算地址是用正数运算,ldur通常用作负数运算
例如

ldur x1,[x0,#-1] //负数立即数
ldr x1,[x0,#1]   //正数立即数

ldp指令 load address pair 读取一对地址

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  ....@..m....X.m.
(lldb) si
(lldb) re read x0
      x0 = 0x000000016d8d8e8c
(lldb) re read x1
      x1 = 0xccc4206400000002
(lldb) re read x2
      x2 = 0x02b0b8a000000001