arm64函数源码和汇编解析(objdump)
源码:
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 // #8
400640: 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位置取出地址p
40064c: 52800141 mov w1, #0xa //将0xa也就是10,放入w1寄存器。
400650: b9000001 str w1, [x0] //将w1寄存器的值,放入x0寄存器的地址,结构体中的a变量在结构体的起始位置 ,因此刚好设置p->a
400654: f9400fe0 ldr x0, [sp, #24] //从sp+24位置取出地址p, 前面把x0存入sp+24就是这个目的。
400658: 528000a1 mov w1, #0x5 //同理将5保存到w1,为了下一步设置p->b // #5
40065c: b9000401 str w1, [x0, #4] //将w1 存入x0偏移4字节的位置,结构体成员b在结构体中偏移4字节。
400660: f9400fe0 ldr x0, [sp, #24] //最后取出指针p到x0
400664: 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, sp
400674: 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。放入w0
40068c: 4b000020 sub w0, w1, w0 //减法 w0=w1-w0 ,即p->a - p->b
400690: b90017e0 str w0, [sp, #20] //保存结果
400694: b94017e0 ldr w0, [sp, #20] //取出结果
400698: a8c27bfd ldp x29, x30, [sp], #32 //还原x29,x30,sp
40069c: 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