это мой исходный код сборки для сокета Windows (ws2)
эта программа скомпилирована без проблем, но во время выполнения происходит сбой программы (в течение нескольких секунд, программа ничего не делает)
чтопроблема ? Я думаю, что проблема в стеке или ...
format PE CONSOLE
entry start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
section '.bss' writeable readable
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
____STD_OUTPUT_HANDLE RD 1
____SOCKET RD 1
____LPWSADATA RB 400
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
section '.text' code readable executable
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
start:
sub esp, 16 ; struct sockaddr_in
; GetStdHandle
push -11
call [GetStdHandle]
test eax, eax
jz .exit
mov [____STD_OUTPUT_HANDLE], eax
; WSAStartup
push ____LPWSADATA
push 2
call [WSAStartup]
test eax, eax
jnz .init_failed
; SOCKET
push 6
push 1
push 2
call [socket]
test eax, eax
jz .socket_failed
; HTONS (PORT)
push 80
call [htons]
mov [esp+2], WORD ax ; sin_port = htons(port)
; SOCKADDR
mov [esp], WORD 2 ; sin_family = AF_INET
mov [esp+4], DWORD 2130706433 ; sin_addr = 127.0.0.1 (addr in long = (2130706433))
; BIND
push 16
lea eax, [esp]
push eax
push [____SOCKET]
call [bind]
test eax, eax
jnz .bind_failed
; LISTEN
push 5 ; SOMAXCONN
push [____SOCKET]
call [listen]
test eax, eax
jnz .listen_failed
; CLOSE
; ...
; ...
jmp .exit
.init_failed:
push 0
push 0
push DWORD [.err0_len]
push DWORD .err0
push [____STD_OUTPUT_HANDLE]
call [WriteFile]
jmp .exit
.socket_failed:
push 0
push 0
push DWORD [.err1_len]
push DWORD .err1
push [____STD_OUTPUT_HANDLE]
call [WriteFile]
jmp .exit
.bind_failed:
push 0
push 0
push DWORD [.err2_len]
push DWORD .err2
push [____STD_OUTPUT_HANDLE]
call [WriteFile]
jmp .exit
.listen_failed:
push 0
push 0
push DWORD [.err3_len]
push DWORD .err3
push [____STD_OUTPUT_HANDLE]
call [WriteFile]
jmp .exit
.exit:
push 0
call [ExitProcess]
hlt
.err0:
DB 'Socket initialization failed', 0x0A, 0x00
.err0_len:
DD $ - .err0
.err1:
DB 'Socket creation failed', 0x0A, 0x00
.err1_len:
DD $ - .err1
.err2:
DB 'Socket bind failed', 0x0A, 0x00
.err2_len:
DD $ - .err2
.err3:
DB 'Socket listen failed', 0x0A, 0x00
.err3_len:
DD $ - .err3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
section '.idata' import data readable writeable
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DD 0,0,0,RVA kernel_name, RVA kernel_list
DD 0,0,0,0,0
DD 0,0,0,RVA ws2_name, RVA ws2_list
DD 0,0,0,0,0
kernel_list:
ExitProcess DD RVA _ExitProcess
GetStdHandle DD RVA _GetStdHandle
WriteFile DD RVA _WriteFile
CloseHandle DD RVA _CloseHandle
DD 0
kernel_name: DB 'KERNEL32.DLL', 0
_ExitProcess: DB 0,0,'ExitProcess',0
_GetStdHandle: DB 0,0,'GetStdHandle',0
_WriteFile: DB 0,0,'WriteFile',0
_CloseHandle: DB 0,0,'CloseHandle',0
ws2_list:
socket DD RVA _socket
htons DD RVA _htons
WSAStartup DD RVA _WSAStartup
WSACleanup DD RVA _WSACleanup
WSAGetLastError DD RVA _WSAGetLastError
getpeername DD RVA _getpeername
bind DD RVA _bind
listen DD RVA _listen
accept DD RVA _accept
recv DD RVA _recv
send DD RVA _send
setsockopt DD RVA _setsockopt
shutdown DD RVA _shutdown
closesocket DD RVA _closesocket
DD 0
ws2_name: DB 'WS2_32.DLL', 0
_socket: DB 0,0,'socket',0
_htons: DB 0,0,'htons', 0
_WSAStartup: DB 0,0,'WSAStartup',0
_WSACleanup: DB 0,0,'WSACleanup',0
_WSAGetLastError: DB 0,0,'WSAGetLastError',0
_getpeername: DB 0,0,'getpeername',0
_bind: DB 0,0,'bind',0
_listen: DB 0,0,'listen',0
_accept: DB 0,0,'accept',0
_recv: DB 0,0,'recv',0
_send: DB 0,0,'send',0
_setsockopt: DB 0,0,'setsockopt',0
_shutdown: DB 0,0,'shutdown',0
_closesocket: DB 0,0,'closesocket',0
Должен ли я использовать (добавить esp, x) для каждой функции ... ?? это проблема? или проблема в связывании функций?