http://msdn.microsoft.com/en-us/library/dd2wa36c.aspx wrote:
If parameters are passed via varargs (for example, ellipsis arguments), then essentially the normal parameter passing applies including spilling the fifth and subsequent arguments. It is again the callee's responsibility to dump arguments that have their address taken. For floating-point values only, both the integer and the floating-point register will contain the float value in case the callee expects the value in the integer registers.
So actually the printf function is using the integer registers and ignores the xmm registers. So for the cinvoke fasm should be placing the data in both the xmm and integer registers.