Наткнулся и узнал о "проклятии" Windows2000 - заблокированы переходы между кодами имеющими разную разрядность. Слышал о санках или как их там ... Знающих проблему подробно прошу поделится инфой или ссылкаи желательно русскоязычными. фрагмент кода Код (Text): mov AX,80 push AX ; <-- зло не дающее создать сокет mov EAX,WM_DESTROY push EAX push ESI call CreateServerNetService IF NT_support CreateServerNetService\ PROC hWnd:DWORD,\ uMsg:DWORD,\ aPort16:WORD ;----------------------------------------- ELSE CreateServerNetService\ PROC push EBP mov EBP,ESP @hWnd\ = 8 @WM_SOCKET\ = 0Ch @Port\ = 10h ENDIF ;----------------------------------------- push EBX xor EAX,EAX push EAX mov EAX,SOCK_STREAM push EAX mov EAX,AF_INET push EAX call socket cmp EAX,INVALID_SOCKET jne $hSocket ;----------------------------------------- xor EAX,EAX push EAX call ExitProcess ;----------------------------------------- $hSocket: mov hSocketForListen,EAX ;----------------------------------------- mov EAX,FD_ACCEPT+FD_READ push EAX ;----------------------------------------- IF NT_support mov EAX,uMsg push EAX mov EAX,hWnd push EAX mov EAX,hSocketForListen push EAX ;----------------------------------------- ELSE mov EAX,[EBP+@WM_SOCKET] push EAX mov EAX,[EBP+@hWnd] push EAX mov EAX,hSocketForListen push EAX ENDIF ;----------------------------------------- call WSAAsyncSelect ;----------------------------------------- lea EBX,SocketConfigData xor EAX,EAX ;----------------------------------------- IF NT_support mov AX,aPort16 ;----------------------------------------- ELSE mov AX,[EBP+@Port] ENDIF ;----------------------------------------- push EAX call htons mov (sockaddr_in PTR\ [EBX]).sin_port,AX mov EAX,INADDR_ANY mov (sockaddr_in PTR\ [EBX]).sin_addr,EAX mov AX,AF_INET mov (sockaddr_in PTR\ [EBX]).sin_family,AX ;----------------------------------------- mov EAX,SIZE(sockaddr_in) push EAX push EBX mov EAX,hSocketForListen push EAX call bind ;----------------------------------------- mov EAX,5 push EAX mov EAX,hSocketForListen push EAX call listen pop EBX ;----------------------------------------- IF NT_support ret ;----------------------------------------- ELSE mov ESP,EBP pop EBP ret 0Ah ENDIF ;----------------------------------------- CreateServerNetService\ ENDP
16-битный код тут ни при чём. Замени первых две строчки на Код (Text): mov EAX,80 push EAX И не бойся использовать тег [ code ].
И правильно. Как процессор будет выполнять 16битный код, если он в 32битном режиме? Да и вообще бредовая идея.
Бредовая идея это та что навязывается INTEL и MICROSOFT - жарить яичницу в доменной печи. Иногда хочется оптимального решения - связки 16 и 32 разрядного кода. В своё время 16 разрядные регистры поделили на 8 разрядные (AX AH AL)и это не считалось зазорным - а теперь - бредовая идея.
Rockphorr Использовать 8разрядные регистры тебе никто не мешает. Но 16разрядный код нет смысла исполнять в 32битном. Хотя если очень хочется - есть эмуляция.
Все намного проще, когда ESP не выравнен на границу двойного слова половина АПИшек перестает работать. А так используй 16бит код сколько душе угодно, лучше, а уж тем более быстрее твоя программа от этого не будет.