Вызов процедуры, ecx==0

Тема в разделе "LANGS.C", создана пользователем _Juicy, 22 авг 2011.

  1. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Процедура получает два аргумента на стеке и ноль в регистре ecx. Стек освобождает вызывающая процедура.
    Вопрос: как правильно определить ее тип для компилятора? __cdecl портит ecx.
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Скорее всего thiscall от майкрософт.
    http://en.wikipedia.org/wiki/X86_calling_conventions - в самом низу 32bit microsoft thiscall.
    Объявить соответственно как метод объекта.
     
  3. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Что-то среднее межну __cdecl и __thiscall :)
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    7mm
    Это и есть thiscall
     
  5. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    А как же про "стек освобождает вызывающая процедура" ?..
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Тогда действительно не то.
     
  7. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Кстати, я бы такую функцию юзал как __cdecl через inline-обёртку, зануляющуюю перед вызовом %ecx.
     
  8. Psionic

    Psionic Member

    Публикаций:
    0
    Регистрация:
    25 сен 2008
    Сообщения:
    156
    Вызывай через __asm вставку, или всетаки подробнее займись есх (в С++ через него передают указатели на обьект класса перед вызовом метода), а вдруг твоя процедура есть метод С++ класса.
     
  9. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Пока два предположения: либо это метод класса с переменным числом аргументов и this==NULL (весселенькое сочетание), либо продукт левого компайлера, для которого такие вызовы - норма.
    Вызываю через асм-вставку.
     
  10. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Возможно это вызов метода объекта через указатель на этот метод. Частенько в таких случаях вызов делается через промежуточную функцию. Объект в этом случае так же передаётся через ecx, но сама функция stdcall.
     
  11. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    А дизасм можно позырить?
     
  12. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    да... и кстати вполне вероятно, что это что-то из библиотеки Boost... например Boost::Bind или Boost::Phoenix... здесь мало телепатов к сожалению...

    ничего криминального, если функция не обращается к элементам класса (NULL + смещение)... даже есть несколько программных паттернов, при которых работа класса зависит от того, был ли экземпляр выделен (на стеке или в куче) или не был...