ARM C函数调用堆栈入栈顺序

ARM C函数调用堆栈入栈顺序

堆栈指针是在函数一开头就确认了的,比如如下的xxx_func.cfi函数,它在函数的开头就将sp自减了0x170,这个0x170是xxx_fun.cfi函数局部变量total size + 需要入栈的reg total size 

然后会设置x29(fp,栈底指针),这里看到是sp - 0x110,可以看到需要入栈的reg total size为0x60,所以fp指向了函数局部变量列表的头部,它是不包含函数里的局部变量的

00000000000441c8 <xxx_func.cfi>:
   441c8:    d105c3ff     sub    sp, sp, #0x170
   441cc:    a9117bfd     stp    x29, x30, [sp,#272]
   441d0:    a9126ffc     stp    x28, x27, [sp,#288]
   441d4:    a91367fa     stp    x26, x25, [sp,#304]
   441d8:    a9145ff8     stp    x24, x23, [sp,#320]
   441dc:    a91557f6     stp    x22, x21, [sp,#336]
   441e0:    a9164ff4     stp    x20, x19, [sp,#352]
   441e4:    910443fd     add    x29, sp, #0x110
   441e8:    90000008     adrp    x8, 0 <__stack_chk_guard>

 

 

函数调用stack变化,入栈顺序

以main()里有int a、int b两个局部变量并call了一个test_func(int i, int j),在test_func()里有define一个int c变量为例,来看下调用test_func()时的堆栈变化:

 

上一篇:GNU 汇编


下一篇:WebRTC学习资料大全