Si usa registros no es stdcall. Lo mas probable es que se de cuenta de que la funcion es interna (osea, solo va a ser llamada por el mismo EXE) y use ese tipo de optimizacion.
Pero para eso necesita saber si o si el entrypoint.
Lo que he visto son optimizaciones pero referentes a las variables locales, las cuales si son definidas como registros sin usar stack (aunque depende del uso que tengan).
Por lo que me dices, está mezclando todos los tipos de convenciones de llamadas que hay en 32 bits, lo cual es un dilema bastante dificil de resolver..
Bueno en x64 es fastcall y si hace pre reserva, aquí esta mi código por si las dudas:
00000001`3f3d1050 4883ec48 sub rsp,48h
00000001`3f3d1054 c744242880000000 mov dword ptr [rsp+28h],80h
00000001`3f3d105c c744242060000000 mov dword ptr [rsp+20h],60h
00000001`3f3d1064 41b950000000 mov r9d,50h
00000001`3f3d106a 41b840000000 mov r8d,40h
00000001`3f3d1070 ba30000000 mov edx,30h
00000001`3f3d1075 b910000000 mov ecx,10h
00000001`3f3d107a e881ffffff call image00000001_3f3d0000+0x1000 (00000001`3f3d1000)
00000001`3f3d107f 89442430 mov dword ptr [rsp+30h],eax
00000001`3f3d1083 8b442430 mov eax,dword ptr [rsp+30h]
00000001`3f3d1087 4883c448 add rsp,48h
00000001`3f3d108b c3 ret
00000001`3f3d1000:
00000001`3f3d1000 44894c2420 mov dword ptr [rsp+20h],r9d
00000001`3f3d1005 4489442418 mov dword ptr [rsp+18h],r8d
00000001`3f3d100a 89542410 mov dword ptr [rsp+10h],edx
00000001`3f3d100e 894c2408 mov dword ptr [rsp+8],ecx
00000001`3f3d1012 4883ec18 sub rsp,18h
00000001`3f3d1016 8b442428 mov eax,dword ptr [rsp+28h]
00000001`3f3d101a 8b4c2420 mov ecx,dword ptr [rsp+20h]
00000001`3f3d101e 03c8 add ecx,eax
00000001`3f3d1020 8bc1 mov eax,ecx
00000001`3f3d1022 03442430 add eax,dword ptr [rsp+30h]
00000001`3f3d1026 89442404 mov dword ptr [rsp+4],eax
00000001`3f3d102a 8b442440 mov eax,dword ptr [rsp+40h]
00000001`3f3d102e 8b4c2438 mov ecx,dword ptr [rsp+38h]
00000001`3f3d1032 03c8 add ecx,eax
00000001`3f3d1034 8bc1 mov eax,ecx
00000001`3f3d1036 03442404 add eax,dword ptr [rsp+4]
00000001`3f3d103a 03442448 add eax,dword ptr [rsp+48h]
00000001`3f3d103e 890424 mov dword ptr [rsp],eax
00000001`3f3d1041 8b0424 mov eax,dword ptr [rsp]
00000001`3f3d1044 4883c418 add rsp,18h
00000001`3f3d1048 c3 ret
como podréis ver hace una pre reserva que es parte de la función y no hace marco de la pila, y eso que desactivo Omit Frame Pointer, y el compilador
omite muchos comandos por las optimizaciones, así que estoy buscando una forma de hacerlo con las optimizaciones activadas, lo mismo pasa con
programas de 32 bit, me omite muchos comandos como podréis ver.