x86-64指令系统过程调用学习笔记

x86-64的参数传递方式与返回地址的处理
x86-64的参数传递方式与返回地址的处理
过程中尽量用rax r10 r11,rdi之流用于传参,r12之流要现场保护才能用,因为他们是被调用者保护
x8664的寄存器使用约定

下面的图片都是例子啦啦啦啦
举个例子
如上图,由参数传递规定,a,&a,b,&b,c,&c在rdi等六个寄存器中保存,而d,&d在栈中保存,且在局部变量的下面
例子
如上图,左边粉红色是栈指针的移动,它会自己规划好要腾出多少空间,这里就是腾32,所以减32。与ia-32不同的,64不用处理rbp,只处理rsp。蓝色部分是将局部变量分配在栈中,先来先入,先来在下。绿色和黄色部分是6个参数之外的参数分配在栈中,和ia-32一样,参数入栈,后来先入,先来在下,先将&d入栈。
例子
这个图是解释寄存器使用规定的好例子,在test的过程中如上文的规定,优先用了r10作为一个类似中间寄存器的作用读取了在栈中的d。因为abc都在寄存器中,就直接add了,没有像d一样要从栈中读取出来。

例子
上图为test函数ret指令后,没啥好说的。就是之前不是局部变量在call函数的栈中保存了嘛,现在该用就拿来用,test函数也没改变abcd的值,用完移动栈指针把栈释放,rsp+32,和之前-32对应。

发布了30 篇原创文章 · 获赞 5 · 访问量 6959

猜你喜欢

转载自blog.csdn.net/weixin_44735312/article/details/89818907