32 位 cdecl

cdecl 是一个 Windows 32 位函数调用约定,它非常类似于许多 POSIX 操作系统上使用的调用约定(在 i386 System V ABI 中有记录 )。其中一个不同之处在于返回小结构。

参数

参数在堆栈上传递,第一个参数位于调用时堆栈的最低地址(最后推送,因此它在函数入口处的返回地址之上)。调用者负责在调用后从堆栈中弹出参数。

回报价值

对于标量返回类型,返回值放在 EAX 中,或 EDX:EAX 放置为 64 位整数。浮点类型在 st0(x87) 中返回。返回更大类型的结构是通过引用完成的,指针作为隐式的第一个参数传递。 (此指针在 EAX 中返回,因此调用者不必记住它传递的内容)。

保存和 Clobbered 寄存器

受调用者必须保留 EBX,EDI,ESI,EBP 和 ESP(以及 FP / SSE 舍入模式设置),以便呼叫者可以依赖那些未被呼叫改变的寄存器。

所有其他寄存器(EAX,ECX,EDX,FLAGS(除 DF 之外),x87 和向量寄存器)可由被调用者自由修改; 如果调用者希望在函数调用之前和之后保留一个值,它必须将值保存在别处(例如在一个保存的寄存器中或堆栈上)。