hola
Este codigo lo hice anteriormente para 64 bits y funciona bien, pero ahora quise hacer unos cambios para volverlo a 32bits como los registros, rax, rbx, etc... a eax, ebx,.. etc, las funciones externas tuve que hacer algunos cambios que me pedia el compilador
Pero no funciona, lo analice con ollydbg y el error sale desde el inicio, WSAStartup, lo que no entiendo es porque ya no funciono?, no se si es por el compilador, o porque lo modifique mal... podria alguien hacerme el favor de verificarlo porfavor
lo estoy haciendo en masm32, lm y link
asi lo compilo
ml /coff /c serv.asm
link /entry:Start /subsystem:console /libpath:c:/masm32/lib kernel32.lib ws2_32.lib serv.obj
Este es el codigo
.686
.model flat, stdcall
option casemap:none
extrn ExitProcess@4:PROC
extrn WSAStartup@8:PROC
extrn socket@12:PROC
extrn connect@12:PROC
extrn send@16:PROC
WSADATA STRUCT 8
wVersion WORD ?
wHighVersion WORD ?
iMaxSocket WORD ?
iMaxUdpDg WORD ?
lpVendorInfo DWORD ?
szDescription SBYTE 257 dup (?)
szSystemStatus SBYTE 129 dup (?)
WSADATA ENDS
sockaddr STRUCT
sa_family WORD ?
sa_port WORD ?
sa_addr DWORD ?
BYTE 8 dup (?)
sockaddr ENDS
.const
address sockaddr<2, 0B922h, 0100007Fh>
sbuff BYTE "hola mundo",0
.data?
wsadata WSADATA <>
Socket DWORD ?
.code
Start proc
push ebp
mov ebp, esp
lea edx, wsadata
mov ecx, 2h
call WSAStartup@8
mov edx, 0h
mov ecx, 1h
mov ebx, 2h
call socket@12
mov Socket, eax
mov edx, 16h
lea ecx, address
mov ebx, Socket
call connect@12
mov edx, 0h
mov ecx, SIZEOF sbuff
mov ebx, offset sbuff
mov eax, Socket
call send@16
mov eax, 0
call ExitProcess@4
mov esp, ebp
pop ebp
Start endp
END
En 32bits la convención de llamada de las APIs de Windows es stdcall... Debes hacer push de los parámetros en lugar de meterlos en eax, ebx, ecx, edx...
Ejemplo de fix:
push 0h
push SIZEOF sbuff
push offset sbuff
push Socket
call send
hola
gracias, ya funciona
eso explica porque tuve que usar registros que no usaba en 64bits..
gracias nuevamente
salu2