Как использовать fasm.dll?

Тема в разделе "WASM.BEGINNERS", создана пользователем _sheva740, 18 фев 2011.

  1. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Вопрос по использованию fasm_dll из http://wasm.ru/forum/viewtopic.php?id=25969&p=12
    Как его юзать?
    Что я делаю не правильно?
    В папке "C:\_temp\fdll\"
    файлы
    Код (Text):
    1. -fdll.asm
    2. -hello.asm
    3. -fasm.dll
    Содержание "hello.asm":

    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4.   include 'c:\fasmw\include\win32a.inc'
    5.  
    6. section '.main' code readable writeable executable
    7. str_ db "Hi! I'm the example program!","Win32 Assembly",13,10,0
    8. start:
    9.     invoke  MessageBox,0,str_,0,0
    10.     invoke  ExitProcess,0
    11. section '.idata' import data readable writeable
    12.  
    13.   library kernel32, 'KERNEL32.DLL',\
    14.         user32, 'USER32.dll'
    15.  
    16.   include 'c:\fasmw\include\APIA\kernel32.inc'
    17.   include 'c:\fasmw\include\APIA\user32.inc'
    Содержание fdll.asm :

    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap :none
    4.  
    5. include \masm32\include\windows.inc
    6.  
    7. include \masm32\include\masm32.inc
    8. include \masm32\include\kernel32.inc
    9. include \masm32\include\user32.inc
    10.  
    11. includelib \masm32\lib\masm32.lib
    12. includelib \masm32\lib\kernel32.lib
    13. includelib \masm32\lib\user32.lib
    14.  
    15. .data
    16.     LibName     db "fasm.dll",0
    17.     FileName        db "C:\_temp\fdll\hello.asm",0
    18.     FunctionName    db "fasm_Assemble",0
    19.     DllNotFound db "Cannot load library",0
    20.     FunctionNotFound    db "fasm_Assemble function not found",0
    21. .data?
    22.     hLib        dd ?
    23.     fasm_AssembleAddr   dd ?
    24.     AllocMem        dd ?   
    25. .code
    26. ;----------------------------------------------------------------
    27. start:
    28.         invoke LoadLibrary,addr LibName
    29.         .if eax==NULL
    30.                 invoke StdOut,addr DllNotFound
    31.         .else
    32.                 mov hLib,eax
    33.                 invoke GetProcAddress,hLib,addr FunctionName
    34.                 .if eax==NULL
    35.                         invoke StdOut,addr FunctionNotFound
    36.                 .else
    37.         mov fasm_AssembleAddr,eax
    38.  
    39.         push    4096
    40.         push    0
    41.  
    42.         call    GlobalAlloc
    43.         mov AllocMem,eax
    44. ;========================================================================
    45.         push    0       ;hDisplayPipe: должен быть 0
    46.         push    100h        ;nPassesLimit: 100 по умолчанию
    47.         push    4096        ;cbMemorySize: sizeof(output buffer)
    48.         lea eax,AllocMem
    49.         push    eax     ;lpMemory: указатель на output buffer
    50.         push    offset FileName ;lpSource: строка с asm (fasm синтаксис) заканчивается "0"
    51.  
    52.         call    [fasm_AssembleAddr]
    53. ;========================================================================
    54. ;lea esi,AllocMem
    55. ;int 3
    56.         invoke GlobalFree,AllocMem
    57.  
    58.                 .endif
    59.                 invoke FreeLibrary,hLib
    60.         .endif
    61.         invoke ExitProcess,NULL
    62. end start
    В буфере AllocMem ожидаю хексы MZ начала откомпилированного hello.exe?
    Или я не прав?
    Подскажите как Вы его (fasm.dll) используете?
    Где у ошибка?
    Спасибо.
     
  2. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    Не пользовался этой либой.
    Скорей всего вместо
    надо push AllocMem.
     
  3. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    s_d_f
    Да не, все равно не то ((
    Мож я чего-то не того жду.
    Может ее как-то по другому используют?
     
  4. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    Еще эта строка
    Противоречие. lpSource - подразумевается сам исходник в память загруженый, а не имя файла.
    Возможно он как раз имя файла и пытается ассемблировать.
     
  5. SmanxX1

    SmanxX1 Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    139
    Именно.
    Содержимое самому подгружать.

    И я думаю стоило бы сначала посмотреть на пример, который идет в комплекте. ;)
     
  6. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    s_d_f
    Вот проверил
    Содержание fdll.asm :
     
  7. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    секунду, ошибся )))
     
  8. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Вот к примеру все вроде как надо:
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap :none
    4.  
    5. include \masm32\include\windows.inc
    6.  
    7. include \masm32\include\masm32.inc
    8. include \masm32\include\kernel32.inc
    9. include \masm32\include\user32.inc
    10.  
    11. includelib \masm32\lib\masm32.lib
    12. includelib \masm32\lib\kernel32.lib
    13. includelib \masm32\lib\user32.lib
    14. .data
    15.     LibName     db "C:\_temp\fdll\fasm.dll",0
    16.     FileName        db "C:\_temp\fdll\hello.asm",0
    17.     FunctionName    db "fasm_Assemble",0
    18.     DllNotFound db "Cannot load library",0
    19.     FunctionNotFound    db "fasm_Assemble function not found",0
    20. .data?
    21.     hLib        dd ?
    22.     fasm_AssembleAddr   dd ?
    23.     AllocMem        dd ?
    24.     AllocMem_for_asm_file   dd ?
    25.     hFile       dd ?
    26.     dwFsize     dd ?
    27.     VarBuff     db 0
    28. .code
    29. start:
    30. ;=======================================================================================
    31.     invoke CreateFile,addr FileName,\
    32.             GENERIC_WRITE or GENERIC_READ ,\;
    33.             FILE_SHARE_READ or FILE_SHARE_WRITE,\;
    34.             NULL,\
    35.             OPEN_EXISTING,\
    36.             FILE_ATTRIBUTE_NORMAL,\
    37.             NULL   
    38.     .if EAX == INVALID_HANDLE_VALUE
    39.         jmp error
    40.     .endif
    41.     mov hFile, eax
    42.  
    43.     xor eax,eax
    44.     invoke  GetFileSize, hFile, NULL
    45.     mov word ptr [dwFsize], ax
    46.  
    47.  
    48.     push    dwFsize
    49.     push    GMEM_FIXED OR GMEM_ZEROINIT
    50.     call    GlobalAlloc
    51.  
    52.     mov AllocMem_for_asm_file, EAX
    53.  
    54.  
    55.     lea eax, offset VarBuff
    56.     push    NULL
    57.     push    eax
    58.     push    dwFsize
    59.     push    AllocMem_for_asm_file
    60.     push    hFile
    61.     call    ReadFile
    62.     .IF  eax==0
    63.         jmp error
    64.     .ENDIF
    65. ;mov edi,AllocMem_for_asm_file
    66. ;int 3
    67.  
    68.     invoke  LoadLibrary,addr LibName
    69.     .if eax==NULL
    70.         invoke  StdOut,addr DllNotFound
    71.     .else
    72.         mov hLib,eax
    73.         invoke  GetProcAddress,hLib,addr FunctionName
    74.         .if eax==NULL
    75.             invoke  StdOut,addr FunctionNotFound
    76.         .else
    77.         mov fasm_AssembleAddr,eax
    78.  
    79.         push    4096
    80.         push    0
    81.         call    GlobalAlloc
    82.         mov AllocMem,eax
    83. ;========================================================================
    84.         push    0       ;hDisplayPipe: can be zero
    85.         push    100     ;nPassesLimit: thats 100 by default
    86.         push    4096        ;cbMemorySize: sizeof(output buffer)
    87.         push    AllocMem        ;lpMemory: output buffer
    88.         push    AllocMem_for_asm_file
    89.         call    [fasm_AssembleAddr]
    90. ;========================================================================
    91. lea edi,AllocMem
    92. int 3
    93.     error:  invoke GlobalFree,AllocMem
    94.         invoke CloseHandle,hFile
    95.         invoke GlobalFree,AllocMem_for_asm_file    
    96.  
    97.                 .endif
    98.                 invoke FreeLibrary,hLib
    99.         .endif
    100.         invoke ExitProcess,NULL
    101. end start
    lea edi,AllocMem
    int 3 ----------> указывает на
    Код (Text):
    1. 00403088  B8 40 14 00 78 2F 14 00 E8 07 00 00 38 07 00 00  ё@.x/.и..8..
    2. 00403098  38 07                                            8
    Так это че оно и есть ? Или я опять напутал?
     
  9. SmanxX1

    SmanxX1 Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    139
    В AllocMem будет сначала находиться FASM_STATE.

    И раз уж тебе надо из файла все грузить, то есть fasm_AssembleFile для этого.
     
  10. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    SmanxX1
    Если не жалко брось пример применения.
    Или мой подскажи что не так.
    В инете не нашел примеров.
    Спасибо.
     
  11. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
  12. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
  13. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    http://board.flatassembler.net/topic.php?t=12105
    - пример применения
     
  14. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    GoldFinch
    дай тебе боже здоровья.
    )))