Как на фасме объявить прототип пользовательской функции

Тема в разделе "WASM.BEGINNERS", создана пользователем assch, 20 сен 2017.

  1. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    208
    Сам я работаю на Масме
    для одной темы изучаю пример на Фасме
    в определённых частях кода мне интересно узнавать какое значение у определённого объекта
    Для этого сделал тандем функций wsprintf и MessageBox
    принцип я думаю всем понятный первая функция переводит значение в текстовый вид
    а вторая банально выводит это значение через месаджбокс
    всё работает нормально но каждый раз ставить этот тандем в нужном месте мягко говоря утомляет
    по этому решил завернуть этот тандем в функцию

    Код (ASM):
    1.  
    2. proc Message Temp
    3. invoke wsprintf,addr pText,'%d',[Temp]
    4. invoke MessageBox,0,addr pText,0,32
    5. ret
    6. endp
    7.  
    и вызывать эту функцию в нужном мне месте

    Код (ASM):
    1.  
    2. invoke Message,eax
    3.  
    но Фасм выводит ошибку - Error: operand size not specified

    Первое что пришло в голову то это то что нужно прописать прототип
    но как это сделать на синтаксисе Фасма я честно говоря не знаю
    просмотрел примеры которые были в комплекте Фасма
    там ни чего подобного я не нашёл

    Подскажите пожалуйста как объявить прототип на Фасме
    или дело совсем в другом
     
  2. njeen

    njeen Active Member

    Публикаций:
    0
    Регистрация:
    26 мар 2017
    Сообщения:
    139
    Адрес:
    Ташлинск
    в fasm , емнип, нет прототипов. Но можно явно указать размерность аргументов в описании процедуры.
    По умолчанию размер аргумента считается равным ширине стека, но можно явно задать размер.
    Например:

    Код (Text):
    1.  
    2. proc myproc,a:BYTE,b:WORD,c:DQWORD
    3.  
    http://asmworld.ru/uchebnyj-kurs/029-makrosy-proc-i-endp/
     
  3. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    208
    Я явно указал размер

    Код (ASM):
    1.  
    2. proc Message,Temp:DWORD
    3. invoke wsprintf,addr pText,'%d',[Temp]
    4. invoke MessageBox,0,addr pText,0,32
    5. ret
    6. endp
    7.  
    но всё равно ошибка всё таже
    значит дело в другом а вот в чём именно ???
     
  4. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    887
    Код (ASM):
    1. proc Message, Temp
    2. ...
    3. endp
    4. ...
    5. stdcall Message, eax
     
    assch и _edge нравится это.
  5. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    208
    Спасибо Thetrik,

    то есть как я понял при вызове пользовательских функций вместо (invoke) нужно писать (stdcall)

    Фасм вроде бы позицианируется как продвинутая платформа
    у вдруг такие сложности
    я честно говоря очень удивлён