definitivamente asi no se hace en CDECL. (ni en stdcall, ni en fastcall... ni en ningun lado que conozca)
pop eax ; dirección de retorno
pop ecx ;primer parametro
pop edx ;segundo parametro
push eax
invoke MessageBoxA,0,edx,ecx,0
La forma facil seria:
void PrintInts( int amount, ...)
{
__asm mov eax, [ebp+08h]//valor primero, amount
__asm mov eax, [ebp+0Ch]//valor segundo
__asm mov eax,[ebp+010h]//valor tercero...
}
Visual Studio se encarga de inicializar (push ebp, mov ebp esp)
Tambien, en realidad lo hace de la siguiente manera, colocando comprobaciones de la pila de por medio.
lea eax,dword ptr [ebp+08h]
add eax, 4 //apunta al segundo parametro
add eax, 4// apunta al tercer parametro
add eax, 4// apunta al cuarto parametro
Depura este ejemplo:
http://www.cplusplus.com/reference/clibrary/cstdarg/va_start/y se te solucionaran todas las dudas. Te conviene convertir ese ejemplo de float a int.