Использование С-шных функций под MASM

Тема в разделе "WASM.BEGINNERS", создана пользователем LIKAN, 10 дек 2011.

  1. LIKAN

    LIKAN New Member

    Публикаций:
    0
    Регистрация:
    10 дек 2011
    Сообщения:
    8
    До данного момента использовал тасм и не знал лиха. Но возникла необходимость написания довольно крупной ужасно нудной программы. Где-то краем уха я услышал что в МАСМ можно использовать функцию printf. А теперь собственно вопрос, сильно ли отличается синтаксис, который кушает тасм, от того что нужен масму, есть ли смысл перекраивать уже написанный код, если да, можно ли пример использования этой функции (желательно с форматированной строкой вида "bubu %b bobo", где %b некая переменная)
     
  2. Sholar

    Sholar New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2011
    Сообщения:
    189
    Код который непосредственно не относится к выдиранию функции из сишного рантайма? Его переделывать не нужно. А выдирать Сишные функции можно обычными API`шками LoadLibrary/GetProcessAdress, они на всех ассемблерах одинаковые.
     
  3. LIKAN

    LIKAN New Member

    Публикаций:
    0
    Регистрация:
    10 дек 2011
    Сообщения:
    8
    Господин хороший, я крайне завидую вашей осведомленности и квалификации, но все же.....не зря же я написал свое сообщение в ветку для новичков. К моему величайшему сожалению. мои скудные знания не позволили понять хотя б одно слово. Вы бы ссыль кинули, где можно прочитать о том что подразумевается под словами "выдиранию функции из сишного рантайма", и
    "А выдирать Сишные функции можно обычными API`шками LoadLibrary/GetProcessAdress" ??
     
  4. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    В масмовских инклюдах для CRT все таки полезно наличие деклараций для сишных функций, хотя в случае с scanf и printf эти декларации как раз нахрен не нужны. Ну правда еще удобно наличие invoke.
     
  5. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    LIKAN
    В Масм исполььзование сишных функций элементрано
    Код (Text):
    1. ...
    2. include     msvcrt.inc
    3. includelib  msvcrt.lib
    4.  
    5. ....
    6.  
    7. str  db  'i=%d',0
    8. i     dd  ?
    9.  
    10. ...
    11.  
    12. invoke crt_printf,addr str,i
    13. ...
    То, что руками пришлось бы делать в тасм, за вас уже все сделано в масм. msvcrt.lib - библиотека импорта функций из msvcrt.dll. Макрос invoke реализует команды заталкивания аргументов в стек и вызова функции.
     
  6. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Гуглится же легко
    http://support.microsoft.com/kb/73407/ru
     
  7. LIKAN

    LIKAN New Member

    Публикаций:
    0
    Регистрация:
    10 дек 2011
    Сообщения:
    8
    Да спасибо просветился, ещё один малленький вопрос в том же духе, есть функция sprintf-первый аргумент-буфер в который будет все выводиться, так вот у меня есть только адрес этого буфера в регистре di, сам он объявлен далеко-далеко, как при этом его передать функции при использовании invoke?
     
  8. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Точно также, просто указываете регистр. Фактически макрос invoke будет пытаться сконструировать команды push с указанными параметрами. Дадите сразу константу addr str (offset str) - сконструирует push с константой, дадите регистр - сконструирует push с регистром, главное чтоб по размеру подходило под объявленный прототип.

    Под DOS что-ли пишете? тогда будет ли работать то, что в предыдущих постах было написано - не уверен. Конечно в таком случае никаких DLL и импорта из них нет. Есть ли в масме готовая либа С-функций для 16-битного режима - не знаю. Но думаю, вполне можно воспользоваться либой от какого-либо С/С++ компилятора, умеющего под 16-бит, правда прототипы для функций придется написать вручную, если хочется пользоваться invoke. А если руками вызов делать - тогда смысла переходить с тасма на масм вообще нет.
     
  9. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    LIKAN Только не перепутайте. Ищите именно под ДОС, т.к. в WIN 3.1, 95 и 98-м были таки 16-битные DLL