Из FASMa в MASM

Тема в разделе "WASM.BEGINNERS", создана пользователем bizdon, 13 окт 2010.

  1. bizdon

    bizdon Member

    Публикаций:
    0
    Регистрация:
    7 апр 2009
    Сообщения:
    86
    здравствуйте!
    помогите, пожалуйста, отловить ошибку:

    код на fasm:
    Код (Text):
    1. ; +-------------------------------------------+
    2. ; | Program ...... FASMCam                    |
    3. ; | Author ....... Marcus Araujo              |
    4. ; | Description .. this application shows how |
    5. ; |                to access webcam via FASM. |
    6. ; +-------------------------------------------+
    7.  
    8.  
    9. format PE GUI 4.0
    10. entry codestart
    11.  
    12. include 'C:\fasm\INCLUDE\win32a.inc'
    13.  
    14.   IDD_MAIN                     =  100
    15.   WM_CAP_DRIVER_CONNECT        =  WM_USER + 10
    16.   WM_CAP_DRIVER_DISCONNECT     =  WM_USER + 11
    17.   WM_CAP_FILE_SAVEDIB          =  WM_USER + 25
    18.   WM_CAP_SET_PREVIEW           =  WM_USER + 50
    19.   WM_CAP_SET_PREVIEWRATE       =  WM_USER + 52
    20.   WM_CAP_SET_SCALE             =  WM_USER + 53
    21.   ID_START                     =  201
    22.   ID_STOP                      =  202
    23.   ID_CLICK                     =  203
    24.   _camtitle                    db 'FASMWEBCAM'
    25.  
    26.   _filename  db 'IMAGE.BMP'    ; Filename
    27.   nDevice    dd   0            ; Device Number -> It can range from 0 through 9
    28.   nFPS       dd 100            ; Frames per second. Must be 1000/FPS. E.g. 20 FPS = 50
    29.  
    30. section '.data' data readable writeable
    31.   hInstance     dd ?
    32.   hWebcam       dd ?
    33.  
    34. section '.code' code readable executable
    35.   codestart:
    36.     invoke  GetModuleHandle, 0
    37.     mov     [hInstance], eax
    38.     invoke  DialogBoxParam, eax, IDD_MAIN, HWND_DESKTOP, MainDlg, 0
    39.     invoke  ExitProcess, 0
    40.  
    41.   proc MainDlg hdlg, msg, wparam, lparam
    42.     push    ebx esi edi
    43.     cmp     [msg], WM_INITDIALOG
    44.     je      .wminitdlg
    45.     cmp     [msg], WM_COMMAND
    46.     je      .wmcommand
    47.     cmp     [msg], WM_CLOSE
    48.     je      .wmclose
    49.     xor     eax, eax
    50.     jmp     .finish
    51.     .wminitdlg:
    52.       invoke  capCreateCaptureWindow, _camtitle, WS_VISIBLE + WS_CHILD, 10, 10,\
    53.                                         266, 252, [hdlg], 0
    54.       mov     [hWebcam], eax
    55.       jmp     .finish
    56.     .wmcommand:
    57.       cmp     [wparam], BN_CLICKED shl 16 + ID_START
    58.       je      .startbutton
    59.       cmp     [wparam], BN_CLICKED shl 16 + ID_STOP
    60.       je      .stopbutton
    61.       cmp     [wparam], BN_CLICKED shl 16 + ID_CLICK
    62.       je      .clickbutton
    63.     .wmclose:
    64.       invoke  SendMessage, [hWebcam], WM_CAP_DRIVER_DISCONNECT, _camtitle, 0
    65.       invoke  EndDialog, [hdlg], 0
    66.     .finish:
    67.       pop     edi esi ebx
    68.       ret
    69.     .startbutton:
    70.       invoke  SendMessage,  [hWebcam], WM_CAP_DRIVER_CONNECT, [nDevice], 0
    71.       invoke  SendMessage,  [hWebcam], WM_CAP_SET_SCALE, TRUE, 0
    72.       invoke  SendMessage,  [hWebcam], WM_CAP_SET_PREVIEWRATE, [nFPS], 0
    73.       invoke  SendMessage,  [hWebcam], WM_CAP_SET_PREVIEW, TRUE, 0
    74.       jmp     .finish
    75.     .stopbutton:
    76.       invoke  SendMessage, [hWebcam], WM_CAP_DRIVER_DISCONNECT, _camtitle, 0
    77.       jmp     .finish
    78.     .clickbutton:
    79.       invoke  SendMessage, [hWebcam], WM_CAP_FILE_SAVEDIB, 0, _filename
    80.       jmp     .finish
    81.   endp
    82.  
    83. section '.idata' import data readable writeable
    84.  
    85.   library kernel, 'KERNEL32.DLL',\
    86.           user,   'USER32.DLL',\
    87.           avicap, 'AVICAP32.DLL'
    88.  
    89.   import  kernel,\
    90.           GetModuleHandle,'GetModuleHandleA',\
    91.           ExitProcess,    'ExitProcess'
    92.  
    93.   import  user,\
    94.           DialogBoxParam, 'DialogBoxParamA',\
    95.           EndDialog,      'EndDialog',\
    96.           SendMessage,    'SendMessageA'
    97.  
    98.   import  avicap,\
    99.           capCreateCaptureWindow, 'capCreateCaptureWindowA'
    100.  
    101. section '.rsrc' resource data readable
    102.   directory     RT_DIALOG, dialogs
    103.   resource      dialogs,\
    104.                 IDD_MAIN, LANG_ENGLISH + SUBLANG_DEFAULT, main_dialog
    105.   dialog        main_dialog, 'FASM Webcam', 0, 0, 190, 200, WS_CAPTION + WS_POPUP + WS_SYSMENU +\
    106.                                                             DS_MODALFRAME + DS_CENTER
    107.                 dialogitem 'BUTTON', 'START', ID_START,  10, 170, 50, 20, WS_VISIBLE + WS_TABSTOP
    108.                 dialogitem 'BUTTON', 'STOP',  ID_STOP,   70, 170, 50, 20, WS_VISIBLE + WS_TABSTOP
    109.                 dialogitem 'BUTTON', 'CLICK', ID_CLICK, 130, 170, 50, 20, WS_VISIBLE + WS_TABSTOP
    110.   enddialog
    код на masm:
    Код (Text):
    1.             .386
    2.             .model  flat,stdcall
    3.             option  casemap:none
    4. ; --------------- Includes
    5.             include \masm32\include\windows.inc
    6.             include \masm32\include\kernel32.inc
    7.             include \masm32\include\user32.inc
    8.             include \masm32\include\gdi32.inc
    9.             include \masm32\include\vfw32.inc
    10.             include \masm32\include\comdlg32.inc
    11.             include \masm32\include\advapi32.inc
    12. ; --------------- Libraries
    13.             includelib \masm32\lib\kernel32.lib
    14.             includelib \masm32\lib\user32.lib
    15.             includelib \masm32\lib\gdi32.lib
    16.             includelib \masm32\lib\vfw32.lib
    17.             includelib  \masm32\include\comdlg32.lib
    18.             includelib  \masm32\include\advapi32.lib
    19. plgproc PROTO:DWORD,:DWORD,:DWORD,:DWORD
    20. .const
    21.   webcam equ 1000
    22.   star equ 1001
    23.   stop equ 1002
    24.   click equ 1003
    25.   WM_CAP_DRIVER_CONNECT        =  WM_USER + 10
    26.   WM_CAP_DRIVER_DISCONNECT     =  WM_USER + 11
    27.   WM_CAP_FILE_SAVEDIB          =  WM_USER + 25
    28.   WM_CAP_SET_PREVIEW           =  WM_USER + 50
    29.   WM_CAP_SET_PREVIEWRATE       =  WM_USER + 52
    30.   WM_CAP_SET_SCALE             =  WM_USER + 53
    31.  
    32.             .data
    33. camtitle db "masmcam",0
    34. filename db "image.bmp",0
    35. ndevice dd 0
    36. nfps dd 100
    37. dlgmame db "webcam",0
    38.     .data?
    39. hInstance dd ?
    40. hWebcam dd ?
    41.  
    42. ; --------------- Code section
    43.                     .code
    44. start:  
    45.                
    46. invoke GetModuleHandle,0
    47. mov hInstance,eax
    48. invoke DialogBoxParam, hInstance,1000,0,addr plgproc,0 
    49. invoke  ExitProcess,0
    50.  
    51. plgproc proc hwnd:HWND,umsg:UINT, wparam:WPARAM,lparam:LPARAM
    52.  
    53.     .if umsg==WM_INITDIALOG
    54.  
    55. ;ЗДЕСЬ ОШИБКА В СЛЕДУЮЩЕЙ СТРОКЕ!, Всё компилируется, exe создается, но не запускается.  Функция capCreateCaptureWindow не находит vfw32.dll (файл есть, (прога на fasm работает),
    56. ;в папку с программой vfw32.dll клал) В файле vfw32.inc её импорт прописан.
    57.  
    58. invoke capCreateCaptureWindow,addr camtitle,WS_VISIBLE + WS_CHILD,10,10,266,252,addr hwnd,0
    59.  
    60.     .elseif umsg==WM_CLOSE
    61.     invoke EndDialog, hwnd,NULL
    62.            
    63.     .else
    64.     mov eax,0
    65.     ret
    66.     .endif
    67. mov eax,1
    68. ret
    69. plgproc endp
    70.  
    71. ;файл ресурсов
    72. comment ' my_cam.rc
    73. #define webcam 1000
    74. #define star 1001
    75. #define click 1003
    76. #define stop 1002
    77.  
    78. webcam DIALOGEX 10,10,264,171
    79. CAPTION "IDD_DLG"
    80. FONT 8,"MS Sans Serif",0,0,0
    81. LANGUAGE 9,1
    82. STYLE 0x10CF0000
    83. BEGIN
    84.   CONTROL "START",star,"Button",0x50010000,18,108,60,30
    85.   CONTROL "CLICK",click,"Button",0x50010000,186,108,60,30
    86.   CONTROL "STOP",stop,"Button",0x50010000,96,111,60,30
    87. END
    88. '
    89. end start
     
  2. bizdon

    bizdon Member

    Публикаций:
    0
    Регистрация:
    7 апр 2009
    Сообщения:
    86
    по всей видимости ошибка в vfw32.lib(69.8 кб) из поставки masm32,
    так как заменив её на версию из поставки Peles (vfw32.lib -30.3 кб), всё заработало.
    fasm как-то импортирует функцию capCreateCaptureWindow из avicap32.dll...
    в аттаче рабочие asm., rc., exe.
     
  3. bizdon

    bizdon Member

    Публикаций:
    0
    Регистрация:
    7 апр 2009
    Сообщения:
    86
    с вашей помощью, товарищи, продолжу искать ответы на пути постижения asma:

    1. почему некоторые исходники (например, тот который выше в аттаче my_cam.rar) не хотят компилиться с флешки? (возникает ошибка, описанная в #1 )
    2. где найти файл ObjMem32.lib, который должен быть в составе ObjAsm32 (v.4.1) ? (его там нет, а без него не компилятся примеры)
    3. где (как) найти описания функций, входящих в библиотеки в C:\masm32\lib ? (я так понимаю, что они не все из MDSN, но и из С, и ещё откуда-то)
    4. как fasm линкует без lib?
    5. можно (и нужно ли?) приспособить сишные .lib ы (про .dll читал, что сложно, но можно. А из сишной .lib при помощи inc2l.exe создать .inc не получилось) к masm32 или в msvcrt.lib (и других/ каких? либах из C:\masm32\lib) уже все сишные функции есть?
     
  4. bizdon

    bizdon Member

    Публикаций:
    0
    Регистрация:
    7 апр 2009
    Сообщения:
    86
    50 человек просмотрело пост и никто ничего не знает? Может, вопросы слишком сложные, объёмные или глупые?
     
  5. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    Такие вопросы обычно самостоятельно разрешаются.
    И вопрос должен быть интересным иначе возможно никто и не ответит.
     
  6. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.582
    Дабы не плодить много новых тем, спрошу здесь. Подскажите пожалуйста, почему не конвертируется фасм в масм? В чем может быть ошибка?
    FASM code:
    MASM code:
    Файл компилируется, но не показывает msgbox c требуемым текстом. В чем ошибка? Жирным шрифтом я выделил возможно проблемные места - то, что не до конца знаю в Фасм, может быть я криво конвертировал это в Масм.
     
  7. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    261
    >Invoke InternetReadFile,eax,addr FileBuffer,128,BytesRead
    offset BytesRead нужно
    >mov eax,offset BytesRead
    mov eax, dword ptr [BytesRead]
    больше не смотрел
    dword [](FASM) = dword ptr [](MASM)
    variable(FASM) = offset variable(MASM)
     
  8. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.582
    Treant супер. Спасибо вам большое, все сработало, как надо.
     
  9. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.582
    Подскажите еще пожалуйста, как перевести с Фасм в Масм такое:
    Код (Text):
    1. .....
    2. stdcall  WIRandom,5,20
    3. ......
    4. proc   WIRandom rmin:dword,rmax:dword
    Т.е. идет вызов процедуры, которой передается два параметры.
    На Масме - я пробовал прописывать прототип в секции .data как
    Код (Text):
    1. WIRandom PROTO :DWORD,:DWORD
    А потом
    Код (Text):
    1. push offset rmax
    2. push offset rmin
    3. call WIRandom
    4.  
    5. WIRandom PROC
    Но все равно не работает. В чем может быть причина? Ошибка - conflicting parametr definition
     
  10. Blackbeam

    Blackbeam New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    960
    invoke WIRandom bla, bla
     
  11. Blackbeam

    Blackbeam New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    960
     
  12. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.582
    Blackbeam, не работает, та же ошибка что и при call. эти инклуды у меня есть.
    Изменил процедуру на
    Код (Text):
    1. WIRandom PROC rmin:DWORD,rmax:DWORD
    - все равно не работает ничего.