Проблема перехода между 16 и 32 битным кодом в Windows2000

Тема в разделе "WASM.WIN32", создана пользователем Rockphorr, 28 сен 2006.

  1. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    Наткнулся и узнал о "проклятии" Windows2000 - заблокированы переходы между кодами имеющими разную разрядность.
    Слышал о санках или как их там ...
    Знающих проблему подробно прошу поделится инфой или ссылкаи желательно русскоязычными.


    фрагмент кода

    Код (Text):
    1.     mov AX,80
    2.     push    AX ; <-- зло не дающее создать сокет
    3.     mov EAX,WM_DESTROY
    4.     push    EAX
    5.     push    ESI
    6.     call    CreateServerNetService
    7.  
    8.     IF  NT_support
    9. CreateServerNetService\
    10.     PROC    hWnd:DWORD,\
    11.         uMsg:DWORD,\
    12.         aPort16:WORD
    13.     ;-----------------------------------------
    14.     ELSE
    15. CreateServerNetService\
    16.     PROC
    17.     push    EBP
    18.     mov EBP,ESP
    19. @hWnd\
    20.     =   8
    21. @WM_SOCKET\
    22.     =   0Ch
    23. @Port\
    24.     =   10h
    25.  
    26.     ENDIF
    27.     ;-----------------------------------------
    28.     push    EBX
    29.     xor EAX,EAX
    30.     push    EAX
    31.     mov EAX,SOCK_STREAM
    32.     push    EAX
    33.     mov EAX,AF_INET
    34.     push    EAX
    35.     call    socket
    36.     cmp EAX,INVALID_SOCKET
    37.     jne $hSocket
    38.     ;-----------------------------------------
    39.     xor EAX,EAX
    40.     push    EAX
    41.     call    ExitProcess
    42.     ;-----------------------------------------
    43. $hSocket:
    44.     mov hSocketForListen,EAX
    45.     ;-----------------------------------------
    46.     mov EAX,FD_ACCEPT+FD_READ
    47.     push    EAX
    48.     ;-----------------------------------------
    49.     IF  NT_support
    50.     mov EAX,uMsg
    51.     push    EAX
    52.     mov EAX,hWnd
    53.     push    EAX
    54.     mov EAX,hSocketForListen
    55.     push    EAX
    56.     ;-----------------------------------------
    57.     ELSE
    58.     mov EAX,[EBP+@WM_SOCKET]
    59.     push    EAX
    60.     mov EAX,[EBP+@hWnd]
    61.     push    EAX
    62.     mov EAX,hSocketForListen
    63.     push    EAX
    64.     ENDIF
    65.     ;-----------------------------------------
    66.     call    WSAAsyncSelect
    67.     ;-----------------------------------------
    68.     lea EBX,SocketConfigData
    69.     xor EAX,EAX
    70.     ;-----------------------------------------
    71.     IF  NT_support
    72.     mov AX,aPort16 
    73.     ;-----------------------------------------
    74.     ELSE
    75.     mov AX,[EBP+@Port]
    76.     ENDIF
    77.     ;-----------------------------------------
    78.     push    EAX
    79.     call    htons
    80.     mov (sockaddr_in PTR\
    81.         [EBX]).sin_port,AX
    82.     mov EAX,INADDR_ANY
    83.     mov (sockaddr_in PTR\
    84.         [EBX]).sin_addr,EAX
    85.     mov AX,AF_INET
    86.     mov (sockaddr_in PTR\
    87.         [EBX]).sin_family,AX
    88.     ;-----------------------------------------
    89.     mov EAX,SIZE(sockaddr_in)
    90.     push    EAX
    91.     push    EBX
    92.     mov EAX,hSocketForListen
    93.     push    EAX
    94.     call    bind
    95.     ;-----------------------------------------
    96.     mov EAX,5
    97.     push    EAX
    98.     mov EAX,hSocketForListen
    99.     push    EAX
    100.     call    listen
    101.     pop EBX
    102.     ;-----------------------------------------
    103.     IF  NT_support
    104.     ret
    105.     ;-----------------------------------------
    106.     ELSE
    107.     mov ESP,EBP
    108.     pop EBP
    109.     ret 0Ah
    110.     ENDIF
    111.     ;-----------------------------------------
    112. CreateServerNetService\
    113.     ENDP
     
  2. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    16-битный код тут ни при чём.
    Замени первых две строчки на
    Код (Text):
    1.     mov    EAX,80
    2.     push    EAX
    И не бойся использовать тег [ code ].
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    И правильно. Как процессор будет выполнять 16битный код, если он в 32битном режиме? Да и вообще бредовая идея.
     
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Ну там префиксы 66 и 67 прочитает и обработает :)
     
  5. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    Бредовая идея это та что навязывается INTEL и MICROSOFT - жарить яичницу в доменной печи.
    Иногда хочется оптимального решения - связки 16 и 32 разрядного кода.

    В своё время 16 разрядные регистры поделили на 8 разрядные (AX AH AL)и это не считалось зазорным - а теперь - бредовая идея.
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Rockphorr
    Использовать 8разрядные регистры тебе никто не мешает. Но 16разрядный код нет смысла исполнять в 32битном. Хотя если очень хочется - есть эмуляция.
     
  7. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Все намного проще, когда ESP не выравнен на границу двойного слова половина АПИшек перестает работать.
    А так используй 16бит код сколько душе угодно, лучше, а уж тем более быстрее твоя программа от этого не будет.