|
Программирование >> Перегруженные имена функций и идентификаторы
wcl386 /l=dos4gw hello.c - для DOS4GW Я написал простейшую программку, а она внезапно повисает, или генерирует сообщение о переполнении стека, что делать? В то же время когда я компилирую эту программку другим компилятором - все работает нормально? Желательно сразу после установки поправить файлики WLSYSTEM.LNK, поставив требуемый размер стека, по умолчанию там стоит 1 ии 2 Кб, чего явно недостаточно для программ, создающих пусть даже небольшие объекты на стеке. Для большинства применений достаточно размера стека в 16 или 32 килобайта. Если вы работаете под экстендером, можно поставить туда хоть мегабайт. Я столкнулся с тем, что Ватком ставит знак подчеркивания не в начало имени, а в конец, к чему бы это? Положение знака подчеркивания говорит о способе передачи параметров в данную функцию, если его нет совсем, параметры передаются через регистры, если сзади - через стек. Я написал подпрограмму на ассемблере, со знаком подчеркивания спереди, а Ватком ищет то же имя, но со знаком сзади, как это поправить? Можно написать: #pragma aux ASMFUNC * ; и описывать все свои функции как: #pragma aux (ASMFUNC) foo; #pragma aux (ASMFUNC) bar; Причем, есть специальное значение - символ , который сигнализирует, что имя надо преобразовать в верхний регистр, например: #pragma aux myfunc ; приведет к появлению в объектном файе сс1лки на MYFUNC . Есть библиотека, исходники которой отсутствуют, как заставить Ватком правильно понимать имена функций и ставить знак спереди а не сзади? Нужно в файле заголовка описать данные функции как cdecl, при этом параметры будут передаваться через стек и имя функции будет сформировано правильно. Как сделать так, чтобы в некоторых случаях Watcom передавал параметры не через регистры, а через стек? Использовать cdecl. Например: extern void cdecl dummy( int ); Как делать ассемблерные вставки в программу? Примерно так: unsigned short swap bytes ( unsigned short word ); #pragma aux swap bytes = xchg ah, al \ parm [ ax ] \ value [ ax ]; Слово parm определяет в каком регистре вы передаете значение, слово value - в каком возвращаете. Можно использовать метки. Есть слово modify - можно указать что ваша вставка (или функция) не использует память, а трогает только те или иные регистры. От этого оптимизатору лучше жить. Прототип не обязателен, но если есть, то компилер проверяет типы. Надо слепить задачу под графику, но нужны окошки и мышь. Тащить ли ZINC 3.5, или в графике описать что-нибудь свое. Может, под Ватком что-то есть более мощное и готовое? Ничего лучше Зинки пока нет. Тащите лучше Зинку 4.0, она вроде под Ватком лучше заточена. При написании некоторых функций по видео-режимах вдруг захотелось мне сотворить динамические библиотеки. Есть мысля генерить exe-файл а затем грузить его. Что делать? Использовать DOS4GW/PRO. Он вроде поддерживает DLL. Или пользоваться PharLap TNT, он тоже поддерживает. Грузить экзешник тоже можно, но муторно. Через DPMI аллоцируете сегмент (сегменты) делаете из них код и данные, читаете экзешник и засовываете код и данные из него в эти сегменты. Лучше использовать TNT. Графическая библиотека Ваткома отказывается переключать режимы/банки или делает это криво. Что делать? В результате ковыряния в библиотеке выяснилось, что криворукие ваткомовцы совершенно не задумываются ни о какой переносимости и универсальности их библиотек. В результате, если видео-карта имеет в биосе прошитое имя производителя или другую информацию о нем, то для нее будет вызываться вместо функции переключения банков через VESA, другая функция, работающая с картой напрямую (иногда даже через порты). Единственная проблема, что у каждого производителя рано или поздно выходят новые и продвинутые карты, раскладка портов в которых может отличаться от той, которая использовалась в старых моделях. В результате, все это свинство начинает глючить и иногда даже виснуть. После того, как вы руками заткнете ему возможность использовать родные фишки для конкретной карты и пропишите пользоваться только VESA - все будет работать как из пушки. Как затыкать - а просто, есть переменная: SVGAType, которая описывается следующим образом: extern C int SVGAType; , и потом перед (важно!) вызовом setvideomode нужно сказать: SVGAType = 1; Как руками слинковать exe-файл? Командой WLINK, указав параметры. name ... system ... debug all option ... option ... option ... file ... file ... libpath ... library ... Например: wlink name myprog system dos4gw debug all file myprog Что такое ms2vlink и зачем она нужна? Это для тех кто переходит с мелкософтовского Си. Преобразователь команд LINK в WLINK.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |