赞
踩
Arm 64位的汇编指令和32汇编指令有很大差别,其中一个入栈和出栈方式不太一样。
函数入口第一件事情就是将需要的用到的寄存器先进行保存入栈
- sub sp, sp,#0x30
- stp x9,x10, [sp]
- stp x11,x12, [sp, #0x10]
- stp x13,x14, [sp, #0x20]
上述命令解释:
1: 开始时状态如下图所示,sp指向指向栈顶位置,栈是由高地址向低地址增长,堆是由低地址向高地址增长,如果在程序中使用一个很大的局部变量,此时如果栈空间不够,就会将栈击穿,占用到堆空间从而会使程序出现异常,所以一般程序中要禁止使用递归,使用递归一不小心就会将栈击穿
2:由于64位寄存器都是64位的 8位字节,将会有x9,x10, x11,x12, x13,x4共个寄存器要入栈,首先将sp-0x30,提前将6个寄存器空间的值给腾出来,代码如下:
sub sp, sp,#0x30,首先将sp地址减去 0x30,申请6个寄存器的地址空间
此时sp为位置为如下图所示:
2:stp x9,x10, [sp] :首先将x9,和 x10入栈,
3: stp x11,x12, [sp, #0x10], 由于第二步骤入栈两个寄存器,将X11和X12入栈,但是入栈地址从sp+ 0x10入栈
4:stp x13,x14, [sp, #0x20] ,由于第三步骤入栈两个寄存器,将X11和X12入栈,但是入栈地址从sp+ 0x20入栈
SP永远指向sp的栈顶地址
- ldp x9, x10,[sp]
- ldp x11,x12,[sp, #0x10]
- ldp x13,x14,[sp, #0x20]
- add sp, sp, #0x30
上述命令解释
1:sp指向的栈顶位置,入栈时首先时x9和x10,索引先将x9,和x10出栈
2:将x11和X12出栈,出栈的位置为sp+0x10
3: 最后将x13和x14出栈,出栈位置 为sp+0x20
4: 6个寄存器栈都出完,需要更新sp地址, sp=sp+0x30,将SP恢复
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。