当前位置: 首页 > article >正文

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

 


http://www.kler.cn/a/467809.html

相关文章:

  • Java【线程与并发】
  • 项目配置设置二 (芒果头条项目进度3)
  • 大型 UniApp 应用的架构设计
  • HTTP、HTTP/2 和 gRPC 是网络通信协议或基于这些协议的技术,它们之间有显著的区别
  • 003__系统共享工具、服务器的使用
  • 高等数学学习笔记 ☞ 极限的运算法则与存在准则
  • MySQL(四)MySQL Select语句
  • RISC-V学习笔记
  • QML自定义数值编辑框SpinBox样式
  • 基于mysql数据库实现分布式锁
  • 73 mysql replication 集群的交互
  • Python 数据结构揭秘:栈与队列
  • HDFS块预留导致的存储空间异常的问题探究
  • python.exe无法找到程序入口 无法定位程序输入点(Anaconda Prompt报错)
  • 基于JAVA+SpringBoot+Vue的校园外卖服务系统
  • 无刷电机驱动板原理图解析
  • LinuxC高级day2
  • 模型训练二三事:参数个数、小批量、学习率衰减、输入形状
  • 044_Standalone App in Matlab中发布独立应用
  • [网络安全]sqli-labs Less-3 解题详析