当前位置:   article > 正文

Arm 64位 汇编入栈和出栈_arm64函数出栈入栈

arm64函数出栈入栈

 Arm 64位的汇编指令和32汇编指令有很大差别,其中一个入栈和出栈方式不太一样。

函数入口第一件事情就是将需要的用到的寄存器先进行保存入栈

Arm 64位入栈方式

  1. sub sp, sp,#0x30
  2. stp x9,x10, [sp]
  3. stp x11,x12, [sp, #0x10]
  4. 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的栈顶地址

Arm 64位出栈方式 

 

  1. ldp x9, x10,[sp]
  2. ldp x11,x12,[sp, #0x10]
  3. ldp x13,x14,[sp, #0x20]
  4. 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恢复

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/487035
推荐阅读
  

闽ICP备14008679号