我们谈谈以前高级编程语言的约定和64位调用约定。
对了,为什么这里一直没有说调用约定这个问题,因为我这个网站是默认别人会一种编程语言的。
那调用约定有call,stdcall,pascal,falt,这些约定。
这些约定是有什么意义呢?为什么要这样子约定。
call。这是c语言的约定,也就是一个子函数的参数入口和返回值的用法。
pascal 这是以前教学编程语言 pascal的约定。
falt 这是采用浮点数的约定。
stdcal 这个约定算一个标准,很多语言采用中间的一个约定方法。
那现在的 x64位约定呢,有两种。
一种是 System V AMD64 ABI调用约定。
还有一种是 Microsoft x64约定
这些调用约定让你能和其它的c语言类交叉于asm语言函数,正确的调用函数入口内的参数。
x64位函数参数的参数调用约定:
第一个参数放入rdi
第二个参数放入rsi
第三个参数放入rdx
第四个参数放入rcx
第五个参数放入r8
第六个参数放入r9
那六个以上的参数,我们以栈的相反的顺序传递。
压入第十个参数
压入第九个参数
压入第八个参数
压入第七个参数
那压栈的参数用栈指针表示rsp-8
压入第十个参数时rsp减少8个字节 【栈顶】
压入第九个参数时rsp减少8个字节。
.
.
.
.
压入第七个参数时rsp减少8个字节。
那函数开头有个rbp寄存器,这是堆的寄存器指针此时联动rsp-8放rbp值,用于恢复指针。
那浮点参数的传递表示:
第一个参数放入xmm0
第二个参数放入xmm1
.
.
.
.
第八个参数放入xmm7
函数返回寄存器xmm0的浮点返回结果。
还返回一个rax是一个整数或地址。
关于以上的参考,我是怎么知道的,有一本刚出的书《x64汇编语言:从新手到AVX专家》
还有个参考链接:
https://software.intel.com/sites/default/files/article/402129/mpx-linux64-abi.pdf
可以看到相关内容。