Вопрос по локальным переменным.

Тема в разделе "WASM.BEGINNERS", создана пользователем lust, 9 май 2008.

  1. lust

    lust New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2007
    Сообщения:
    72
    Добрый день,
    у мен есть код программки вот такой:
    Код (Text):
    1. .486
    2. .model flat,stdcall
    3. option casemap:none
    4.  
    5. include c:\masm32\include\windows.inc
    6. include c:\masm32\include\user32.inc
    7. include c:\masm32\include\kernel32.inc
    8. include c:\masm32\include\wsock32.inc
    9. include c:\masm32\include\comctl32.inc
    10.  
    11. includelib c:\masm32\lib\user32.lib
    12. includelib c:\masm32\lib\kernel32.lib
    13. includelib c:\masm32\lib\comctl32.lib   ; подключение библиотеки common controls
    14. includelib c:\masm32\lib\wsock32.lib
    15. .data
    16. wsaError    db "CONNECTED!",0
    17. NProg       db "CONNECTED!",0
    18.  
    19. hSocket1    dd  ?
    20. hSocket2    dd  ?
    21. Port        dd 3030
    22.  
    23. Connected   db  0
    24.  
    25. scriptrqst1 db "1",0
    26. scriptrqst2 db "2",0
    27.  
    28. number1     db "123",0
    29. number2     db "321",0
    30.  
    31. filehandle  dd ?
    32. bytecount   dd ?
    33.  
    34. sizetoread  dd  0
    35. buffer      dd  0
    36. actual_data_read dd 0
    37. mHandle      dd 0
    38. hMemory     dd 0
    39. wsa         WSADATA <?>; структура данных для сети...cм. windows.inc
    40. sin         sockaddr_in <?> ; -.-.-
    41.  
    42. .const
    43. ; #########################################################################
    44. ; опpеделяем дополнительное Windows-сообщение (любой номер от WM_USER и выше)
    45.  
    46. WM_SOCKET   equ WM_USER + 100
    47. AF_INET     equ  2  ; интернет (используется чаще всего)
    48. SOCK_STREAM     equ  1  ; Тип соединения    
    49. ; #########################################################################
    50.  
    51. .code
    52. ; макрос - обнуляет старшее слово в DWORD (eax), оставляя младшее...
    53. LOWORD  MACRO bigword  
    54.     mov eax, bigword
    55.     and eax, 0FFFFh
    56.     ENDM
    57. ; макрос - сдвигает старшее слово в DWORD (eax) в младшие разряды (ax)...
    58. HIWORD  MACRO bigword
    59.     mov eax, bigword
    60.     shr eax, 16
    61.     ENDM
    62.  
    63. start:
    64. invoke WSAStartup, 101h, addr wsa               ; инициализация  WINSOCK DLL v1.1
    65. invoke socket, AF_INET, SOCK_STREAM,0               ; тип протокола (не устанавливать никакого пpотокола: 0)
    66. .if eax != INVALID_SOCKET                   ; если нет ошибки
    67.     mov hSocket1, eax                   ; запомнить хендл
    68. .else
    69.     invoke MessageBox, NULL, addr wsaError, addr NProg, MB_OK + MB_ICONSTOP
    70. .endif
    71. invoke htons, Port
    72.  
    73. mov sin.sin_port, ax
    74. mov sin.sin_family, AF_INET
    75. mov sin.sin_addr, INADDR_ANY
    76.  
    77. invoke bind, hSocket1, addr sin, sizeof sin
    78. .if eax == SOCKET_ERROR
    79.     invoke MessageBox, NULL, addr wsaError, addr NProg, MB_OK + MB_ICONSTOP
    80. .endif
    81. invoke listen, hSocket1, 5
    82. .if eax == SOCKET_ERROR
    83.     invoke MessageBox, NULL, addr wsaError, addr NProg, MB_OK + MB_ICONSTOP
    84. .endif
    85.  
    86. .while Connected != 1  
    87.     .IF ax == NULL
    88.         invoke accept,hSocket1,0,0
    89.         mov hSocket2, eax
    90.         invoke Sleep, 1000d
    91.         invoke ioctlsocket,hSocket2,FIONREAD,addr sizetoread
    92.         .IF eax==NULL
    93.             invoke GlobalAlloc,GMEM_FIXED,sizetoread      ; Выделяем память для буфера  считываемых данных
    94.                 mov mHandle,eax
    95.                 invoke GlobalLock,eax
    96.                 mov buffer,eax
    97.                 invoke recv,hSocket2,buffer,sizetoread,0    ; считываем данные с сокета
    98.             invoke Sleep, 1000d
    99.             mov actual_data_read, eax
    100.             .IF actual_data_read == 0  ;если нихуя не прочиталось
    101.                 ;invoke MessageBox, NULL, addr wsaError, addr NProg, MB_OK + MB_ICONSTOP
    102.                 invoke closesocket, hSocket1
    103.                 invoke closesocket, hSocket2
    104.                 invoke WSACleanup
    105.                
    106.                
    107.             .ENDIF
    108.             mov eax, buffer
    109.             add eax, sizetoread
    110.             mov edx,0
    111.             mov [eax],edx
    112.             add sizetoread,1
    113.  
    114.             invoke lstrcmpi, buffer, addr scriptrqst1
    115.             .IF eax==0
    116.                 invoke MessageBox, NULL,addr number1, addr NProg, MB_OK + MB_ICONSTOP
    117.             .ELSEIF
    118.                 invoke lstrcmpi,buffer , addr scriptrqst2
    119.                 .IF eax==0
    120.                     invoke MessageBox, NULL,addr number2, addr NProg, MB_OK + MB_ICONSTOP
    121.                 .ENDIF
    122.             .ENDIF
    123.             ;invoke MessageBox, NULL, buffer, addr NProg, MB_OK + MB_ICONSTOP
    124.             invoke GlobalUnlock, buffer
    125.                 invoke GlobalFree, hMemory
    126.         .ENDIF
    127.     .ENDIF
    128.                
    129.        
    130.         invoke Sleep,10
    131.         mov Connected, 1
    132. .endw
    133.  
    134. invoke closesocket, hSocket1
    135. invoke closesocket, hSocket2
    136. invoke WSACleanup
    137. invoke ExitProcess, 0
    138. end start
    Но я хочу его воткнуть в программу другую, точнее описать там, как процесс(ServerThread proc).
    И я столкнулся с проблемой при переходе к локальным переменным.
    C необъявленными переменными это,как я понял,
    LOCAL hSocket2:lol: WORD
    в таком стиле,
    с константами это
    Port equ 3030
    вот так, а вот со строками засада в том, что при использование числовых строк с TEXTEQU компилятор выдаёт ошибку, что мол надо использовать текст. Вот такая проблема. Да, если их всё таки объявить, то длина их вычисляется через sizeof и указатель , как и с обычными строками через offset? И как их нульдетерминированными сделать?

    Спасибо!
     
  2. Colibri

    Colibri New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    117
    1. proc - процедура, а не процесс

    локальные переменные инициализируются вручную
     
  3. lust

    lust New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2007
    Сообщения:
    72
    а что вы называется ручной инициализацией?
    спасибо
     
  4. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    перед операциями с переменными присваиваете им начальные значения
    mov local_var_i,0
     
  5. lust

    lust New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2007
    Сообщения:
    72
    Oh, shi.!..
    Да я тупой)


    Спасибо, за луч света)