Как из процедуры вернуть значение (Flat assembler)

Тема в разделе "WASM.BEGINNERS", создана пользователем gershkovich, 23 фев 2006.

  1. gershkovich

    gershkovich New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2006
    Сообщения:
    97
    Всем привет.



    Объясните пжл как получить возвращаемое значение из процедуры?



    Скажем я вызываю виндовую функцию ShellExecute.

    В хелпе написано что она возвращает error code.

    А как его получить??



    вот как его вызываю:
    Код (Text):
    1.  
    2. proc MY_SHELL_EXECUTE hWnd, lpOperation, lpFile, lpParameters, lpDirectory, nShowCmd
    3.         invoke  ShellExecute, [hWnd], [lpOperation], [lpFile], [lpParameters], [lpDirectory], [nShowCmd]
    4.         stdcall ShowErrorMessage,[hWnd],eax
    5.         ret
    6. endp
    7.  




    Т.е. мне надо получить error code из ShellExecute, и вернуть его из MY_SHELL_EXECUTE дальше наверх.



    Если значение передается через стек, то надо ли отслеживать такую ситуацию ?? Т.е. типа доставть его оттудава?

    Использую Flat assembler.



    Буду весьма признателен за статьи и примеры о Flat assembler. А то у меня тока его ПДФ который вместе с ним.
     
  2. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Из процедуры возвращается то, что на момент возврата (выполнения инструкции ret) находится в eax. Это общепринятая практика. Возможны частные случаи возвращения через другие регистры, например ecx, edx - когда надо вернуть более одного параметра и не хватает регистра eax.

    Все апи возвращают результат в eax. Т.е. в твоем случае ShellExecute возвращает error code в eax. Вот его и нужно иметь в eax перед ret.

    ShowErrorMessage наверняка запортит этот код, поэтому его нужно сохранить, например в стеке, и перед самым возвратом из стека положить обратно в eax.


    Код (Text):
    1. proc MY_SHELL_EXECUTE hWnd, lpOperation, lpFile, lpParameters, lpDirectory, nShowCmd
    2.         invoke  ShellExecute, [hWnd], [lpOperation], [lpFile], [lpParameters], [lpDirectory], [nShowCmd]
    3.         push    eax        ;сохранение кода от ShellExecute
    4.         stdcall ShowErrorMessage,[hWnd],eax
    5.         pop     eax        ;восстановление кода и его возврат из процедуры
    6.         ret
    7. endp




    В вызывающей процедуре результат будет по-прежнему в eax



    О примерах: не на ту лошадь поставил :)

    Переходи на масм, практически все примеры на нем написаны.
     
  3. gershkovich

    gershkovich New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2006
    Сообщения:
    97
    Спасибо cresta!

    Просто и доступно объяснил.



    Если позволишь спрошу тебя нащет MASM.

    Где его взять?

    На этом сайте он как-бы есть, но в комментах

    я прочитал, что это на самом деле не MASM, а патч к патчу, или что-то в этом роде.



    Где родной сайт MASM-а. И, надеюсь, он бесплатный ?
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Тут был масм когда-то, но его заменили на какой-то сервиспак.

    А вообще он есть на http://www.masm32.com/

    В пакете с ним же идёт куча примеров, справка, кое-какие утилиты. Естественно бесплатный :)

    Синтаксис чуть-чуть другой, пока не втянулся в фасм, тебе легко будет перейти
     
  5. gershkovich

    gershkovich New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2006
    Сообщения:
    97
    Еще раз тебе Спасибо!