fasm процедура , трабл

Тема в разделе "WASM.BEGINNERS", создана пользователем 6aHguT, 5 июл 2006.

  1. 6aHguT

    6aHguT New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2005
    Сообщения:
    15
    Вобщем переделываю одну прожку с тасма на фасм процедура имела вид
    Код (Text):
    1. CopyBitMap  PROC hButt:DWORD, hBmp, bWh, bHt
    2.  
    3.     call    GetDC, hButt
    4.     mov     hDC, eax
    5.     Call    CreateCompatibleDC, hDC
    6.     mov     hMemDC, eax
    7.     Call    SelectObject, hMemDC, hBmp
    8.     Call    BitBlt, hDC, 0, 0, bWh, bHt, hMemDC, 0, 0, SRCCOPY
    9.     Call    DeleteDC, hMemDC
    10.     Call    ReleaseDC, hButt, hDC
    11.  
    12.     xor    eax, eax
    13.     ret
    14. CopyBitMap  endp
    стала
    Код (Text):
    1. proc CopyBitMap, hButt, hBmp, bWh, bHt
    2.  
    3.     invoke    GetDC, [hButt]
    4.     mov     [hDC], eax
    5.     invoke    CreateCompatibleDC, hDC
    6.     mov     [hMemDC], eax
    7.     invoke    SelectObject, hMemDC, [hBmp]
    8.     invoke    BitBlt, hDC, 0, 0, [bWh], [bHt], hMemDC, 0, 0, SRCCOPY
    9.     invoke    DeleteDC, hMemDC
    10.     invoke    ReleaseDC, [hButt], hDC
    11.  
    12.     xor    eax, eax
    13.     ret
    14. endp
    Трабл в том что никак немогу к ней обратица.
    Обращаюсь так invoke CopyBitMap, hbutt2, hibutt21, 80, 20(на эту строку есессно ругаеца)
    постоянно ошибка
    Код (Text):
    1. error: operand size not specified.
    2.  
    3. Make error(s) occured.
    4. Total compile time 593 ms
    Я понимаю что на размер операнда ругаеться, но немогу понять в чём проблема, ведь размерность вроде соблюдена
    переменные обьявлены так
    hbutt2 dd 0
    hibutt21 dd 0

    помогите плиз разобраца, первый раз такое :dntknw:
     
  2. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    да, здесь надо вместо invoke использовать stdcall
     
  3. 6aHguT

    6aHguT New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2005
    Сообщения:
    15
    ок пасиб :) заработало. А ктонить вкратце своими словами может сказать почему ? хочеться до сути докопаться что больше на эти грабли не поподаться.
     
  4. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    invoke CopyBitMap делает call [CopyBitMap], так вызываются ф-ции из таблицы импорта, у тебя же ф-ция CopyBitMap собственная (inline), которую можно просто вызвать через call CopyBitMap
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    На фасме вроде можно распознать, что за операнд - память или оффсет. Следствие - можно написать универсальный макрос для вызова функций.

    Кстати, `operand size not specified` - ошибка в макросе, т.к. не получится вызвать функцию через invoke reg.
     
  6. 6aHguT

    6aHguT New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2005
    Сообщения:
    15
    Да это я понял есессно. Я просто фасм тока гдето 5 дней штудирую, до этого тока Delphi и masm поэтому пока слабо ориентируюсь в синтаксисе.
    Вав всем спасиб за разьеснение :)
     
  7. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Кроме того, что нужен stdcall вместо invoke, тут ещё один баг с hDC. Надо так:
    Код (Text):
    1. stdcall CreateCompatibleDC, DWORD [hDC]
    Иначе, вместо DC будет передаваться указатель на DC. Это касается и последующих вызовов SelectObject, BitBlt и т.д.
     
  8. 6aHguT

    6aHguT New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2005
    Сообщения:
    15
    Quantum Спасиб тебе, я понял что я нифига терь незнаю про фасм :dntknw:
    Вообще я хотел попытаться на фасме нанаучиться отрисовывать регионы (музычку заводить научились :) ), и заодно поизучать синтаксис (на собственных ошыбках так сказать).
    Взял понравившийся сорец, какойто французкой тимы (красивый такой примерчик) а он на тасме, да причём ещё под вин 9х . Вот второй день переделываю и стопорнулся.
    Впринципе основное поправил и сабж компилица но нифига неправильно работает, как я теперь понял, что я непонял в каких случаях надо invoke а в каких stdcall использывать. Вобщем цель у меня разобраться с этим примером.

    У меня просба ТУТ--->http://ww2games.net.ru/subj.rar оригинал с сырцами и мой ремэйк (Проект для RadAsm`а) если кто-то не занят помогите хоть подсказками. Где как и что подправить, буду бесконечно признателен.
    Или мож кто примерчик на фасме с регионами подкинет, тогдаб быстрей дело пошло.
    Заранее благодарен.
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    вообще-то, как раз-таки invoke. и dword не нужен.

    автору
    invoke для вызовов импортируемых функций из dll, stdcall для своих.
     
  10. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    2 IceStudent:
    Тьфу. Сам уже начинаю их путать. Да, invoke, а не stdcall. А DWORD нужен. Такой код:
    Код (Text):
    1. push [somedwvalue]
    фасм иногда компилирует в
    push offset somedwvalue, не смотря на скобки. Возможно, это баг последнего билда фасма. Если добавить DWORD, то компилируется как надо.

    Добавил nop перед этим push - собирается правильно и без DWORD. Точно, глюк в последнем фасме.
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Quantum
    Если глюк - отпиши Томашу. А писать обходы для глюков всяких бет - не серьёзно. Лучше использовать стабильные версии.
     
  12. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    А это не бета. Я как-то описывал у них на форуме один мелкий глюк в примере, который до сих пор никто фиксить не собирается.
     
  13. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    нечетные релизы фасма считаются нестабильными
     
  14. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    В логе написано:
    Код (Text):
    1. [-] Improved an instruction searching algorithm a bit.
    Вот из-за чего баг, наверно.

    2 Asterix:
    Об этом где-то официально написано?
     
  15. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Ага
    Я читал на форуме fasm'а, насколько помню пост был Привалова