您的位置:首页 > 财经 > 金融 > html个人主页模板_全国疫情最新查询_网站开发是做什么的_百度秒收录

html个人主页模板_全国疫情最新查询_网站开发是做什么的_百度秒收录

2025/1/7 9:28:24 来源:https://blog.csdn.net/gjioui123/article/details/144932739  浏览:    关键词:html个人主页模板_全国疫情最新查询_网站开发是做什么的_百度秒收录
html个人主页模板_全国疫情最新查询_网站开发是做什么的_百度秒收录

源码: 

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

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com