arm64汇编篇-05函数的本质及实例分析

函数的参数和返回值:

ARM64下,函数的参数是存放在X0到X7(W0到W7)这8个寄存器里面的.如果超过8个参数,就会入栈.

函数的返回值是放在X0 寄存器里面的.

这些是系统规定的,也正是这些规则我们才能逆向去解析别人的代码。

函数的局部变量:

函数的局部变量放在栈里面。这个大家都知道,下面我们建个项目来研究下函数执行的汇编代码。

堆栈操作例子:

使用32个字节空间作为这段程序的栈空间,然后利用栈将x0和x1的值进行交换.

以下代码[ ]中括号表示取指向的地址因为栈是从高地址向低地址开辟的所以用sub减地址内存,但是读写是从低地址向高地址的所以sp会指向到需要读写地址的前面,而通用寄存器为31个不变0-28 fp lr,所以寄存器会不断和内存交互存取值。

str stp是将数据从寄存器中取出存到内存,ldr ldp 是将数据从内存读取出来存到寄存器,所以一下操作是在sp开辟的栈内高地址先将寄存器x0 x1中的数据先存到对应的内存中,然后将对应寄存器中的数据存到寄存器中不同的是换了寄存器的存储顺序,从而实现寄存器中的数据交换。理解这个实例后下面的理解就方便多了。

sub    sp, sp, #0x20 ;拉伸栈空间32个字节

stp    x0, x1, [sp, #0x10] ;sp往上加16个字节,存放x0 和 x1

ldp    x1, x0, [sp, #0x10] ;将sp偏移16个字节的值取出来,放入x1 和 x0

add sp,sp,#0x20; 栈平衡即释放开辟的空间

实例:

注:执行代码都需要连真机执行5s以上型号。模拟器是x86的系统架构跟arm64有区别。

1.创建Demo->command + n -> 选择如下图

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值