Создать com файл из си кода с помощью borland 3.1 или 4.5

Тема в разделе "LANGS.C", создана пользователем NoName, 28 ноя 2008.

  1. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Как создать рабочий 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". Собрался. Глючит почему то на элементарных базовых библиотечных функциях :dntknw:
     
  2. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    NoName
    :)
    нет, всегда сначала идет 256-байтовый PSP-блок, после грузится программа
     
  3. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Я имел ввиду сегмент стека :) Печально что нельзя. Придется самой программе туда грузится.
    Я хочу загрузить ком наверх за метр в 64 кб. Это безопасно?
     
  4. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    NoName
    не совсем понял вопроса. В COM: разумеется есть стек; cs=ds=..., т.е. нет сегментирования, поэтому размер проги и ограничен 64кб; sp = 0xfffe, т.е. растет "со дна"; первые 0x100 байи занимает PSP-блок; сама прога загружается после PSP-блока.
     
  5. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    гружу com файл в верхние 64кб, при передачи управления происходит зависон или перезагрузка. psp копирую из родительской программы, в нем меняю ss и sp на правильные, потом:

    Код (Text):
    1.     cli
    2.     mov ax,0FFFFh
    3.     mov ss,ax
    4.     mov sp,ax
    5.     mov ds,ax
    6.     mov es,ax
    7.     mov ax,3
    8.     push word 0
    9.     db 0eah ; from params
    10.     dw 0FFFFh
    11.     dw 100h
    Только заметил что у меня стоит ключ для компилятора bc31 -mc. А надо -mt или (__TINY__). Если так компилировать то вместо справки моя программа выдает кашу, но становиться меньше по размеру на кило. В чем же дело?
     
  6. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Код (Text):
    1.     cli
    2.     mov ax,0FFFFh
    3.     mov ss,ax
    4.     mov sp,ax
    5.     mov ds,ax
    6.     mov es,ax
    7.     mov ax,3
    8.     push word 0
    9.     db 0eah ; from params
    10.     dw 100h
    11.     dw 0FFFFh
    Теперь просто все время перезагружается. Компилирую bc45. Запускаю com и гружу его из файла. Потом сравниваю с помощью memcmp то что записал в 64 кб, говорит что все ок. Потом копирую текущий psp и меняю в нем ss и sp. Потом выполняю код, указанный сверху.
     
  7. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    NoName
    Сначала поясни, что ты хочешь сделать в конечном счете? Прикрепи полный исходник. Пока строчка "mov ax,3" мне непонятно зачем. Где именно происходит ошибка? В отладчике смотрел? (sti после всего этого не забыл, надеюсь?)
     
  8. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    NoName
    Во первых посмотри что у тебя в autoexec.bat, config.sys - в 64к за 1М может находится часть самой ДОС и если ты её просто затираешь, то зависон вполне понятен :)) грузиться в верхние 64к официально можно см. описание к autoexec.bat, config.sys в ДОС, давно этим не занимался подробностей не помню.
     
  9. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Попробовал 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. Дальнейшее обсуждение во второй ветке.