Не ассемблируется пример Iczelion'а (урок 3)

Тема в разделе "WASM.BEGINNERS", создана пользователем Alexsz, 17 авг 2009.

Метки:
  1. Alexsz

    Alexsz New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2009
    Сообщения:
    3
    Добрый вечер !
    Не так давно , начал изучать АСМ . Пока смутно представляю с чем имею дело . Прочитал "Введение в машинный код" немного начал ловить азы... Сейчас занял свой мозг изучением уроков от Iczelion'а , программирование под win32.

    Так вот , перейду ближе к делу .

    В уроке номер 3 есть пример создания окна .

    Код (Text):
    1. .386
    2. .model flat,stdcall
    3.  
    4. option casemap:none
    5. include \masm32\include\windows.inc
    6. include \masm32\include\user32.inc
    7. includelib \masm32\lib\user32.lib ; calls to functions in user32.lib and kernel32.lib
    8. include \masm32\include\kernel32.inc
    9. includelib \masm32\lib\kernel32.lib
    10.  
    11.  
    12. WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
    13.  
    14. .DATA                           ; initialized data
    15.  
    16. ClassName db "SimpleWinClass",0 ; Имя нашего класса окна
    17. AppName db "Our First Window",0 ; Имя нашего окна
    18.  
    19.  
    20. .DATA?                  ; Hеиницилизиpуемые данные
    21. hInstance HINSTANCE ?   ; Хэндл нашей пpогpаммы
    22. CommandLine LPSTR ?
    23. .CODE                ; Здесь начинается наш код
    24. start:
    25. invoke GetModuleHandle, NULL ; Взять хэндл пpогpаммы
    26.                              ; Под Win32, hmodule==hinstance mov hInstance,eax
    27. mov hInstance,eax
    28.  
    29. invoke GetCommandLine   ; Взять командную стpоку. Вы не обязаны
    30.           ; вызывать эту функцию ЕСЛИ ваша пpогpамма не обpабатывает командную стpоку.
    31. mov CommandLine,eax
    32. invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT  ; вызвать основную функцию
    33. invoke ExitProcess, eax ; Выйти из пpогpаммы.
    34.                         ; Возвpащаемое значение, помещаемое в eax, беpется из WinMain'а.
    35.  
    36. WinMain proc
    37.  
    38.  
    39.  
    40.  
    41. hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    42.     LOCAL wc:WNDCLASSEX      ; создание локальных пеpеменных в стеке
    43.     LOCAL msg:MSG
    44.     LOCAL hwnd:HWND
    45.  
    46.  
    47.     mov   wc.cbSize,SIZEOF WNDCLASSEX   ; заполнение стpуктуpы wc
    48.     mov   wc.style, CS_HREDRAW or CS_VREDRAW
    49.     mov   wc.lpfnWndProc, OFFSET WndProc
    50.     mov   wc.cbClsExtra,NULL
    51.  
    52.     mov   wc.cbWndExtra,NULL
    53.     push  hInstance
    54.     pop   wc.hInstance
    55.     mov   wc.hbrBackground,COLOR_WINDOW+1
    56.  
    57.     mov   wc.lpszMenuName,NULL
    58.     mov   wc.lpszClassName,OFFSET ClassName
    59.     invoke LoadIcon,NULL,IDI_APPLICATION
    60.     mov   wc.hIcon,eax
    61.  
    62.     mov   wc.hIconSm,eax
    63.     invoke LoadCursor,NULL,IDC_ARROW
    64.     mov   wc.hCursor,eax
    65.     invoke RegisterClassEx, addr wc  ; pегистpация нашего класса окна
    66.     invoke CreateWindowEx,NULL,\
    67.                 ADDR ClassName,\
    68.                 ADDR AppName,\
    69.                 WS_OVERLAPPEDWINDOW,\
    70.                 CW_USEDEFAULT,\
    71.                 CW_USEDEFAULT,\
    72.                 CW_USEDEFAULT,\
    73.                 CW_USEDEFAULT,\
    74.                 NULL,\
    75.                 NULL,\
    76.                 hInst,\
    77.                 NULL
    78.     mov   hwnd,eax
    79.  
    80.     invoke ShowWindow, hwnd,CmdShow ; отобpазить наше окно на десктопе
    81.     invoke UpdateWindow, hwnd ; обновить клиентскую область
    82.  
    83.     .WHILE TRUE   ; Enter message loop
    84.        invoke GetMessage, ADDR msg,NULL,0,0
    85.     .BREAK .IF (!eax)
    86.        invoke TranslateMessage, ADDR msg
    87.        invoke DispatchMessage, ADDR msg
    88.     .ENDW
    89.      mov     eax,msg.wParam ; сохpанение возвpащаемого значения в eax
    90.      ret
    91.  
    92. WinMain endp
    93.  
    94. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    95.  
    96.     .IF uMsg==WM_DESTROY            ; если пользователь закpывает окно
    97.         invoke PostQuitMessage,NULL ; выходим из пpогpаммы
    98.     .ELSE
    99.         invoke DefWindowProc,hWnd,uMsg,wParam,lParam ; Дефаултная функция обpаботки окна
    100.         ret
    101.     .ENDIF
    102.     xor eax,eax
    103.  
    104.     ret
    105. WndProc endp
    106.  
    107.  
    108. end start
    При ассемблировании кода получаю следующие ошибки:

    Код (Text):
    1.  Assembling: C:\ASM\aaa.asm
    2. C:\ASM\aaa.asm(36) : error A2111: conflicting parameter definition
    3. C:\ASM\aaa.asm(41) : error A2008: syntax error : HINSTANCE
    4. C:\ASM\aaa.asm(42) : error A2012: PROC, MACRO, or macro repeat directive must precede LOCAL
    5. C:\ASM\aaa.asm(43) : error A2012: PROC, MACRO, or macro repeat directive must precede LOCAL
    6. C:\ASM\aaa.asm(44) : error A2012: PROC, MACRO, or macro repeat directive must precede LOCAL
    7. C:\ASM\aaa.asm(65) : error A2006: undefined symbol : wc
    8. C:\ASM\aaa.asm(65) : error A2114: INVOKE argument type mismatch : argument : 1
    9. C:\ASM\aaa.asm(80) : error A2006: undefined symbol : CmdShow
    10. C:\ASM\aaa.asm(80) : error A2114: INVOKE argument type mismatch : argument : 2
    11. C:\ASM\aaa.asm(80) : error A2006: undefined symbol : hwnd
    12. C:\ASM\aaa.asm(80) : error A2114: INVOKE argument type mismatch : argument : 1
    13. C:\ASM\aaa.asm(81) : error A2006: undefined symbol : hwnd
    14. C:\ASM\aaa.asm(81) : error A2114: INVOKE argument type mismatch : argument : 1
    15. C:\ASM\aaa.asm(84) : error A2006: undefined symbol : msg
    16. C:\ASM\aaa.asm(84) : error A2114: INVOKE argument type mismatch : argument : 1
    17. C:\ASM\aaa.asm(86) : error A2006: undefined symbol : msg
    18. C:\ASM\aaa.asm(86) : error A2114: INVOKE argument type mismatch : argument : 1
    19. C:\ASM\aaa.asm(87) : error A2006: undefined symbol : msg
    20. C:\ASM\aaa.asm(87) : error A2114: INVOKE argument type mismatch : argument : 1
    21. C:\ASM\aaa.asm(47) : error A2006: undefined symbol : wc
    22. C:\ASM\aaa.asm(48) : error A2006: undefined symbol : wc
    23. C:\ASM\aaa.asm(49) : error A2006: undefined symbol : wc
    24. C:\ASM\aaa.asm(50) : error A2006: undefined symbol : wc
    25. C:\ASM\aaa.asm(52) : error A2006: undefined symbol : wc
    26. C:\ASM\aaa.asm(54) : error A2006: undefined symbol : wc
    27. C:\ASM\aaa.asm(55) : error A2006: undefined symbol : wc
    28. C:\ASM\aaa.asm(57) : error A2006: undefined symbol : wc
    29. C:\ASM\aaa.asm(58) : error A2006: undefined symbol : wc
    30. C:\ASM\aaa.asm(60) : error A2006: undefined symbol : wc
    31. C:\ASM\aaa.asm(62) : error A2006: undefined symbol : wc
    32. C:\ASM\aaa.asm(64) : error A2006: undefined symbol : wc
    33. C:\ASM\aaa.asm(78) : error A2006: undefined symbol : hwnd
    34. C:\ASM\aaa.asm(90) : error A2006: undefined symbol : msg
    В качестве компилятора использую MASM32, пишу в редакторе MASM32 Editor.
    Спасибо.
     
  2. Microedition

    Microedition Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    826
    Параметры командной строки где?
     
  3. Alexsz

    Alexsz New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2009
    Сообщения:
    3
    Эм , не совсем понял .
    Я тыкаю MASM32 Editor Project->Assemble ASM file
     
  4. Microedition

    Microedition Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    826
    Попробуй из командной строки так:

    %masmbin%\ml /c /coff /Cp /nologo /I"%incpath%" /Fo %fname%.obj %fname%.asm
    %masmbin%\link /release /version:4.0 /subsystem:windows /libpath:"%libpath%" /out:%fname%.exe %fname%.obj

    где:
    %masmbin% - путь к папке \masm32\bin
    %incpath% - путь к папке \masm32\include
    %libpath% - путь к \masm32\lib
    %fname% - название исходного файла (без расширения).
     
  5. Microedition

    Microedition Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    826
    Аа, а зачем вы между "WinMain" и "hInst" сделали здесь перенос строки?

    надо так:
    Код (Text):
    1. WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    2.     LOCAL wc:WNDCLASSEX      ; создание локальных пеpеменных в стеке
    3.     LOCAL msg:MSG
    4.     LOCAL hwnd:HWND
     
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.360
  7. Alexsz

    Alexsz New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2009
    Сообщения:
    3
    О , спасибо .
    Я пока не совсем адекватен в АСМ чтоб самостоятельно найти ошибку =)

    Дай бог вам здоровечка +)))