Вобщем переделываю одну прожку с тасма на фасм процедура имела вид Код (Text): CopyBitMap PROC hButt:DWORD, hBmp, bWh, bHt call GetDC, hButt mov hDC, eax Call CreateCompatibleDC, hDC mov hMemDC, eax Call SelectObject, hMemDC, hBmp Call BitBlt, hDC, 0, 0, bWh, bHt, hMemDC, 0, 0, SRCCOPY Call DeleteDC, hMemDC Call ReleaseDC, hButt, hDC xor eax, eax ret CopyBitMap endp стала Код (Text): proc CopyBitMap, hButt, hBmp, bWh, bHt invoke GetDC, [hButt] mov [hDC], eax invoke CreateCompatibleDC, hDC mov [hMemDC], eax invoke SelectObject, hMemDC, [hBmp] invoke BitBlt, hDC, 0, 0, [bWh], [bHt], hMemDC, 0, 0, SRCCOPY invoke DeleteDC, hMemDC invoke ReleaseDC, [hButt], hDC xor eax, eax ret endp Трабл в том что никак немогу к ней обратица. Обращаюсь так invoke CopyBitMap, hbutt2, hibutt21, 80, 20(на эту строку есессно ругаеца) постоянно ошибка Код (Text): error: operand size not specified. Make error(s) occured. Total compile time 593 ms Я понимаю что на размер операнда ругаеться, но немогу понять в чём проблема, ведь размерность вроде соблюдена переменные обьявлены так hbutt2 dd 0 hibutt21 dd 0 помогите плиз разобраца, первый раз такое
ок пасиб заработало. А ктонить вкратце своими словами может сказать почему ? хочеться до сути докопаться что больше на эти грабли не поподаться.
invoke CopyBitMap делает call [CopyBitMap], так вызываются ф-ции из таблицы импорта, у тебя же ф-ция CopyBitMap собственная (inline), которую можно просто вызвать через call CopyBitMap
На фасме вроде можно распознать, что за операнд - память или оффсет. Следствие - можно написать универсальный макрос для вызова функций. Кстати, `operand size not specified` - ошибка в макросе, т.к. не получится вызвать функцию через invoke reg.
Да это я понял есессно. Я просто фасм тока гдето 5 дней штудирую, до этого тока Delphi и masm поэтому пока слабо ориентируюсь в синтаксисе. Вав всем спасиб за разьеснение
Кроме того, что нужен stdcall вместо invoke, тут ещё один баг с hDC. Надо так: Код (Text): stdcall CreateCompatibleDC, DWORD [hDC] Иначе, вместо DC будет передаваться указатель на DC. Это касается и последующих вызовов SelectObject, BitBlt и т.д.
Quantum Спасиб тебе, я понял что я нифига терь незнаю про фасм Вообще я хотел попытаться на фасме нанаучиться отрисовывать регионы (музычку заводить научились ), и заодно поизучать синтаксис (на собственных ошыбках так сказать). Взял понравившийся сорец, какойто французкой тимы (красивый такой примерчик) а он на тасме, да причём ещё под вин 9х . Вот второй день переделываю и стопорнулся. Впринципе основное поправил и сабж компилица но нифига неправильно работает, как я теперь понял, что я непонял в каких случаях надо invoke а в каких stdcall использывать. Вобщем цель у меня разобраться с этим примером. У меня просба ТУТ--->http://ww2games.net.ru/subj.rar оригинал с сырцами и мой ремэйк (Проект для RadAsm`а) если кто-то не занят помогите хоть подсказками. Где как и что подправить, буду бесконечно признателен. Или мож кто примерчик на фасме с регионами подкинет, тогдаб быстрей дело пошло. Заранее благодарен.
вообще-то, как раз-таки invoke. и dword не нужен. автору invoke для вызовов импортируемых функций из dll, stdcall для своих.
2 IceStudent: Тьфу. Сам уже начинаю их путать. Да, invoke, а не stdcall. А DWORD нужен. Такой код: Код (Text): push [somedwvalue] фасм иногда компилирует в push offset somedwvalue, не смотря на скобки. Возможно, это баг последнего билда фасма. Если добавить DWORD, то компилируется как надо. Добавил nop перед этим push - собирается правильно и без DWORD. Точно, глюк в последнем фасме.
Quantum Если глюк - отпиши Томашу. А писать обходы для глюков всяких бет - не серьёзно. Лучше использовать стабильные версии.
А это не бета. Я как-то описывал у них на форуме один мелкий глюк в примере, который до сих пор никто фиксить не собирается.
В логе написано: Код (Text): [-] Improved an instruction searching algorithm a bit. Вот из-за чего баг, наверно. 2 Asterix: Об этом где-то официально написано?