FASM, линковка, invoke SomeAPIfoo, arg1,..., argx

Тема в разделе "WASM.ASSEMBLER", создана пользователем ntdll, 21 сен 2009.

  1. ntdll

    ntdll New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2009
    Сообщения:
    16
    Есть набор функций на fasm'e, эти функции необходимо заюзать в проекте на C. Но проблема в том, что эти функции юзают API в своей работе, а вызываются они макросом invoke.

    Чтоб было понятнее что мне нужно, приведу рабочие тестовые коды.

    Код (Text):
    1. format     MS COFF
    2. include     '%include%\win32ax.inc'
    3.  
    4. public test_proc as '_test_proc@4'
    5.  
    6. extrn '_MessageBoxA@16' as MessageBoxA
    7.  
    8. section '.text' code readable executable
    9.  
    10. proc test_proc, text
    11.      push 0
    12.      push [text]
    13.      push [text]
    14.      push 0
    15.      call MessageBoxA
    16.      ret
    17. endp
    Этот асмокод компилирую, затем получившийся obj линкую (или что делаю?) в lib. ( link -lib ctest.obj ). Созданный ctest.lib несу в студийный проект и компилирую.
    Код (Text):
    1. #include <windows.h>
    2.  
    3. #pragma comment( lib, "ctest" )
    4. #pragma comment( linker, "/ENTRY:WinMain" )
    5.  
    6. extern __stdcall test_proc( char *text );
    7.  
    8. int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) {
    9.     test_proc( "msg" );
    10.     return 0;
    11. }
    Все прекрасно работает, но MessageBox вызывается через переходник jmp dword[xxx]. Мммм... не знаю даже как дальше выразиться то.... Как сделать так, чтобы апи корректно вызывались инструкциями call dword[xxxx]?

    P.S. Вижу только единственный выход - переопределить макрос invoke в аналог stdcall'а.
     
  2. ntdll

    ntdll New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2009
    Сообщения:
    16
    Блин, сорри. Стоило только спросить, как сразу решил проблему
    Код (Text):
    1. format     MS COFF
    2. include     '%include%\win32ax.inc'
    3.  
    4. public test_proc as '_test_proc@4'
    5.  
    6. extrn '__imp__MessageBoxA@16' as MessageBoxA:DWORD
    7.  
    8. section '.text' code readable executable
    9.  
    10. proc test_proc, text
    11.      invoke MessageBoxA, 0, [text], [text], 0
    12.      ret
    13. endp