создал DLL, есть проблемы со стеком

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

  1. test896

    test896 New Member

    Публикаций:
    0
    Регистрация:
    8 апр 2009
    Сообщения:
    132
    Привет! Всем !
    есть вопросы к опытным людям, вот исходник
    ;;;;;;;прога
    format PE CONSOLE
    entry start
    include 'c:\fasm\include\win32a.inc'

    section '.data' data readable writable
    clens db 'type.dll',0
    ccc dd 0
    fun db 'Type',0
    dll_ dd 0
    section '.code' code readable executable

    start:
    invoke LoadLibrary, clens
    mov [ccc],eax
    cmp eax,0
    je exit

    invoke GetProcAddress, [ccc], fun
    cmp eax,0
    je exit
    mov [dll_],eax

    stdcall [dll_], clens, 11

    invoke FreeLibrary, [ccc]

    exit:
    invoke ExitProcess, 0

    section '.idata' import data readable writeable
    library kernel32,'KERNEL32.DLL'
    include 'c:\fasm\include\api\kernel32.inc'

    ;;;;библиотека
    format PE GUI 4.0 DLL
    entry DllEntryPoint
    include 'c:\fasm\include\win32a.inc'
    section '.data' data readable writable
    A DD 0
    section '.text' code readable executable

    proc DllEntryPoint hinstDLL, fdwReason, lpvReserved
    mov eax,TRUE
    ret
    endp

    proc Type, A:dword
    ; сюда FASM вставляет push ebp
    ; mov ebp,esp

    INT3
    mov eax,[A]

    RET;;;;так возврат не работает , нужно сделать лишний pop eax, ret , тогда выход работает корректно


    endp

    section '.edata' export data readable
    export 'type.DLL',\
    Type,'Type'

    section '.reloc' fixups data discardable


    Подскажите что не так делаю .
    какой win32a??.inc использовать ?

    ЗБ спасибо
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    ага.
    1. у функции type 1 параметр, а передаешь 2.
    2. если ищешь такие простые ошибки, то почему бы не отказаться от макросов.
     
  3. test896

    test896 New Member

    Публикаций:
    0
    Регистрация:
    8 апр 2009
    Сообщения:
    132
    Если вообще параметры убрать то все нормально, FASM не вставляет строки и ret работает верно,
    как передать параметры тогда в функцию?
     
  4. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    да так и передавай. Просто в прототипе функции укажи два параметра:
     
  5. test896

    test896 New Member

    Публикаций:
    0
    Регистрация:
    8 апр 2009
    Сообщения:
    132
    MSoft
    спасибо пробывал,ты скажи вызов будет такой
    stdcall [addres procedure], A, B

    ?
     
  6. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Наверное да. С фасмом я не сильно дружу
     
  7. test896

    test896 New Member

    Публикаций:
    0
    Регистрация:
    8 апр 2009
    Сообщения:
    132
    MSoft
    ясн, а на чем пишешь ? MASM или TASM
     
  8. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    вообще если из фасма уберешь все эти макросы, то тебе все станет сразу понятно. начинать изучать лучше без этих приколов, а уже потом можешь и макросы поюзать.
    лучше сделай так
    push B
    push A
    call [addres procedure]
     
  9. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    раньше масм, щас на си перешел :)
     
  10. test896

    test896 New Member

    Публикаций:
    0
    Регистрация:
    8 апр 2009
    Сообщения:
    132
    А мне Visual С++ друг подарил недавно, пока не дошел до нее
     
  11. test896

    test896 New Member

    Публикаций:
    0
    Регистрация:
    8 апр 2009
    Сообщения:
    132
    Разобрался, через стек не получается передать параметры, тогда выход через регистор
     
  12. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    а когда параметров будет 10?
     
  13. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    MSoft
    глобальные переменные?
     
  14. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    просто надо сначала учиться писать без макросредств, а уже потом применять эту белиберду.
    почему для понимания (тем более такой простой программы) не написать
    Код (Text):
    1. entry:
    2. push MB_OK or MB_ICONINFORMATION
    3. push dll_name
    4. push msg_text
    5. mov eax, 1
    6. ret 12
    7.  
    8. ; par2 at [ebp+16] - flags
    9. ; par1 at [ebp+12] - text
    10. ; par0 at [ebp+08] - string
    11. proc1:
    12. push ebp
    13. mov ebp, esp
    14. push dword [ebp+16]
    15. push dword [ebp+12]
    16. push dword [ebp+08]
    17. push HWND_DESKTOP ; 0
    18. call [MessageBoxW]
    19. mov esp, ebp
    20. pop ebp
    21. ret 12
    22.  
    23. dll_name  du 'test.dll',0
    24. msg_text du 'hello world',0
    и уже разобравшись свернуть это до 8 строчек (не считая пустых)
     
  15. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Честно говоря не вижу смысла в макросах в ассемблере, вижу смысл в хорошем компиляторе си ) ну и вставках не ассемблере )
     
  16. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    бггг :))
     
  17. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Да хоть 10, при чем тут глобальные переменные? Надо писать функции с минимумом параметров, блин. В КриэйтВиндоу передается туева хуча, хотя реально надо а) имя окна, б) размер окна. Стили большей частью одни и те же, дополнительные стили одни и те же. Если надо передать 10 параметров, надо задуматься а) не стоит ли сделать эти параметры структурой, б) не разбить ли функциональность функции на 2-3 менее сложных функции?
     
  18. test896

    test896 New Member

    Публикаций:
    0
    Регистрация:
    8 апр 2009
    Сообщения:
    132
    Будете смеяться!
    Нашел причину , вот она

    RET - так не работает
    ret - так работает

    я в шоке
     
  19. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    да, уж лучше кодить на си, нежели на ассемблере с макросами.

    а вот некоторые даже считают, что invoke - это инструкция процессора, а про существование
    esp, ebp, push, pop даже не догадываются.
     
  20. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    test896
    И на поиск ошибки ушла неделя, что можно было сделать за секунды, открыв код в отладчике..