Возвращаемое значение ДЛЛ

Тема в разделе "WASM.BEGINNERS", создана пользователем _vi_, 2 фев 2007.

  1. _vi_

    _vi_ Денис

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    48
    Посмотрел примеры ДЛЛ на ФАСМ. понятно все кроме одного :) - куда кидать вазвращаемое значение, в EAX ?? (API функции вроде в него пишуть)
     
  2. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    То, что ты возвратишь системе в еах - это важно для системы. В твою программу это значение не вернётся при LoadLibrary, если ты про это.
     
  3. _vi_

    _vi_ Денис

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    48
    а что тогда возвращает команда ret , если не значение ЕАХ в программу?
     
  4. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    После ret управление передаётся в kernel32, а уже потом обратно в программу. Включай отладчик и всё увидишь.
     
  5. _vi_

    _vi_ Денис

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    48
    ок. щя найду куда положил ollydrbug и посмотрю
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    _vi_
    ret ничего никуда не возвращает. ret просто делает pop eip и всё. Т.к. при этом значение аккумулятора и других регистров не меняется, их свободно можно использовать в качестве значения возврата. Обычно значения до 8 бит возвращаются в al, до 16 - в ax, до 32 - в eax, до 64 - в eax:edx, но никто не мешает использовать другие регистры, стек, глобальные переменные, флаги, изобретать собственные соглашения вызова и т.д. Короче, куда вы положите возвращаемое значение, там оно и будет лежать до востребования вызывающим кодом или пока кто-то другой его случайно или намеренно не перезапишет.
     
  7. P_F

    P_F New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2006
    Сообщения:
    116
    Адрес:
    Russia
    1) если речь о точке входа в DLL (DLLmain и т.д. и т.п.) то в eax, это уйдёт в систему, и
    в некотором эквиваленте(смысловом) ты получишь это значение от системы в результате LoadLibrary.
    2) если о системных каллбэк функах то смотрим надлежащий прототип (дефолт в eax)
    3) если это твоя собственная функа то суй туда куда хочешь (хоть в стэк (с оговорками
    конечно :) )) , главное не запутаться когда вызывать будешь...
    3.1) если предпологаешь юзать либу на языке, кроме асма, смотри спецификации
    вызовов поддержываемых языком, выбирай и реализуй в соответствии...

    [rewrited] Опередили...
     
  8. _vi_

    _vi_ Денис

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    48
    в самую точку... бинго ка говориться :)
    а язык то VB )))
    и пишу я функцию memset как в сях , а возвращать она должна указатель на область памяти
    , почему не на ВБ сразу - а чтоб быстрее работало ))
    вот только что накатал, по ламерски но приятно ))
    Код (Text):
    1. format PE GUI 4.0 DLL
    2. entry DllEntryPoint
    3. include 'include\win32a.inc'
    4.  
    5. section '.code' code readable executable
    6.  
    7. proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
    8.         mov     eax,TRUE
    9.         ret
    10. endp
    11. proc memset s,c,n
    12. mov s, byte [c]
    13. mov cx, [n-1]
    14. loop_main:
    15. jcxz m
    16. mov s+1 , byte [c]
    17. jmp loop_main
    18. m:
    19. mov eax, s
    20. ret
    21. endp
    22.  
    23. section '.edata' export data readable
    24. export 'fun.DLL',\
    25.          memset,'memset'
    26.  
    27. section '.reloc' fixups data discardable
     
  9. P_F

    P_F New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2006
    Сообщения:
    116
    Адрес:
    Russia
    ну тога ещё могу сказать что для С
    под win32 макрос proc генерит то что в совмещении с
    объявляется как _stdcall
    наиболее частый вариант
     
  10. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    _vi_
    VB до 6й версии поддерживает исключительно stdcall (значение возвращается через eax, а стек должна чистить сама функция). Мой ImpLib SDK позволяет обойти это ограничение, но это отдельная тема из серии издевательств над линкером VB. Более новые версии поддерживают и другие соглашения.
     
  11. _vi_

    _vi_ Денис

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    48
    у мя ваще 5-й проблем не знаю и почемуто очень к нему привязан ))
     
  12. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    _vi_
    А у меня есть 4й, который вместе с первым оффисом распространялся под Windows 3.1. Так что не надо хвастаться ;)
     
  13. _vi_

    _vi_ Денис

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    48
    DDDD насмешил, респект
    посмотри код выше плз, венет он мне указатель или нет , хотя скомпилю и проверю D
     
  14. _vi_

    _vi_ Денис

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    48
    ой , яж в адрес значение кидаю ппц DD
     
  15. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Нууууу... Ты не пробовал это компилировать? :) Я бы не рискнул. В общем, так правильнее:
    Код (Text):
    1. mov al, BYTE [c]
    2. mov ecx, DWORD [n]
    3. mov edx, DWORD [s]
    4. jecxz loop_end
    5. loop_main:
    6. mov BYTE [edx], al
    7. inc edx
    8. dec ecx
    9. jnz loop_main
    10. loop_end:
    11. mov eax, DWORD [s]
    12. ret
     
  16. _vi_

    _vi_ Денис

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    48
    спасибки ) все работает, мне ещеучиться и учиться ))