До данного момента использовал тасм и не знал лиха. Но возникла необходимость написания довольно крупной ужасно нудной программы. Где-то краем уха я услышал что в МАСМ можно использовать функцию printf. А теперь собственно вопрос, сильно ли отличается синтаксис, который кушает тасм, от того что нужен масму, есть ли смысл перекраивать уже написанный код, если да, можно ли пример использования этой функции (желательно с форматированной строкой вида "bubu %b bobo", где %b некая переменная)
Код который непосредственно не относится к выдиранию функции из сишного рантайма? Его переделывать не нужно. А выдирать Сишные функции можно обычными API`шками LoadLibrary/GetProcessAdress, они на всех ассемблерах одинаковые.
Господин хороший, я крайне завидую вашей осведомленности и квалификации, но все же.....не зря же я написал свое сообщение в ветку для новичков. К моему величайшему сожалению. мои скудные знания не позволили понять хотя б одно слово. Вы бы ссыль кинули, где можно прочитать о том что подразумевается под словами "выдиранию функции из сишного рантайма", и "А выдирать Сишные функции можно обычными API`шками LoadLibrary/GetProcessAdress" ??
В масмовских инклюдах для CRT все таки полезно наличие деклараций для сишных функций, хотя в случае с scanf и printf эти декларации как раз нахрен не нужны. Ну правда еще удобно наличие invoke.
LIKAN В Масм исполььзование сишных функций элементрано Код (Text): ... include msvcrt.inc includelib msvcrt.lib .... str db 'i=%d',0 i dd ? ... invoke crt_printf,addr str,i ... То, что руками пришлось бы делать в тасм, за вас уже все сделано в масм. msvcrt.lib - библиотека импорта функций из msvcrt.dll. Макрос invoke реализует команды заталкивания аргументов в стек и вызова функции.
Да спасибо просветился, ещё один малленький вопрос в том же духе, есть функция sprintf-первый аргумент-буфер в который будет все выводиться, так вот у меня есть только адрес этого буфера в регистре di, сам он объявлен далеко-далеко, как при этом его передать функции при использовании invoke?
Точно также, просто указываете регистр. Фактически макрос invoke будет пытаться сконструировать команды push с указанными параметрами. Дадите сразу константу addr str (offset str) - сконструирует push с константой, дадите регистр - сконструирует push с регистром, главное чтоб по размеру подходило под объявленный прототип. Под DOS что-ли пишете? тогда будет ли работать то, что в предыдущих постах было написано - не уверен. Конечно в таком случае никаких DLL и импорта из них нет. Есть ли в масме готовая либа С-функций для 16-битного режима - не знаю. Но думаю, вполне можно воспользоваться либой от какого-либо С/С++ компилятора, умеющего под 16-бит, правда прототипы для функций придется написать вручную, если хочется пользоваться invoke. А если руками вызов делать - тогда смысла переходить с тасма на масм вообще нет.