源码:
gcc -g a.c
objdump -d a.out
get_xx函数:
0000000000400634 <get_xx>:400634: a9be7bfd stp x29, x30, [sp, #-32]! //stp指令将x29,x30保存在sp-32地址,后面的!,是完成后将sp-32的地址值给sp。意味着sp向地地址移动400638: 910003fd mov x29, sp //将sp的值保存到x29寄存器。40063c: d2800100 mov x0, #0x8 // #8400640: 97ffffac bl 4004f0 <malloc@plt> //调malloc函数,返回的地址保存到x0寄存器。也就是get_xx返回的地址。400644: f9000fe0 str x0, [sp, #24] // 将get_xx函数返回的地址p,放入sp+24位置。 因为后面会用到这个地址,因此需要保存在这。 400648: f9400fe0 ldr x0, [sp, #24] //从sp+24位置取出地址p40064c: 52800141 mov w1, #0xa //将0xa也就是10,放入w1寄存器。400650: b9000001 str w1, [x0] //将w1寄存器的值,放入x0寄存器的地址,结构体中的a变量在结构体的起始位置 ,因此刚好设置p->a400654: f9400fe0 ldr x0, [sp, #24] //从sp+24位置取出地址p, 前面把x0存入sp+24就是这个目的。400658: 528000a1 mov w1, #0x5 //同理将5保存到w1,为了下一步设置p->b // #540065c: b9000401 str w1, [x0, #4] //将w1 存入x0偏移4字节的位置,结构体成员b在结构体中偏移4字节。400660: f9400fe0 ldr x0, [sp, #24] //最后取出指针p到x0400664: a8c27bfd ldp x29, x30, [sp], #32 //将在sp所在的地址的值给x29,x30寄存器,并且sp的值=sp+32 。刚好还原函数开始时的sp。400668: d65f03c0 ret //返回,将x30保存的下一条指令给pc
main函数:
000000000040066c <main>:40066c: a9be7bfd stp x29, x30, [sp, #-32]!400670: 910003fd mov x29, sp400674: 97fffff0 bl 400634 <get_xx> //bl指令将下一条指令的地址保存到lr(x30)寄存器,ret的时候会将其设置到pc以继续执行400678: f9000fe0 str x0, [sp, #24] //参考get_xx 说明,将函数返回的地址px保存40067c: f9400fe0 ldr x0, [sp, #24] //参考get_xx 说明,将函数返回的地址px保存400680: b9400001 ldr w1, [x0] //将px指针的4字节内容放入w1。由于a只占4字节,后面的内容不拷贝400684: f9400fe0 ldr x0, [sp, #24] //重新取出px指针400688: b9400400 ldr w0, [x0, #4] //在x0+4字节的地址取出b。放入w040068c: 4b000020 sub w0, w1, w0 //减法 w0=w1-w0 ,即p->a - p->b400690: b90017e0 str w0, [sp, #20] //保存结果400694: b94017e0 ldr w0, [sp, #20] //取出结果400698: a8c27bfd ldp x29, x30, [sp], #32 //还原x29,x30,sp40069c: d65f03c0 ret //返回
Arm64的所有函数,一开始都是这两句:
400634: a9be7bfd stp x29, x30, [sp, #-32]! //stp指令将x29,x30保存在sp-32地址,后面的!,是完成后将sp-32的地址值给sp。意味着sp向地地址移动
400638: 910003fd mov x29, sp //将sp的值保存到x29寄存器。
最后都有这一句:
400698: a8c27bfd ldp x29, x30, [sp], #32 //还原x29,x30,sp
每次函数都会开辟自己的栈。这个栈的大小根据函数的本地变量或者参数来决定。
参考指令:
03_ARMv8指令集介绍加载与存储指令 - Carlos·Wei - 博客园
https://blog.csdn.net/wmzjzwlzs/article/details/124513127