cdecl是Windows 32位函数调用约定,与许多POSIX操作系统(在i386 System V ABI中记录)上使用的调用约定非常相似。区别之一是返回小结构。
参数在堆栈上传递,第一个参数在调用时位于堆栈的最低地址(最后按一次,因此它刚好在函数输入的返回地址上方)。调用者负责在调用之后从堆栈弹出参数。
对于标量返回类型,对于64位整数,返回值放在EAX或EDX:EAX中。浮点类型在st0(x87)中返回。返回较大的类型(如结构)是通过引用完成的,并且将指针作为隐式的第一个参数传递。(此指针以EAX返回,因此调用者不必记住它传递的内容)。
被调用者必须保留EBX,EDI,ESI,EBP和ESP(以及FP / SSE舍入模式设置),以便调用者可以依赖那些未被调用更改的寄存器。
所有其他寄存器(EAX,ECX,EDX,FLAGS(DF除外),x87和矢量寄存器)都可以由被调用方自由修改;如果调用者希望在函数调用之前和之后保留一个值,则它必须将该值保存在其他位置(例如在保存的寄存器之一或堆栈中)。