Re: FASM Assembler project



Betov wrote:

If you are not familiar with Assembly, this is not
a trivial task to choose, for your first "steps in".

This is true. John's not a complete newbie though. He and I swapped some code examples back and forth, some years ago. He "gets it", IMHO.


One way for doing a port to Assembly of an existing Demo,
is to make use of RosAsm Disassembler-Re-Assembler.

Are you mad??? (nevermind :) I didn't even download the C++ cruft - something like 10M, if I recall... No...


For comparison, here's the Fasm example... at the risk of violating Marcus' copyright...

; +-------------------------------------------+
; | Program ...... FASMCam                    |
; | Author ....... Marcus Araujo              |
; | Description .. this application shows how |
; |                to access webcam via FASM. |
; +-------------------------------------------+


format PE GUI 4.0 entry codestart

include 'win32a.inc'

  IDD_MAIN                     =  100
  WM_CAP_DRIVER_CONNECT        =  WM_USER + 10
  WM_CAP_DRIVER_DISCONNECT     =  WM_USER + 11
  WM_CAP_FILE_SAVEDIB          =  WM_USER + 25
  WM_CAP_SET_PREVIEW           =  WM_USER + 50
  WM_CAP_SET_PREVIEWRATE       =  WM_USER + 52
  WM_CAP_SET_SCALE             =  WM_USER + 53
  ID_START                     =  201
  ID_STOP                      =  202
  ID_CLICK                     =  203
  _camtitle                    db 'FASMWEBCAM'

_filename db 'IMAGE.BMP' ; Filename
nDevice dd 0 ; Device Number -> It can range from 0 through 9
nFPS dd 100 ; Frames per second. Must be 1000/FPS. E.g. 20 FPS = 50


section '.data' data readable writeable
  hInstance     dd ?
  hWebcam       dd ?

section '.code' code readable executable
  codestart:
    invoke  GetModuleHandle, 0
    mov     [hInstance], eax
    invoke  DialogBoxParam, eax, IDD_MAIN, HWND_DESKTOP, MainDlg, 0
    invoke  ExitProcess, 0

proc MainDlg hdlg, msg, wparam, lparam
push ebx esi edi
cmp [msg], WM_INITDIALOG
je .wminitdlg
cmp [msg], WM_COMMAND
je .wmcommand
cmp [msg], WM_CLOSE
je .wmclose
xor eax, eax
jmp .finish
.wminitdlg:
invoke capCreateCaptureWindow, _camtitle, WS_VISIBLE + WS_CHILD, 10, 10,\
266, 252, [hdlg], 0
mov [hWebcam], eax
jmp .finish
.wmcommand:
cmp [wparam], BN_CLICKED shl 16 + ID_START
je .startbutton
cmp [wparam], BN_CLICKED shl 16 + ID_STOP
je .stopbutton
cmp [wparam], BN_CLICKED shl 16 + ID_CLICK
je .clickbutton
.wmclose:
invoke SendMessage, [hWebcam], WM_CAP_DRIVER_DISCONNECT, _camtitle, 0
invoke EndDialog, [hdlg], 0
.finish:
pop edi esi ebx
ret
.startbutton:
invoke SendMessage, [hWebcam], WM_CAP_DRIVER_CONNECT, [nDevice], 0
invoke SendMessage, [hWebcam], WM_CAP_SET_SCALE, TRUE, 0
invoke SendMessage, [hWebcam], WM_CAP_SET_PREVIEWRATE, [nFPS], 0
invoke SendMessage, [hWebcam], WM_CAP_SET_PREVIEW, TRUE, 0
jmp .finish
.stopbutton:
invoke SendMessage, [hWebcam], WM_CAP_DRIVER_DISCONNECT, _camtitle, 0
jmp .finish
.clickbutton:
invoke SendMessage, [hWebcam], WM_CAP_FILE_SAVEDIB, 0, _filename
jmp .finish
endp


section '.idata' import data readable writeable

  library kernel, 'KERNEL32.DLL',\
          user,   'USER32.DLL',\
          avicap, 'AVICAP32.DLL'

  import  kernel,\
          GetModuleHandle,'GetModuleHandleA',\
          ExitProcess,    'ExitProcess'

  import  user,\
          DialogBoxParam, 'DialogBoxParamA',\
          EndDialog,      'EndDialog',\
          SendMessage,    'SendMessageA'

  import  avicap,\
          capCreateCaptureWindow, 'capCreateCaptureWindowA'

section '.rsrc' resource data readable
directory RT_DIALOG, dialogs
resource dialogs,\
IDD_MAIN, LANG_ENGLISH + SUBLANG_DEFAULT, main_dialog
dialog main_dialog, 'FASM Webcam', 0, 0, 190, 200, WS_CAPTION + WS_POPUP + WS_SYSMENU +\


DS_MODALFRAME + DS_CENTER
dialogitem 'BUTTON', 'START', ID_START, 10, 170, 50, 20, WS_VISIBLE + WS_TABSTOP
dialogitem 'BUTTON', 'STOP', ID_STOP, 70, 170, 50, 20, WS_VISIBLE + WS_TABSTOP
dialogitem 'BUTTON', 'CLICK', ID_CLICK, 130, 170, 50, 20, WS_VISIBLE + WS_TABSTOP
enddialog
;----------------------------------


What part of the "assembly language" is going to be too complicated for the newbie? "xor eax, eax"? Looks like interfacing with Windows is the "hard part". That "AVICAP32.DLL" seems to do all the "grunt work". Now disassembling *that* to find out what's "really going on" might be worthwhile... but not really neccessary, to "just call ...".

Do not hope, anyway, that any solution could be achieved
in one day...

I'll bet John could modify that to do something slightly different in "just one day". Getting it to do everything he wants... probably longer... As you say, researching the information is the slow - and unpredictable - part.


Porting it to Linux... if an ".so" equivalent to that ".dll" can be found, no problem. If it has to be done "from scratch", *major* project! If the C++ stuff covers that (which I doubt), it might be worth looking at. Otherwise, I'd say "forget that", and work from Marcus' Fasm example... from the "bottom up"!

Best,
Frank
.



Relevant Pages