Arm 64位 汇编入栈和出栈

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

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

Arm 64位入栈方式

   sub     sp, sp,#0x30
   stp     x9,x10, [sp]
   stp     x11,x12, [sp, #0x10]
   stp     x13,x14, [sp, #0x20]

上述命令解释:

1: 开始时状态如下图所示,sp指向指向栈顶位置,栈是由高地址向低地址增长,堆是由低地址向高地址增长,如果在程序中使用一个很大的局部变量,此时如果栈空间不够,就会将栈击穿,占用到堆空间从而会使程序出现异常,所以一般程序中要禁止使用递归,使用递归一不小心就会将栈击穿

Arm 64位 汇编入栈和出栈_第1张图片

2:由于64位寄存器都是64位的 8位字节,将会有x9,x10, x11,x12, x13,x4共个寄存器要入栈,首先将sp-0x30,提前将6个寄存器空间的值给腾出来,代码如下: 

   sub  sp, sp,#0x30,首先将sp地址减去 0x30,申请6个寄存器的地址空间

此时sp为位置为如下图所示:

 Arm 64位 汇编入栈和出栈_第2张图片

2:stp     x9,x10, [sp] :首先将x9,和 x10入栈,

Arm 64位 汇编入栈和出栈_第3张图片

3:  stp     x11,x12, [sp, #0x10], 由于第二步骤入栈两个寄存器,将X11和X12入栈,但是入栈地址从sp+ 0x10入栈

Arm 64位 汇编入栈和出栈_第4张图片

4:stp     x13,x14, [sp, #0x20] ,由于第三步骤入栈两个寄存器,将X11和X12入栈,但是入栈地址从sp+ 0x20入栈

Arm 64位 汇编入栈和出栈_第5张图片

SP永远指向sp的栈顶地址

Arm 64位出栈方式 

 

ldp     x9, x10,[sp]
ldp     x11,x12,[sp, #0x10]
ldp     x13,x14,[sp, #0x20]
add     sp, sp, #0x30

上述命令解释

1:sp指向的栈顶位置,入栈时首先时x9和x10,索引先将x9,和x10出栈

Arm 64位 汇编入栈和出栈_第6张图片

2:将x11和X12出栈,出栈的位置为sp+0x10

Arm 64位 汇编入栈和出栈_第7张图片

3: 最后将x13和x14出栈,出栈位置 为sp+0x20

Arm 64位 汇编入栈和出栈_第8张图片

4: 6个寄存器栈都出完,需要更新sp地址, sp=sp+0x30,将SP恢复

Arm 64位 汇编入栈和出栈_第9张图片

 

你可能感兴趣的:(#,Neon)