Как создать рабочий com файл из си кода с помощью borland 3.1 или 4.5. Понятно что есть ограничение на размер 64кб. Стек должен отсутствовать. Я компилирую борландом (не тасм, а си) с помощью ключа -mt (tiny). При сборке через tlink /t он пишет Fatal: .... stack segment present. Как это победить? Спасибо. Есть ли возможность заставить дос грузить com по определенному адресу? Понял что нужно добавлять %BC%\Lib\ct вместо %BC%\Lib\ch и %BC%\Lib\c0t.obj вместо %BC%\Lib\c0h.obj. Теперь еще и ругань на "Cannot generate COM file : segment-relocatable items present in module SUB1632.ASM". Убрал ключевые слова "seg". Собрался. Глючит почему то на элементарных базовых библиотечных функциях
Я имел ввиду сегмент стека Печально что нельзя. Придется самой программе туда грузится. Я хочу загрузить ком наверх за метр в 64 кб. Это безопасно?
NoName не совсем понял вопроса. В COM: разумеется есть стек; cs=ds=..., т.е. нет сегментирования, поэтому размер проги и ограничен 64кб; sp = 0xfffe, т.е. растет "со дна"; первые 0x100 байи занимает PSP-блок; сама прога загружается после PSP-блока.
гружу com файл в верхние 64кб, при передачи управления происходит зависон или перезагрузка. psp копирую из родительской программы, в нем меняю ss и sp на правильные, потом: Код (Text): cli mov ax,0FFFFh mov ss,ax mov sp,ax mov ds,ax mov es,ax mov ax,3 push word 0 db 0eah ; from params dw 0FFFFh dw 100h Только заметил что у меня стоит ключ для компилятора bc31 -mc. А надо -mt или (__TINY__). Если так компилировать то вместо справки моя программа выдает кашу, но становиться меньше по размеру на кило. В чем же дело?
Код (Text): cli mov ax,0FFFFh mov ss,ax mov sp,ax mov ds,ax mov es,ax mov ax,3 push word 0 db 0eah ; from params dw 100h dw 0FFFFh Теперь просто все время перезагружается. Компилирую bc45. Запускаю com и гружу его из файла. Потом сравниваю с помощью memcmp то что записал в 64 кб, говорит что все ок. Потом копирую текущий psp и меняю в нем ss и sp. Потом выполняю код, указанный сверху.
NoName Сначала поясни, что ты хочешь сделать в конечном счете? Прикрепи полный исходник. Пока строчка "mov ax,3" мне непонятно зачем. Где именно происходит ошибка? В отладчике смотрел? (sti после всего этого не забыл, надеюсь?)
NoName Во первых посмотри что у тебя в autoexec.bat, config.sys - в 64к за 1М может находится часть самой ДОС и если ты её просто затираешь, то зависон вполне понятен ) грузиться в верхние 64к официально можно см. описание к autoexec.bat, config.sys в ДОС, давно этим не занимался подробностей не помню.
Попробовал LOADHIGH указвать в autoexec.bat. Хоть грузится не в последние 64 кб, но зато они остаются свободными Я хочу загрузить загрузчик (сейчас это com программа около 20 кб, собираю BC45) так чтобы осталось по максимуму свободного места. Вначале я путался грузить его им же в верхние 64 кб. Теперь видимо в этом нет необходимости (ненужно копировать загрузчик им же) поскольку он грузится через LOADHIGH куда то в 0xF???:0000 (в зависимости от обстоятельств). При этом в config.sys прописано DOS=LOW,UMB на всякий случай. Мне нужно загрузить этим загрузчиком поверх доса (уже так делал в старой версии) определенную самопальную автономную программу. Ей передается вершина свободной памяти и она развлекается с этим . Возврата управления в дос нет. Важно высвободить как можно более большой объем памяти (непрерывный), это обсуждается http://wasm.ru/forum/viewtopic.php?pid=280995#p280995 здесь (WASM.RESEARCH » Вынос первого мегабайта.). Надеюсь что это будет интересно и возможно даже полезно кому то. Зараннее благодарую за ваше внимание, оно для меня очень ценно по этому вопросу. PS. Тему наверное лучше перенести в WASM.ASSEMBLER. Или как то объединить со второй. Спасибо. PPS. Дальнейшее обсуждение во второй ветке.